200 lines
5.1 KiB
Bash
Executable file
200 lines
5.1 KiB
Bash
Executable file
#!/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 <<EOF
|
|
$0 [-f] login
|
|
$0 -h
|
|
|
|
-f : mode bourrin, ne pose pas de questions.
|
|
EOF
|
|
}
|
|
|
|
terminaison() {
|
|
if [ "$1" = "" ] || [ "$1" -eq 0 ]; then
|
|
rm -f "$LOGFILE"
|
|
RETOUR=0
|
|
else
|
|
if [ -s "$LOGFILE" ]; then
|
|
printf "NOTICE: log dispo : %s\n" "$LOGFILE" >&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 <<EOF >&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 <<EOF | perl -MCyrus::IMAP::Admin
|
|
# Connexion
|
|
my \$conn = Cyrus::IMAP::Admin->new('$CYRUS_HOST') or die "Echec de connexion.";
|
|
|
|
# Lecture du fichier de configuration
|
|
open CONFIG, '$CONFIG_IDENTIFIANTS_CYRUS';
|
|
while (<CONFIG>) {
|
|
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."
|