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

243 lines
7.1 KiB
Bash
Executable file

#!/bin/sh
# Ce script aide à la création d'un compte LDAP
# Il s'occupe :
# - création LDAP/SMB
# - mot de passe
# - création de la boîte Cyrus
# - ajout aux listes d'emails (salaries@example.net, ...)
# 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
# Config
LDAP_HOST="ldap.example.net"
LDAP_ROOT="dc=example,dc=net"
CYRUS_HOST="messagerie.example.net"
CONFIG_EMAIL_DOMAIN="example.net"
CONFIG_DEFAULT_GID=513
CONFIG_DEFAULT_QUOTA=1048576
CONFIG_IDENTIFIANTS_SMBLDAP="/etc/smbldap-tools/smbldap_bind.conf"
CONFIG_IDENTIFIANTS_CYRUS="/root/.cyrus_auth"
# Petite mise en bouche
cat <<EOF
Script de création d'un compte utilisateur dans l'annuaire LDAP et
dans Cyrus (IMAP/POP3), puis d'inscription aux mailing-lists.
Dernière modification : 2010-09-30 (chl)
(interruption possible via Ctrl-C)
EOF
# Fonctions (désolé pour la lisibilité, 'faut les définir au-dessus des appels)
check_string() {
# Vérifie que la chaîne ne contient pas "trop" de caractères
# spéciaux (accepte accents, espaces et tirets)
# TODO
test "$1" != ""
}
check_email() {
# Vérifie la syntaxe et l'unicité de l'adresse e-mail
# Recherche dans LDAP d'une adresse identique
RACINE_EMAIL=$( echo "$1" | sed 's/@.*//g' )
if [ $( ldapsearch -x -h "$LDAP_HOST" -b "ou=users,$LDAP_ROOT" -LLL "mailLocalAddress=$RACINE_EMAIL" | grep -c "^dn: " ) -gt 0 ]; then
# Listing du(es) login(s) utilisant cette adresse
TMP=$( ldapsearch -x -h "$LDAP_HOST" -b "ou=users,$LDAP_ROOT" -LLL "mailLocalAddress=$RACINE_EMAIL" uid | sed -n 's/^uid: //p' )
echo "ERREUR: adresse email déjà utilisée par :" $TMP "." >&2
return 1
fi
#TODO : vérif syntaxe
test "$1" != ""
}
check_login() {
# n'accepte que les minuscules et les chiffres (doit commencer par une lettre)
# locale "C" pour que [a-z] ne contienne pas à, é, ...
OLDLANG="$LANG"
LANG="C"
RETURN=0
# Passage à la regexp de la mort
if [ $( printf "%s" "$1" | egrep -c "^[a-z][a-z0-9]{2,7}$" ) -ne 1 ]; then
RETURN=1
# Si le login est vide, on reste clément et rien n'est affiché
test -n "$1" && echo "ERREUR: login non valide (regexp: ^[a-z][a-z0-9]{2,7}$ )" >&2
fi
LANG="$OLDLANG"
test "$RETURN" -eq 0 || return 1
# Vérification que le login (=uid LDAP) n'est pas déjà utilisé
if [ $( ldapsearch -x -h "$LDAP_HOST" -b "ou=users,$LDAP_ROOT" -LLL "uid=$1" | grep -c "^dn: " ) -gt 0 ]; then
echo "ERREUR: login déjà existant." >&2
return 1
fi
}
check_unix_homedir() {
# Rien à faire (?)
test "$1" != "" # renvoie false si $1 vide
}
generate_default_email() {
# Initiale du prénom + nom
RETURN=$( printf "%.01s%s@%s" "$1" "$2" "$CONFIG_EMAIL_DOMAIN" | tr "A-Z" "a-z" )
# Suppression des caractères spéciaux et sortie de la fonction
LANG=C echo "$RETURN" | tr -dc "a-z0-9-.@"
}
generate_default_login() {
# on se base lâchement sur generate_default_email :)
# (TODO : bugs divers si prénom + nom < 3 caractères...)
printf "%.03s" $( generate_default_email "$1" "$2" )
}
generate_default_unix_homedir() {
# On renvoie simplement /home/LOGIN
echo "/home/$1"
}
# Enfin : le code...
# 1ère étape : on demande interactivement toutes les infos
# et on crée le compte + mot de passe
#Prénom
while ! check_string "$PRENOM"; do
printf "Prénom : "; read PRENOM
done
#Nom
while ! check_string "$NOM"; do
printf "Nom : "; read NOM
done
#login
DEFAULT_LOGIN=$( generate_default_login "$PRENOM" "$NOM" )
while ! check_login "$LOGIN"; do
printf "Login [%s] : " "$DEFAULT_LOGIN"; read LOGIN
test "$LOGIN" = "" && LOGIN="$DEFAULT_LOGIN"
done
#email
DEFAULT_EMAIL=$( generate_default_email "$PRENOM" "$NOM" )
while ! check_email "$EMAIL"; do
# Prompt avec proposition
printf "Email [%s] : " "$DEFAULT_EMAIL"; read EMAIL
# Si l'utilisateur laisse le champ vide : utilisation de la proposition
test "$EMAIL" = "" && EMAIL="$DEFAULT_EMAIL"
done
#Home directory (UNIX)
DEFAULT_UNIX_HOMEDIR=$( generate_default_unix_homedir "$LOGIN" )
while ! check_unix_homedir "$UNIX_HOMEDIR"; do
printf "Homedir [%s] : " "$DEFAULT_UNIX_HOMEDIR"; read UNIX_HOMEDIR
test "$UNIX_HOMEDIR" = "" && UNIX_HOMEDIR="$DEFAULT_UNIX_HOMEDIR"
done
# Création du compte avec smbldap-useradd + demande du mot de passe
echo "Création du compte dans LDAP... (éviter le Ctrl-C à partir de maintenant)"
if ! smbldap-useradd -a -g $CONFIG_DEFAULT_GID -M "$EMAIL" -N "$PRENOM" -S "$NOM" -d "$UNIX_HOMEDIR" "$LOGIN"; then
echo "ERREUR: smbldap-useradd a renvoyé une erreur. Arrêt du script $0." >&2
return 1
fi
echo "Compte LDAP créé."
echo
# mot de passe
echo "Veuillez renseigner le mot de passe..."
TMP=""
while test "$TMP" = "" && ! smbldap-passwd "$LOGIN"; do
echo "WARNING: problème sur le mot de passe." >&2
printf "Voulez-vous réessayer ? (O/n)"
read TMP
if [ $( echo "$TMP" | egrep -ic "^o$" ) -eq 1 ]; then
TMP=""
fi
done
echo
# 2ème étape : création 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...
printf "Créer 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
RACINE_EMAIL=$( echo "$EMAIL" | sed 's/@.*//' )
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.";
# Création de la boîte Cyrus
\$conn->create('user.$RACINE_EMAIL') or die "Echec à la création de la boîte ('va falloir aller voir à la main si qqchose a été fait...)";
# Spécification du quota
\$conn->setquota('user.$RACINE_EMAIL', 'STORAGE', '$CONFIG_DEFAULT_QUOTA') or die "Echec lors de la mise en place du quota";
EOF
if [ "$?" -eq 0 ]; then
echo "Boîte créée."
else
echo "ERREUR: erreur à la création de la boîte. Le compte LDAP existe néamoins. Voir avec Cyrus. Abandon." >&2
return 1
fi
echo
# 3ème étape : les listes mails
echo "Ajout aux mailing-lists..."
if ! ./script_ml-gestion-abonne.sh -a salaries -i "$EMAIL"; then
cat <<EOF >&2
NOTICE: apparemment, il y a eu un pépin à la gestion des mailing-lists.
Le compte est néanmoins créé, on vous laisse vous débrouiller avec
./script_ml-gestion-abonne.sh ou PHPLDAPAdmin.
Cordialement.
EOF
return 1
fi
# 4ème étape : envoi du mail de bienvenue
# TODO
echo "Fin du script."