242 lines
7.1 KiB
Bash
Executable file
242 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."
|