Outils pour utilisateurs

Outils du site


linux:scripts_bash:exemples:mailaliasmanager

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
linux/scripts_bash/exemples/mailaliasmanager.txt · Dernière modification : 29/05/2008 12:49 de 127.0.0.1