1
0
Fork 0
scripts-admin-quickndirty-p.../oldies/script_suppression-utilisateur.sh

201 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."