====== mailBoxesManager ====== #!/bin/bash # script pour ajouter/modifier/supprimer les users postfix et le chemin de leur boite virtuelle # le chemin construit est toujours sur la base $BOXESBASE/domaine.tld/user # pour un cas particulier (un user qui met ses mails dans la boite d'un autre), éditer à la main $POSTFIXBOXES POSTFIXBOXES=/etc/postfix/virtual/user_mailboxes_path BOXESBASE=/home/mail 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 user@domaine.tld # remove" echo " $(basename $0) -a user@domaine.tld # add" echo " $(basename $0) -l # list" echo "Pour lister, ajouter ou supprimer une boite virtuelle postfix de $POSTFIXBOXES." echo "La suppression est effective dans $POSTFIXBOXES mais n'entraîne pas la suppression des mails de $BOXESBASE/domaine.tld/user/" exit 1 } function rebuild() { $POSTMAP $POSTFIXBOXES [ $? -ne 0 ] && echo "'$POSTMAP $POSTFIXBOXES' a échoué" && exit 1 echo "'$POSTMAP $POSTFIXBOXES' 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 user dom boite, reordonnes en dom user boite s/[ \t]//g; # on vire espaces et tabs s/###/ /g; # on remet une espace comme separateur ' < $POSTFIXBOXES |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]" $POSTFIXBOXES` if [ $nb -lt 1 ] then echo "$1 n'existe pas dans $POSTFIXBOXES" exit 1 else if [ $nb -gt 1 ] then echo "Il y avait $nb $1 dans $POSTFIXBOXES ! On les supprime tous." fi sed -i -e "/^$1[ \t]/d" $POSTFIXBOXES nb=`grep -c "^$1[ \t]" $POSTFIXBOXES` if [ $nb -ne 0 ] then echo "La suppression a échoué, il reste $nb entrée(s) de $1 dans $POSTFIXBOXES" exit 1 else echo "Alias $1 supprimé de $POSTFIXBOXES" rebuild fi fi } function addBox() { # pas de test si $1 OK (normalement fait dans main) # il faudrait tester que $1 est une adresse valide nb=`grep -c "^$1[ \t]" $POSTFIXBOXES` if [ $nb -eq 1 ] then # le compte existe echo "Il y a déjà un user $1 dans $POSTFIXBOXES" exit 1 else if [ $nb -gt 1 ] then echo "ATTENTION, il y a plusieurs entrées $1 dans $POSTFIXBOXES" echo "IL FAUT Y FAIRE DU MENAGE MANUELLEMENT !" exit 1 fi # on decoupe $1 pos=`expr index $1 '@'` dom=${1:$pos} user=${1:0:((pos-1))} echo "$1 $dom/$user/" >> $POSTFIXBOXES [ $? -ne 0 ] && echo "L'ajout de la boite de $1 dans $POSTFIXBOXES a échoué :-(" && exit 1 echo "Boite de $1 ajoutée à la fin de $POSTFIXBOXES" rebuild exit 0 fi } # MAIN # test fichier de conf [ ! -w $POSTFIXBOXES ] && echo "$POSTFIXBOXES n'est pas accessible en écriture ! Abandon..." && exit 1 # check des options remove=0 userAdress='' while getopts "lr:a:" OPTION do case $OPTION in l ) list;; r ) remove=1; userAdress=$OPTARG;; a ) userAdress=$OPTARG;; * ) usage;; esac done # et les actions if [ $remove -eq 1 ] then [ -n "$userAdress" ] && remove $userAdress echo "Vous devez spécifier une adresse à supprimer" usage exit 1 else [ -z "$userAdress" ] && echo "Vous devez spécifier une adresse à ajouter." && usage && exit 1 addBox $userAdress fi