Outils pour utilisateurs

Outils du site


linux:scripts_bash:exemples:mailboxesmanager

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