====== mailAliasManager ====== #!/bin/bash # script pour ajouter/modifier/supprimer un alias postfix POSTFIXALIASES=/etc/postfix/conf.d/virtual_aliases POSTMAP=/usr/sbin/postmap POSTRELOAD='/etc/init.d/postfix reload' # les fonctions ne retournent rien pour pouvoir les enchainer avec && ou || sans risque dans le main # toutes les fonctions comportent donc un exit function usage() { echo "usage: $(basename $0) -r -a userAlias@domaine.tld # remove" echo " $(basename $0) -a userAlias@domaine.tld -t user@domaine.tld # add/change" echo " $(basename $0) -l # list" echo "Pour lister, ajouter ou modifier un alias postfix dans $POSTFIXALIASES." exit 1 } function rebuild() { $POSTMAP $POSTFIXALIASES [ $? -ne 0 ] && echo "'$POSTMAP $POSTFIXALIASES' a échoué" && exit 1 echo "'$POSTMAP $POSTFIXALIASES' effectué" $POSTRELOAD [ $? -ne 0 ] && echo "'$POSTRELOAD' a échoué" && exit 1 echo "$POSTRELOAD OK" exit 0 } function list() { # on prepare 3 champs avec sed (### est le separateur provisoire) # que l'on passe à awk pour affichage sed -e '/[ \t]*#/d; /^[ \t]*$/d; s/#.*//; # on vire commentaires et lignes vides s/^\([^@]*\)@\([^ \t]*\)[ \t]*\(.*\)$/\2###\1###\3/; # on recupère nos 3 champs alias dom forwards, reordonnes en dom alias forwards s/[ \t]//g; # on vire espaces et tabs s/###/ /g; # on remet une espace comme separateur ' < $POSTFIXALIASES |sort |awk 'BEGIN {lastdom = "null"} {dom=$1; if (dom != lastdom) {lastdom=dom; print "\n## " dom " ##"}; print $2 " => " $3}' exit 0 } function remove() { nb=`grep -c "^$1[ \t]" $POSTFIXALIASES` if [ $nb -lt 1 ] then echo "$1 n'existe pas dans $POSTFIXALIASES" exit 1 else if [ $nb -gt 1 ] then echo "Il y avait $nb $1 dans $POSTFIXALIASES ! On les supprime tous." fi sed -i -e "/^$1[ \t]/d" $POSTFIXALIASES nb=`grep -c "^$1[ \t]" $POSTFIXALIASES` if [ $nb -ne 0 ] then echo "La suppression a échoué, il reste $nb entrée(s) de $1 dans $POSTFIXALIASES" exit 1 else echo "Alias $1 supprimé de $POSTFIXALIASES" rebuild fi fi } function addAlias() { # pas de test si $1 et $2 OK (normalement fait dans main) # il faudrait tester que $1 est une adresse valide, et que $2 est une liste d'adresses valides # la fct s'appelle addAlias, mais elle remplace si existant nb=`grep -c "^$1[ \t]" $POSTFIXALIASES` if [ $nb -eq 1 ] then # si le compte existe, on substitue plutôt que effacer/ajouter (au cas où ajout plante, et ça conserve l'ordre) oldDest="`sed -ne "s/^$1[ \t]\(.*\)/\1/p" $POSTFIXALIASES`" sed -i -e "s/^$1.*/$1 $2/" $POSTFIXALIASES [ $? -ne 0 ] && echo "Le changement des destinataires de $1 a échoué" && exit 1 echo "L'alias $1 a été modifié pour pointer vers $2 dans $POSTFIXALIASES" echo "Il pointait auparavant sur $oldDest" rebuild exit 0 # sert à rien car exit dans rebuild, au cas où ;-) else if [ $nb -gt 1 ] then echo "Il y avait $nb entrées pour $1 dans $POSTFIXALIASES, on les supprime." sed -i -e "/^$1/d" $POSTFIXALIASES [ $? -ne 0 ] && echo "La suppression des multiples alias $1 a échoué" && exit 1 fi echo "$1 $2" >> $POSTFIXALIASES [ $? -ne 0 ] && echo "L'ajout de l'alias $1 (vers $2) dans $POSTFIXALIASES a échoué :-(" && exit 1 echo "alias $1 vers $2 ajouté à la fin de $POSTFIXALIASES" rebuild exit 0 fi } # MAIN # test fichier de conf [ ! -w $POSTFIXALIASES ] && echo "$POSTFIXALIASES n'est pas accessible en écriture ! Abandon..." && exit 1 # check des options remove=0 mailAlias='' mailTo='' while getopts "lra:t:" OPTION do case $OPTION in l ) list;; r ) remove=1;; a ) mailAlias=$OPTARG;; t ) mailTo=$OPTARG;; * ) usage;; esac done # et les actions if [ $remove -eq 1 ] then [ -n "$mailAlias" ] && remove $mailAlias echo "Vous devez spécifier un alias à supprimer" usage exit 1 else [ -z "$mailAlias" ] && echo "Vous devez spécifier un alias." && usage && exit 1 [ -z "$mailTo" ] && echo "Vous devez spécifier un destinataire de l'alias." && usage && exit 1 addAlias $mailAlias $mailTo fi