mailUserPassManager

Ce script demanderait des améliorations (notamment le contrôle de la validité de l'adresse entrée), mais il suffit à mes besoins et j'ai eu la flemme de finir “proprement”.

#!/bin/bash
# script pour ajouter/modifier/supprimer un couple user/pass de dovecot
 
USERSDOVCONF=/etc/postfix/dovecot/users.conf
DOVPW=/usr/sbin/dovecotpw
 
function usage() {
  echo "usage: $(basename $0) [-r] -u user@domaine.tld"
  echo "Cela va ajouter ou modifier le mot de passe de user@domaine.tld dans $USERSDOVCONF."
  echo "Pour supprimer un compte, utiliser -r."
  exit 1
}
 
function remove() {
  # cette fonction ne doit rien retourner !
  # il faut en sortir avec exit
  # sinon (retour != 0) chgpass sera appele par main (OK pas très clean ;-)
  nb=`grep -c "^$1:" $USERSDOVCONF`
  if [ $nb -lt 1 ]
  then
    echo "$1 n'existe pas dans $USERSDOVCONF"
    exit 1
  else
    if [ $nb -gt 1 ]
    then
      echo "Il y avait $nb $1 dans $USERSDOVCONF ! On les supprime tous."
    fi
    sed -i -e "/^${1}:/d" $USERSDOVCONF
    nb=`grep -c "^$1:" $USERSDOVCONF`
    if [ $nb -ne 0 ]
    then
      echo "La suppression a échoué, il reste $nb entrée(s) de $1 dans $USERSDOVCONF"
      exit 1
    else
      echo "$1 supprimé de $USERSDOVCONF"
      exit 0
    fi
  fi
}
 
function askpass() {
  echo "Entrez le nouveau mot de passe :"
  read rep
  echo "Confirmez ce nouveau mot de passe :"
  read rep2
  if [ "$rep" != "$rep2" ]
  then
    echo "Les mots de passe sont différents !"
    exit 1
  fi
  chgpass $1 $rep # $1 pas testé
}
 
function chgpass() {
  # pas de test si $1 et $2 OK
  # il faudrait tester que $1 est une adresse valide
  # et que le domaine est dans les virtual_domains de postfix
  if [ -x /usr/sbin/dovecotpw ] 
  then
    # si le compte existe, on substitue plutôt que effacer/ajouter (au cas où ajout plante, et ça conserve l'ordre)
    nb=`grep -c "^$1:" $USERSDOVCONF`
    if [ $nb -eq 1 ]
    then
      sed -i -e "s/^${1}:.*/$1:`dovecotpw -p $2`/" $USERSDOVCONF
      [ $? -ne 0 ] && echo "Le changement de mot de passe a échoué" && exit 1
    else
      if [ $nb -gt 1 ]
      then
        echo "Il y avait $nb entrées pour $1 dans $USERSDOVCONF, on les supprime."
      fi
      echo "$1:`dovecotpw -p $2`" >> $USERSDOVCONF
      [ $? -ne 0 ] && echo "L'ajout du mot de passe de $1 dans $USERSDOVCONF a échoué :-(" && exit 1
      echo "Mot de passe de $1 ajouté à la fin de $USERSDOVCONF"
      exit 0
    fi
  else
    echo "$DOVPW n'est pas exécutable !"
    exit 1
  fi
}
 
# MAIN
# test fichier de conf
[ ! -w $USERSDOVCONF ] && echo "$USERSDOVCONF n'est pas accessible en écriture ! Abandon..." && exit 1
 
# check des options
remove=0
user=''
while getopts "ru:" OPTION
do
  case "${OPTION}" in
      r ) remove=1;;
      u ) user=$OPTARG;;
      * ) usage;;
  esac
done
 
# et les actions
if [ "$user" != '' ]
then
  [ $remove -eq 1 ] && remove $user || askpass $user
else
  usage
fi