#!/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 <&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 <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."; # 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 <&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."