#!/bin/sh # Ce script aide à la suppression d'un compte LDAP # Il s'occupe : # - suppression LDAP/SMB # - désabonnement aux listes d'emails (salaries@example.net, ...) # - destruction de la boîte Cyrus # # Ce script nécessite : # - des identifiants admin sur les listes emails (utilisation des identifiants smbldap pour l'instant. Pas glop.) # - des identifiants admin sur Cyrus. Ces identifiants seront contenus dans le fichier $CONFIG_IDENTIFIANTS_CYRUS, au format : # user=LOGIN # password=PASS # # TODO: meilleure détection quand l'email n'existe pas. # Config LDAP_HOST="ldap.example.net" LDAP_ROOT="dc=example,dc=net" CYRUS_HOST="messagerie.example.net" CONFIG_EMAIL_DOMAIN="example.net" CONFIG_IDENTIFIANTS_SMBLDAP="/etc/smbldap-tools/smbldap_bind.conf" CONFIG_IDENTIFIANTS_CYRUS="/root/.cyrus_auth" # Initialisation des variables "globales" MODE_INTERACTIF="1" LOGFILE=$( mktemp ) # Fonctions # affiche le message d'aide usage() { cat <&2 else rm -f "$LOGFILE" fi RETOUR="$1" fi exit "$RETOUR" } check_login() { # Vérifie que le login existe # Si aucun argument fourni, exit test -n "$1" || return 1 # Vérification que le login (=uid LDAP) existe if [ $( ldapsearch -x -h "$LDAP_HOST" -b "ou=users,$LDAP_ROOT" -LLL "uid=$1" | grep -c "^dn: " ) -eq 0 ]; then echo "ERREUR: login inexistant." >&2 return 1 fi } # Enfin : le code... # gestion des options de lancement while getopts fh f; do case $f in 'f') MODE_INTERACTIF=0 ;; 'h') usage terminaison 0 ;; \?) usage >&2 terminaison 1 ;; esac done shift $( expr $OPTIND - 1 ) LOGIN="$1" # Petite vérif. while ! check_login "$LOGIN"; do # En mode "bourrin", on gicle direct. if [ "$LOGIN" != "" ] && [ "$MODE_INTERACTIF" -eq 0 ]; then terminaison 1 fi # Sinon, on demande poliment printf "Login : "; read LOGIN done # Récupération de l'email RACINE_EMAIL=$( ldapsearch -x -h "$LDAP_HOST" -b "ou=users,$LDAP_ROOT" -LLL "(uid=$LOGIN)" mailLocalAddress | sed -n 's/^mailLocalAddress: //p' ) if [ "$RACINE_EMAIL" = "" ]; then echo "ERREUR: impossible de retrouver l'adresse e-mail." >&2 terminaison 1 fi EMAIL="$RACINE_EMAIL@$CONFIG_EMAIL_DOMAIN" # 1ere étape : Suppression du compte avec smbldap-userdel echo "Suppression du compte dans LDAP... (éviter le Ctrl-C à partir de maintenant)" if ! smbldap-userdel "$LOGIN"; then echo "ERREUR: smbldap-userdel a renvoyé une erreur. Arrêt du script $0." >&2 return 1 fi echo "Compte LDAP supprimé." echo # 2ème étape : Suppression de l'adresse e-mail des mailing-lists printf "Suppression de l'e-mail %s de toutes les mailing-lists...\n" "$EMAIL" if ! ./script_ml-gestion-abonne.sh -r ALL "$EMAIL"; then cat <&2 NOTICE: apparemment, il y a eu un pépin à la gestion des mailing-lists. Le compte est supprimé, donc l'utilisateur ne peut plus consulter ses mails mais sa boîte peut néanmoins en recevoir. On on vous laisse vous débrouiller avec ./script_ml-gestion-abonne.sh ou PHPLDAPAdmin. EOF fi echo # 3ème étape : suppression de la boîte mail dans Cyrus # # Tout se fait via un script Perl parce que les outils d'admin # de Cyrus sont pas franchement faciles à scripter... # # En mode non-bourrin, on demande une confirmation de la destruction. if [ "$MODE_INTERACTIF" -eq 1 ]; then printf "Supprimer la boîte mail dans Cyrus ? (O/n)" read TMP if [ -n "$TMP" ] && [ $( echo "$TMP" | egrep -ic "^o$" ) -eq 0 ]; then echo "Ah bon ?! Ben à la prochaine alors." >&2 return 0 fi fi printf "Suppression de la boîte user.%s dans Cyrus.\n" "$RACINE_EMAIL" cat <new('$CYRUS_HOST') or die "Echec de connexion."; # Lecture du fichier de configuration open CONFIG, '$CONFIG_IDENTIFIANTS_CYRUS'; while () { chomp; # no newline s/^#.*//; # no comments s/^\s+//; # no leading white s/\s+$//; # no trailing white next unless length; # anything left? my (\$var, \$value) = split(/\s*=\s*/, \$_, 2); \$cyrus_config{\$var} = \$value; } # Authentification \$conn->authenticate( "-user" => \$cyrus_config{'user'}, "-password" => \$cyrus_config{'password'}, "-mechanism" => 'LOGIN', ) or die "Echec à l'authentification."; # On se donne les droits pour supprimer la boîte mail \$conn->setacl('user.$RACINE_EMAIL',\$cyrus_config{'user'},"c") or die "Erreur dans la gestion des ACLs."; if ( \$conn->error ) { die "Erreur dans la gestion des ACLS."; } # Destruction de la boîte \$conn->delete('user.$RACINE_EMAIL') or die "Erreur à la destruction de la boîte mail."; if ( \$conn->error ) { die "Erreur à la suppression de la boîte."; } EOF if [ "$?" -eq 0 ]; then echo "Boîte supprimée." else echo "ERREUR: erreur à la destruction de la boîte. C'était la dernière étape, voir avec Cyrus. Abandon." >&2 return 1 fi echo echo "Fin du script."