Precedent Haut Suivant


5 -  Le script de gestion des utilisateurs LDAP :

Le script principal « gestion_ldap » est donné ci-dessous :

#!/bin/bash

 

# Script permet de lister, creer, modifier ou detruire des utilisateurs

# dans un annuaire LDAP

# Copyright marc.boget@gendarmerie.org

 

# Definition des valeurs par defaut

if [ "$BASEDN" == "" ]; then export BASEDN="ou=Maquette de test,o=sga";fi

if [ "$OU_USERS" == "" ]; then export OU_USERS="ou=People";fi

if [ "$OU_MACHINES" == "" ]; then export OU_MACHINES="ou=Ordinateurs";fi

if [ "$OU_GROUPS" == "" ]; then export OU_GROUPS="ou=Group";fi

#if [ "$BINDDN" == "" ]; then export BINDDN="uid=esentry,ou=Special Users,ou=Maquette de test,o=sga";fi

if [ "$BINDDN" == "" ]; then export BINDDN="cn=admin,ou=Maquette de test,o=sga";fi

if [ "$SERVEUR" == "" ]; then export SERVEUR="localhost";fi

if [ "$PORT" == "" ]; then export PORT="389";fi

if [ "$PASSWORD" == "" ]; then export PASSWORD="sga";fi

CHAMPS=""

if [ "$LDAPSEARCH" == "" ]; then LDAPSEARCH="/usr/bin/ldapsearch";fi

if [ "$LDAPDELETE" == "" ]; then LDAPDELETE="/usr/bin/ldapdelete";fi

if [ "$LDAPADDUSER" == "" ]; then LDAPADDUSER="./ldapadduser";fi

if [ "$LDAPADDALLUSERS" == "" ]; then LDAPADDALLUSERS="./ldapaddallusers";fi

if [ "$LDAPADDGROUP" == "" ]; then LDAPADDGROUP="./ldapaddgroup";fi

if [ "$OUT" == "" ]; then OUT="/dev/stdout";fi

if [ "$MK_NTPASSWD" == "" ]; then export MK_NTPASSWD="./mkntpwd";fi

SMB_HOME_TEMP="\\\\$(uname -n)"

if [ "$SMB_HOME" == "" ]; then export SMB_HOME="${SMB_HOME_TEMP}\homes";fi

if [ "$SMB_PROFILE" == "" ]; then export SMB_PROFILE="${SMB_HOME_TEMP}\profiles";fi

if [ "$SMB_DRIVE" == "" ]; then export SMB_DRIVE="Z:";fi

export TYPE_CREATION=""

ALL_USERS="no"

INTERACTIF="no"

PASS_MODE="no"

 

# Definition fichier de travail temporaire

export FICHIER_TEMP_USERS="personnel.tmp"

export FICHIER_TEMP_GROUPS="groups.tmp"

 

#Recuperation des arguments de la ligne de commande

 

ARGS=$(getopt -o k:ihlgamdf:as:D:b:w::p:t: --longoptions type:,interactif,help,list,append,modify,delete,groups,file:,server:,binddn:,basedn:,password::,port:,path_ldapsearch:,ou_users:,ou_groups:,ou_machines:,out:,ldapadduser:,ldapallusers:,ldapdelete:,allusers,gid:,pass,mkntpwd,smbhome:,smbprofile:,smbdrive:,uid:,ag -- "$@")

 

eval set -- "$ARGS"

while true

do

      case "$1" in

            -l|--list)        OPT="List";

                                   shift ;;

            -g|--groups)      OPT="Listgroups";

                                   shift ;;

            -a|--append)      OPT="Append";

                                   shift ;;

            -m|--modify)      OPT="Modify";

                                   shift ;;

            -d|--delete)      OPT="Delete";

                                   shift ;;

            --ag)             OPT="AddGroup";

                                   shift ;;

            -s|--server)      SERVEUR=$2;

                                   shift 2 ;;

            -p|--port)        PORT=$2;

                                   shift 2 ;;

            -b|--basedn)      BASEDN=$2;

                                   shift 2 ;;

            -D|--binddn)      BINDDN=$2;

                                   shift 2 ;;

            -w|--password)    case "$2" in

                                         "") echo -n "Mot de passe de connexion : " ;

                                             read PASSWORD ;

                                               shift 2 ;;

                                         *) PASSWORD=$2 ; shift 2 ;;

                                   esac ;;

            --gid)                  GIDNUMBER=$2;

                                   shift 2 ;;

            --uid)                  UIDNUMBER=$2;

                                   shift 2 ;;

            --ldapsearch)     LDAPSEARCH=$2;

                                   shift 2 ;;

            --ldapadduser)    LDAPADDUSER=$2;

                                    shift 2 ;;

            --ldapallusers)   LDAPADDALLUSERS=$2;

                                   shift 2 ;;

            --ldapaddgroup)   LDAPADDGROUP=$2;

                                   shift 2 ;;

            --ou_users)       OU_USERS=$2;

                                   shift 2 ;;

            --ou_groups)      OU_GROUPS=$2;

                                   shift 2 ;;

            --ou_machines)    OU_MACHINES=$2;

                                   shift 2 ;;

            --out)                  OUT=$2;

                                   shift 2 ;;

            -f|--file)        FICHIER=$2;

                                   shift 2 ;;

            -i|--interactif) INTERACTIF="yes";

                                   shift;;

            -t|--type)        TYPE_CREATION=$2;

                                   shift 2 ;;

            -k|--mkntpwd)     MK_NTPASSWD=$2;

                                   shift 2 ;;

            --smbhome)        SMB_HOME=$2;

                                   shift 2 ;;

            --smbprofile)     SMB_PROFILE=$2;

                                   shift 2 ;;

            --smbdrive)       SMB_DRIVE=$2;

                                   shift 2 ;;

            --allusers)       ALL_USERS="yes";

                                   shift ;;

            --pass)                 PASS_MODE="yes";

                                   shift ;;

            --)                     shift ; break ;;

            -h|--help)        echo "Gestion des utilisateurs sur un annuaire LDAP" ;

                                   echo "Usage : [l|gamdfsDbwp] [champs_recherches][utilisateur][mot_passe]" ;

                                   echo "   -l|--list      : liste des utilisateurs" ;

                                   echo "   -g|--groups    : liste des groupes d'utilisateurs" ;

                                   echo "   -a|--append    : ajout d'utilisateur" ;

                                   echo "   -m|--modify    : modification d'utilisateur" ;

                                   echo "   -d|--delete    : destruction d'utilisateur" ;

                                   echo "   -f|--file      : fichier de definition des utilisateurs" ;

                                   echo "   -i|--interactif: lancement en mode interactif" ;

                                   echo "   -s|--server    : serveur LDAP a contacter" ;

                                   echo "   -D|--binddn    : utilisateur a utiliser pour se connecter" ;

                                   echo "   -w|--password  : mot de passe a utiliser pour se connecter" ;

                                   echo "   -p|--port      : port d'ecoute du serveur LDAP" ;

                                   echo "   -k|--mkntpwd   : utilitaire mkntpwd a utiliser (avec chemin complet)" ;

                                   echo "   -t|--type      : type d'utilisateur/machine a creer : " ;

                                   echo "         - person : utilisateur de type personnel " ;

                                   echo "         - unix   : utilisateur pouvant se connecter sur Unix" ;

                                   echo "         - samba  : utilisateur pouvant se connecter sur Samba" ;

                                   echo "         - sambix : utilisateur pouvant se connecter sur Unix + Samba (Defaut)" ;

                                   echo "         - machine: machine faisant partie du domaine Samba" ;

                                   echo "   --gid          : Numero du groupe a utiliser" ;

                                   echo "   --uid          : Numero de l'utilisateur a utiliser" ;

                                    echo "   --ldapsearch   : utilitaire ldapsearch a utiliser (avec chemin complet)" ;

                                   echo "   --ldapdelete   : utilitaire ldapdelete a utiliser (avec chemin complet)" ;

                                   echo "   --ldapadduser  : script perl pour ajout utilisateurs (avec chemin complet)" ;

                                   echo "   --ldapallusers : script perl pour ajout /etc/paswd (avec chemin complet)" ;

                                   echo "   --ldapaddgroup : script perl pour ajout groupes (avec chemin complet)" ;

                                   echo "   --ou_users     : OU contenant les utilisateurs (ou=People par defaut)" ;

                                   echo "   --ou_groups    : OU contenant les groupes (ou=Group par defaut)" ;

                                   echo "   --ou_machines  : OU contenant les ordinateurs du domaine Samba                                   (ou=Ordinateurs par defaut)" ;

                                   echo "   --out          : Fichier de sortie des resultats (stdout par defaut)" ;

                                   echo "   --smbhome      : Repertoire home utilisateurs samba" ;

                                   echo "                    ($SMB_HOME par defaut)" ;

                                   echo "   --smbprofile   : Repertoire profils utilisateurs samba" ;

                                   echo "                    ($SMB_PROFILE par defaut)" ;

                                   echo "   --smbdrive     : Lecteur reseau repertoire utilisateur samba (Z: par defaut)" ;

                                   echo "   --allusers     : incorporation de l'ensemble des utilisateurs de /etc/passwd" ;

                                   echo "   --pass         : changement du mot de passe" ;

                                   echo ""

                                   echo "   champs_recherches : option utilisée avec options 'l' et 'g'"

                                   echo "          - tous les champs par defaut"

                                   echo "          - peuvent etre definis sous la forme champ1 champ2 ... champn"

                                   echo ""

                                   echo "   utilisateur : nom utilisateur a creer/detruire"

                                   echo ""

                                   echo "   mot_passe   : mot de passe en clair de l'utilisateur a creer"

                                   exit 1 ;;

            *)                      echo "Aide";

                                   exit 1 ;;

      esac

done

 

# Recuperation du dn d'un utilisateur donné

function recuperation_dn()

{

      variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_USERS,$BASEDN" "uid=$NOM_UTILISATEUR" dn|grep "^dn:"|cut -c "5-")

}

 

# Traitement du changement de mot de passe

if [ "$PASS_MODE" == "yes" ]

then

            NOM_UTILISATEUR=$1

            if [ "$NOM_UTILISATEUR" == "" ]

            then

                  NOM_UTILISATEUR=$(whoami)

            fi

            recuperation_dn

            export DN_UTILISATEUR=$variable

            echo -n "Entrer l'ancien mot de passe pour utilisateur $NOM_UTILISATEUR : "

            # Desactivation de l'echo local

            stty -echo

            read OLD_PASSWORD_USER

            # Reactivation de l'echo local

            stty echo

            echo ""

            echo -n "Entrer le nouveau mot de passe  pour utilisateur $NOM_UTILISATEUR : "

            # Desactivation de l'echo local

            stty -echo

            read NEW_PASSWORD_USER1

            # Reactivation de l'echo local

            stty echo

            echo ""

            echo -n "Retaper le mot de passe pour verification : "

            # Desactivation de l'echo local

            stty -echo

            read NEW_PASSWORD_USER2

            echo ""

            # Reactivation de l'echo local

            stty echo

            if [ "$NEW_PASSWORD_USER1" != "$NEW_PASSWORD_USER2" ]

            then

                  echo "Les deux mots de passe ne sont pas indentiques !!!"

                  exit -1

            fi

            export TYPE_CREATION="password"

            export NEW_PASSWORD_USER1

            $LDAPSEARCH -x -w "$OLD_PASSWORD_USER" -D "uid=$NOM_UTILISATEUR,$OU_USERS,$BASEDN" -b "$OU_USERS,$BASEDN" "uid=$NOM_UTILISATEUR" > /dev/null 2>&1 && $LDAPADDUSER && echo "Changement mot de passe effectue ..." || echo "Mot de passe incorrect !!!"

fi

 

# Traitement du mode interactif

if [ "$INTERACTIF" == "yes" ]

then

      while [ "$OPT" == "" ]

      do

            echo -n "Option de lancement (List/Listgroups/Append/Modify/Delete/AddGroup) : "

            read OPT

            if    [ "$OPT" != "List" ] && [ "$OPT" != "Listgroups" ] \

               && [ "$OPT" != "Append" ] && [ "$OPT" != "Modify" ] \

               && [ "$OPT" != "Delete" ]  && [ "$OPT" != "AddGroup" ]

            then

                  OPT=""

            fi

      done

      while [ "$TYPE_CREATION" == "" ]

      do

            echo -n "Type d'utilisateur/machine a creer (person/unix/samba/sambix/machine) : "

            read TYPE_CREATION

            if [ "$TYPE_CREATION" != "person" ] && \

               [ "$TYPE_CREATION" != "unix" ] && \

               [ "$TYPE_CREATION" != "samba" ] && \

               [ "$TYPE_CREATION" != "sambix" ] && \

               [ "$TYPE_CREATION" != "machine" ]

            then

                  TYPE_CREATION=""

            fi

      done

      echo -n "Fichier de definition des utilisateurs (personnel.lst) : "

            read FICHIER

            if [ "$FICHIER" == "" ]; then FICHIER="personnel.lst"; fi

      echo -n "Utilitaire ldapsearch (/usr/bin/ldapsearch) : "

            read LDAPSEARCH

            if [ "$LDAPSEARCH" == "" ]; then LDAPSEARCH="/usr/bin/ldapsearch"; fi

      echo -n "Utilitaire ldapdelete (/usr/bin/ldapdelete) : "

            read LDAPDELETE

            if [ "$LDAPDELETE" == "" ]; then LDAPDELETE="/usr/bin/ldapdelete"; fi

      echo -n "Script perl pour ajout utilisateurs (./ldapadduser) : "

            read LDAPADDUSER

            if [ "$LDAPADDUSER" == "" ]; then LDAPADDUSER="./ldapadduser"; fi

      echo -n "Script perl pour ajout groupes (./ldapaddgroup) : "

            read LDAPADDGROUP

            if [ "$LDAPADDGROUP" == "" ]; then LDAPADDGROUP="./ldapaddgroup"; fi

      echo -n "Script perl pour ajout /etc/passwd (./ldapaddallusers) : "

            read LDAPADDALLUSERS

            if [ "$LDAPADDALLUSERS" == "" ]; then LDAPADDALLUSERS="./ldapaddallusers"; fi

      echo -n "Fichier de sortie des resultats (/dev/stdout) : "

            read OUT

            if [ "$OUT" == "" ]; then OUT="/dev/stdout"; fi

      echo -n "Serveur LDAP (localhost) : "

            read SERVEUR

            if [ "$SERVEUR" == "" ]; then SERVEUR="localhost"; fi

      echo -n "Port LDAP (389) : "

            read PORT

            if [ "$PORT" == "" ]; then PORT="389"; fi

      echo -n "Racine LDAP (ou=Maquette de test,o=sga) : "

            read BASEDN

            if [ "$BASEDN" == "" ]; then BASEDN="ou=Maquette de test,o=sga"; fi

      echo -n "Unite d'organisation LDAP contenant les utilisateurs (ou=People) : "

            read OU_USERS

            if [ "$OU_USERS" == "" ]; then OU_USERS="ou=People"; fi

      echo -n "Unite d'organisation LDAP contenant les groupes (ou=Group) : "

            read OU_GROUPS

            if [ "$OU_GROUPS" == "" ]; then OU_GROUPS="ou=Group"; fi

      echo -n "Unite d'organisation LDAP contenant les ordinateurs (ou=Ordinateurs) : "

            read OU_MACHINES

            if [ "$OU_GROUPS" == "" ]; then OU_GROUPS="ou=Group"; fi

      echo -n "Utilisateur LDAP pour se connecter (uid=esentry,ou=Special Users,ou=Maquette de test,o=sga) : "

            read BINDDN

            if [ "$BINDDN" == "" ]; then BINDDN="uid=esentry,ou=Special Users,ou=Maquette de test,o=sga"; fi

fi

 

# Verification du type d'utilisateur a creer

if [ "$TYPE_CREATION" == "" ]; then TYPE_CREATION="sambix"; fi

 

# Recuperation des champs a visualiser ou des utilisateurs a creer/detruire

CHAMPS="$1"

if [ "$OPT" == "Append" ] || [ "$OPT" == "Modify" ]

then

      if [ "$FICHIER" == "" ] && [ "TYPE_CREATION" != "machine" ]

      then

            if [ "ALL_USERS" == "" ]

            then

                  if [ "$GIDNUMBER" == "" ]

                  then

                        echo ""

                        echo "Le numero de groupe d'appartenance de l'utilisateur est requis !!!"

                        exit -1

                  fi

                  NOM_UTILISATEUR=$1

                  PASSWORD_UTILISATEUR=$2

            fi

      fi

fi

 

# Definition des fonctions de calcul

 

# Recuperation du premier uid machine libre

function new_uid_machine()

{

      variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_MACHINES,$BASEDN" uidNumber |grep "^uidNumber" |cut -d':' -f2|grep -v "65534"|sort -n|tail -1|cut -d' ' -f2)

      # Cas ou il n'existe aucun utilisateur ds l'annuaire

      if [ "$variable" == "" ]

      then

            variable="1000"

      else

            variable="$(expr $variable + 1 )"

      fi

      return $variable;

}

 

# Recuperation du premier uid utilisateur libre

function new_uid()

{

      variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_USERS,$BASEDN" uidNumber |grep "^uidNumber" |cut -d':' -f2|grep -v "65534"|sort -n|tail -1|cut -d' ' -f2)

      # Cas ou il n'existe aucun utilisateur ds l'annuaire

      if [ "$variable" == "" ]

      then

            variable="1000"

      else

            variable="$(expr $variable + 1 )"

      fi

      return $variable;

}

 

# Recuperation du premier gid libre

function new_gid()

{

      variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_GROUPS,$BASEDN" gidNumber |grep "^gidNumber" |cut -d':' -f2|grep -v "65534"|sort -n|tail -1|cut -d' ' -f2)

      # Cas ou il n'existe aucun groupe ds l'annuaire

      if [ "$variable" == "" ]

      then

            variable="1000"

      else

            variable="$(expr $variable + 1 )"

      fi

      return $variable;

}

# Recherche du gidNumber correspondant a un groupe donne

function recherche_gid()

{

      variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_GROUPS,$BASEDN" "cn=$USER_GROUPE" |grep "^gidNumber" |cut -d':' -f2|cut -d' ' -f2)

      return $variable;

}

 

# Remise a zero des champs utilisateur

function raz_champs()

{

      USER_CN=""

      USER_GROUPE=""

      USER_PASSWORD=""

      USER_SN=""

      USER_HOME=""

      USER_LOGIN=""

}

# Fonction de creation de groupe si besoin est

function creation_groupe()

{

      # Si le GIDNUMBER n'est pas fixe dans la ligne de commande

      # Recherche du gidNumber correspondant au groupe demandé

      # Si existe pas alors creation nouveau groupe

      if [ "$GIDNUMBER" == "" ]

      then

            recherche_gid

            GID=$variable

      else

            GID=$GIDNUMBER

      fi

      if [ "$GID" == "" ]

      then

            new_gid

            GID=$variable

            echo "$USER_GROUPE:$GID" >> $FICHIER_TEMP_GROUPS

      fi

}

 

# Fonction ajout de machines au domaine

function ajout_machines()

{

      # Effacement des fichiers de travail temporaires

      rm -f $FICHIER_TEMP_USERS

      rm -f $FICHIER_TEMP_GROUPS

 

      # Calcul du numero uid de depart

      if [ "$UIDNUMBER" == "" ]

      then

            new_uid_machine

            USER_ID=$variable

      else

            USER_ID=$UIDNUMBER

      fi

      # Destruction prealable de la machine si modification demandée

      if [ "$AJOUT" == "0" ]; then destruction_machine; fi

           

      NOM_UTILISATEUR="${CHAMPS}$"

      USER_CN=$NOM_UTILISATEUR

      USER_PASSWORD=$PASSWORD_UTILISATEUR

      USER_SN=$NOM_UTILISATEUR

      USER_HOME="/dev/null"

      USER_LOGIN="/bin/false"

      USER_GROUPE="users"

     

      creation_groupe

     

      # Ecriture du fichier de definition des machines

      # sous la forme cn;uid;gid;password;sn;home;login shell

      echo "$USER_CN:$USER_ID:$GID:$USER_PASSWORD:$USER_SN:$USER_HOME:$USER_LOGIN" >> $FICHIER_TEMP_USERS

      # Appel du script perl permettant de creer la machine

      $LDAPADDUSER

      # Appel du script perl permettant de creer les nouveaux groupes

      # Test : FICHIER_TEMP_GROUPS present

      if test -f $FICHIER_TEMP_GROUPS

      then

            $LDAPADDGROUP

      fi

      return 0

}

 

 

# Fonction permettant d'ajouter des utilisateurs

function ajout_utilisateurs()

{

      # Effacement des fichiers de travail temporaires

      rm -f $FICHIER_TEMP_USERS

      rm -f $FICHIER_TEMP_GROUPS

 

      # Sauvegarde du contexte

      OLD_IFS=$IFS

      IFS=$'\n'

      # Calcul du numero uid de depart

      if [ "$UIDNUMBER" == "" ]

      then

            new_uid

            USER_ID=$variable

      else

            USER_ID=$UIDNUMBER

      fi

 

      # Explosion des lignes du fichier $FICHIER

      # les lignes sont sous la forme :

      # nom_utilisateur;groupe;password;sn;home;login shell

      # Cas ou option all_users selectionnee

      if [ "$ALL_USERS" == "yes" ]

      then

            FICHIER=/etc/passwd

      fi

 

      # Traitement du cas ou le nom de l'utilisateur est donne en ligne de commande

      if [ "$FICHIER" == "" ]

      then

            # Destruction prealable de l'utilisateur si modification demandée

            if [ "$AJOUT" == "0" ]; then destruction_utilisateur; fi

           

            NOM_UTILISATEUR=$CHAMPS

            USER_CN=$NOM_UTILISATEUR

            USER_PASSWORD=$PASSWORD_UTILISATEUR

            USER_SN=$NOM_UTILISATEUR

            USER_HOME="/home/$NOM_UTILISATEUR"

            USER_LOGIN="/bin/bash"

            USER_GROUPE="$NOM_UTILISATEUR"

 

            creation_groupe

 

            # Ecriture du fichier de definition des utilisateurs

            # sous la forme cn;uid;gid;password;sn;home;login shell

            echo "$USER_CN:$USER_ID:$GID:$USER_PASSWORD:$USER_SN:$USER_HOME:$USER_LOGIN" >> $FICHIER_TEMP_USERS

            # Appel du script perl permettant de creer l'utilisateur

            $LDAPADDUSER

            # Appel du script perl permettant de creer les nouveaux groupes

            # Test : FICHIER_TEMP_GROUPS present

            if test -f $FICHIER_TEMP_GROUPS

            then

                  $LDAPADDGROUP

            fi

            return 0

      fi

 

      for LIGNE in $(cat $FICHIER|grep -v "^#"|grep [:alnum:])

      do

            IFS=":"

            set $LIGNE

            # Mise a zero et initialisation des champs de l'utilisateur

            raz_champs

            # Cas ou option all_users selectionnee

            if [ "$ALL_USERS" == "yes" ]

            then

                  USER_CN=$1

                  USER_PASSWORD=$(grep "^$USER_CN:" /etc/shadow|cut -d':' -f2)

                  USER_ID=$3

                  GID=$4

                  USER_SN=$5

                  USER_HOME=$6

                  USER_LOGIN=$7

            else

                  USER_CN=$1

                  USER_GROUPE=$2

                  USER_PASSWORD=$3

                  USER_SN=$4

                  USER_HOME=$5

                  USER_LOGIN=$6

                 

                  creation_groupe

 

            fi

            # Mise a jour du sn au cn par defaut

            if [ "$USER_SN" == "" ]

            then

                  USER_SN="$USER_CN"

            fi

 

            # Destruction prealable de l'utilisateur si modification demandée

            if [ "$AJOUT" == "0" ]

            then

                  CHAMPS=$USER_CN

                  destruction_utilisateur

            fi

           

            # Ecriture du fichier de definition des utilisateurs

            # sous la forme cn;uid;gid;password;sn;home;login shell

            echo "$USER_CN:$USER_ID:$GID:$USER_PASSWORD:$USER_SN:$USER_HOME:$USER_LOGIN" >> $FICHIER_TEMP_USERS

            USER_ID="$(expr $USER_ID + 1 )"

      done

      # Restauration du contexte

      IFS=$OLD_IFS

      # Appel du script perl permettant de creer les utilisateurs

      if [ "$ALL_USERS" == "yes" ]

      then

            $LDAPADDALLUSERS

      else

            $LDAPADDUSER

      fi

      # Appel du script perl permettant de creer les nouveaux groupes

      # Test : FICHIER_TEMP_GROUPS present

      if test -f $FICHIER_TEMP_GROUPS

      then

            $LDAPADDGROUP

      fi

}

 

# Fonction permettant de detruire une machine

function destruction_machine()

{

      $LDAPDELETE -x -w "$PASSWORD" -D "$BINDDN" "uid=$CHAMPS,$OU_MACHINES,$BASEDN"

}

 

# Fonction permettant de detruire un utilisateur

function destruction_utilisateur()

{

      $LDAPDELETE -x -w "$PASSWORD" -D "$BINDDN" "uid=$CHAMPS,$OU_USERS,$BASEDN"

}

 

# Traitement des commandes

case $OPT in

      List)      

                        $LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_USERS,$BASEDN" $CHAMPS > $OUT ;

                        ;;

      Listgroups)

                        $LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_GROUPS,$BASEDN" $CHAMPS > $OUT ;

                        ;;

      Append)           AJOUT=1

                        if [ "$TYPE_CREATION" != "machine" ]

                        then

                             ajout_utilisateurs

                        else

                             ajout_machines

                        fi

                        ;;

      Delete)           if [ "$CHAMPS" == "" ]

                        then

                             echo "Nom de l'utilisateur a detruire manquant"

                             exit 1

                        fi

                        destruction_utilisateur

                        ;;

      Modify)           AJOUT=0

                        ajout_utilisateurs

                        ;;

      AddGroup)   USER_GROUPE=$CHAMPS

                        creation_groupe

                        if test -f $FICHIER_TEMP_GROUPS

                        then

                             $LDAPADDGROUP

                        fi

                        ;;

esac

 

rm -f $FICHIER_TEMP_USERS

rm -f $FICHIER_TEMP_GROUPS

 

 

NB : Ce script accepte les options ci-dessous :

 

Usage : [l|gamdfsDbwp] [champs_recherches][utilisateur][mot_passe]

   -l|--list        : liste des utilisateurs

   -g|--groups      : liste des groupes d'utilisateurs

   -a|--append      : ajout d'utilisateur

   -m|--modify      : modification d'utilisateur

   -d|--delete      : destruction d'utilisateur

   -f|--file        : fichier de definition des utilisateurs

   -i|--interactif  : lancement en mode interactif

   -s|--server      : serveur LDAP a contacter

   -D|--binddn      : utilisateur a utiliser pour se connecter

   -w|--password    : mot de passe a utiliser pour se connecter

   -p|--port        : port d'ecoute du serveur LDAP

   -k|--mkntpwd     : utilitaire mkntpwd a utiliser (avec chemin complet)

   -t|--type        : type d'utilisateur/machine a creer :

         - person   : utilisateur de type personnel

         - unix     : utilisateur pouvant se connecter sur Unix

         - samba    : utilisateur pouvant se connecter sur Samba

         - sambix   : utilisateur pouvant se connecter sur Unix + Samba (Defaut)

         - machine  : machine faisant partie du domaine Samba

   --gid            : Numero du groupe a utiliser

   --uid            : Numero de l'utilisateur a utiliser

   --ldapsearch     : utilitaire ldapsearch a utiliser (avec chemin complet)

   --ldapdelete     : utilitaire ldapdelete a utiliser (avec chemin complet)

   --ldapadduser    : script perl pour ajout utilisateurs (avec chemin complet)

   --ldapallusers   : script perl pour ajout /etc/paswd (avec chemin complet)

   --ldapaddgroup   : script perl pour ajout groupes (avec chemin complet)

   --ou_users       : OU contenant les utilisateurs (ou=People par defaut)

   --ou_groups      : OU contenant les groupes (ou=Group par defaut)

   --ou_machines    : OU contenant les ordinateurs du domaine Samba (ou=Ordinateurs par defaut)

   --out            : Fichier de sortie des resultats (stdout par defaut)

   --smbhome        : Repertoire home utilisateurs samba

                    (\\GrandeOurse\homes par defaut)

   --smbprofile     : Repertoire profils utilisateurs samba

                    (\\GrandeOurse\profiles par defaut)

   --smbdrive       : Lecteur reseau repertoire utilisateur samba (Z: par

                     defaut)

   --allusers       : incorporation de l'ensemble des utilisateurs de

                     /etc/passwd

   --pass           : changement du mot de passe

 

   champs_recherches : option utilisée avec options 'l' et 'g'

          - tous les champs par defaut

          - peuvent etre definis sous la forme champ1 champ2 ... champn

 

   utilisateur      : nom utilisateur a creer/detruire

 

   mot_passe        : mot de passe en clair de l'utilisateur a creer

 

Il peut s’appuyer sur un fichier de définition dont un exemple est donné ci-dessous :

# Fichier de definition des utilisateurs a creer dans l'annuaire LDAP

# Ce fichier sert de base pour gestion_ldap

# Les lignes doivent etre de la forme :

# nom:nom_groupe:mot_passe:nom_complet:home_directory:login_shell

 

 

user_test:groupe_test:sga:Utilisateur de Test:/home/user_test:/bin/bash

 

Il s’appuie sur les scripts perl « ldapadduser » « ldapaddgroup » et « ldapaddallusers » donnés ci-dessous :

#!/usr/bin/perl -w

#

# Script permettant de creer les utilisateurs dans l'annuaire LDAP

# Copyright marc.boget@gendarmerie.org

# Script fonctionnant de pair avec le script maitre gestion_ldap

 

#use strict;

use Net::LDAP;

 

# Recuperation des variables environnements exportes par gestion_ldap

my $serveur=$ENV{"SERVEUR"};

my $binddn=$ENV{"BINDDN"};

my $basedn=$ENV{"BASEDN"};

my $password=$ENV{"PASSWORD"};

my $ou_users=$ENV{"OU_USERS"};

my $ou_machines=$ENV{"OU_MACHINES"};

my $fichier_travail=$ENV{"FICHIER_TEMP_USERS"};

my $shadow_lastchange="11111";

my $shadow_max="99999";

my $shadow_warning="7";

my $type_creation=$ENV{"TYPE_CREATION"};

my $mk_ntpasswd=$ENV{"MK_NTPASSWD"};

my $home_rep_samba=$ENV{"SMB_HOME"};

my $home_drive_samba=$ENV{"SMB_DRIVE"};

my $profile_rep_samba=$ENV{"SMB_PROFILE"};

 

# Ouverture de la connexion sur l'annuaire LDAP

my $ldap = Net::LDAP->new($serveur, async => 1) or die "$@";

 

# on se connecte avec le BINDDN

$ldap->bind(dn=>$binddn,

         password=>$password)  or die "$@";

 

# Traitement du changement du mot de passe

if ($type_creation =~ "password")

{

     # Generation du mot de passe chiffré

     my $pass=$ENV{"NEW_PASSWORD_USER1"};

    my $dn =$ENV{"DN_UTILISATEUR"};

    $salt=substr(rand 100,0,2);

    $pw=crypt($pass,$salt);

    my $userpassword="{crypt}$pw";

    

     # Calcul du mot de passe LanManager et du mot de passe NT

     # a l'aide de l'outil mkntpasswd (source LophtCrack)

     my $ntpwd=`$mk_ntpasswd '$pass'`;

     chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));

     chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));

 

     my $res = $ldap->modify(dn=>$dn,

                changes => [

                     replace => [ "userPassword" => [ $userpassword ]

                                ]

                           ]

                               );

     $res->code && warn "Erreur lors de la modification du mot de passe : ", $res->error ;

     $res = $ldap->modify(dn=>$dn,

                changes => [

                     replace => [ "lmPassword" => [ $lmpassword ]

                                  ]

                           ]

                          );

     $res->code && warn "Erreur lors de la modification du mot de passe : ", $res->error ;

     $res = $ldap->modify(dn=>$dn,

                changes => [

                     replace => [ "ntPassword" => [ $ntpassword ]

                                ]

                           ]

                                );

     $res->code && warn "Erreur lors de la modification du mot de passe : ", $res->error ;

     exit;

}

 

# on lit un fichier qui contient les personnes à créer dans l'annuaire

open (FILE, "<$fichier_travail");

 

my $line;

while (defined ($line = <FILE>))

{

    chomp($line);

    if ($line =~ /^\s*$/)

    {

     next;

    }

    my ($uid, $uidNumber, $gidNumber, $pass, $sn, $home_rep, $login_shell) = split(/:/, $line);

    my $dn = "uid=$uid,$ou_users,$basedn";

     # Generation du mot de passe chiffré

    $salt=substr(rand 100,0,2);

    $pw=crypt($pass,$salt);

    my $userpassword="{crypt}$pw";

     SWITCH:

     {

          if ($type_creation =~ "person")

                {

                my $res = $ldap->add(dn=>$dn,

                           attrs =>

                           [ "objectclass" => [ 'InetOrgPerson' ],

                        "uid" => [ $uid ],

                        "cn" => [ $uid ],

                        "sn" => [ $sn ]]);

                $res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;

                    last SWITCH;

                }

 

          if ($type_creation =~ "sambix")

                {

                     my $winmagic=2147483647;

                     # Calcul du rid de l'utilisateur et du primaryGroupId

                     # userRid=2*uidNumber + 1000

                     # groupId=2*gidNumber + 1001

                     my $userRid = 2 * $uidNumber + 1000;

                     my $userGroupRid = 2 * $gidNumber + 1001;

 

                     # Calcul du mot de passe LanManager et du mot de passe NT

                     # a l'aide de l'outil mkntpasswd (source LophtCrack)

                     my $ntpwd=`$mk_ntpasswd '$pass'`;

                     chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));

                     chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));

               

                     # Mise a jour du samba home

                     $home_rep_samba="$home_rep_samba\\$uid";

                     print("home_rep=$home_rep_samba\n");

                my $res = $ldap->add(dn=>$dn,

                           attrs =>

                           [ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount', 'sambaAccount' ],

                        "uid" => [ $uid ],

                        "cn" => [ $uid ],

                        "sn" => [ $sn ],

                        "userPassword" => [ $userpassword ],

                        "shadowLastChange" => [ $shadow_lastchange ],

                        "shadowMax" => [ $shadow_max ],

                        "shadowWarning" => [ $shadow_warning ],

                        "loginShell" => [ $login_shell ],

                        "uidNumber" => [ $uidNumber ],

                        "gidNumber" => [ $gidNumber ],

                        "homeDirectory" => [ $home_rep ],

                        "gecos" => [ $uid ],

                        "description" => [ "Utilisateur SAMBA $sn" ],

                        "pwdLastSet" => [ '0' ],

                        "logonTime" => [ '0' ],

                        "logoffTime" => [ $winmagic ],

                        "kickoffTime" => [ $winmagic ],

                        "pwdCanChange" => [ '0' ],

                        "pwdMustChange" => [ $winmagic ],

                        "displayName" => [ $uid ],

                        "acctFlags" => [ '[UX       ]' ],

                        "rid" => [ $userRid ],

                        "primaryGroupID" => [ $userGroupRid ],

                        "smbHome" => [ $home_rep_samba ],

                        "lmPassword" => [ $lmpassword ],

                        "ntPassword" => [ $ntpassword ],

                        "homeDrive" => [ $home_drive_samba ],

                        "profilePath" => [ $profile_rep_samba ]

                        ]);

                $res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;

                     last SWITCH;

                }

 

          if ($type_creation =~ "machine")

                {

                my $dn = "uid=$uid,$ou_machines,$basedn";

                     my $winmagic=2147483647;

                     my $userRid = 2 * $uidNumber + 1000;

                     my $userGroupRid = 2 * $gidNumber + 1001;

 

                     # Calcul du mot de passe LanManager et du mot de passe NT

                     # a l'aide de l'outil mkntpasswd (source LophtCrack)

                     my $pass=$uid;

                     $pass=~ s/.$//s;

                     print("pass=$pass\n");

                     my $ntpwd=`$mk_ntpasswd '$pass'`;

                     chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));

                     chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));

               

                     # Mise a jour du samba home

                     $home_rep_samba="$home_rep_samba\\nobody";

                     print("home_rep=$home_rep_samba\n");

                     # Mise a jour du samba profile

                     $profile_rep_samba="$profile_rep_samba\\nobody\\profile";

                     print("home_rep=$profile_rep_samba\n");

                my $res = $ldap->add(dn=>$dn,

                           attrs =>

                           [ "objectclass" => [ 'posixAccount', 'top', 'sambaAccount' ],

                        "uid" => [ $uid ],

                        "cn" => [ $uid ],

                        "loginShell" => [ $login_shell ],

                        "uidNumber" => [ $uidNumber ],

                        "gidNumber" => [ $gidNumber ],

                        "homeDirectory" => [ $home_rep ],

                        "description" => [ "Ordinateur SAMBA $pass" ],

                        "pwdLastSet" => [ '0' ],

                        "logonTime" => [ '0' ],

                        "logoffTime" => [ $winmagic ],

                        "kickoffTime" => [ $winmagic ],

                        "pwdCanChange" => [ '0' ],

                        "pwdMustChange" => [ $winmagic ],

                        "acctFlags" => [ '[W        ]' ],

                        "rid" => [ $userRid ],

                        "primaryGroupID" => [ $userGroupRid ],

                        "smbHome" => [ $home_rep_samba ],

                        "lmPassword" => [ $lmpassword ],

                        "ntPassword" => [ $ntpassword ],

                        "profilePath" => [ $profile_rep_samba ]

                        ]);

                $res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;

                     last SWITCH;

                }

 

          if ($type_creation =~ "samba")

                {

                     my $winmagic=2147483647;

                     # Calcul du rid de l'utilisateur et du primaryGroupId

                     # userRid=2*uidNumber + 1000

                     # groupId=2*gidNumber + 1001

                     my $userRid = 2 * $uidNumber + 1000;

                     my $userGroupRid = 2 * $gidNumber + 1001;

 

                     # Calcul du mot de passe LanManager et du mot de passe NT

                     # a l'aide de l'outil mkntpasswd (source LophtCrack)

                     my $ntpwd=`$mk_ntpasswd '$pass'`;

                     chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));

                     chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));

                my $res = $ldap->add(dn=>$dn,

                           attrs =>

                           [ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount', 'sambaAccount' ],

                        "uid" => [ $uid ],

                        "cn" => [ $uid ],

                        "sn" => [ $sn ],

                        "gecos" => [ $uid ],

                        "description" => [ "Utilisateur SAMBA $sn" ],

                        "pwdLastSet" => [ '0' ],

                        "logonTime" => [ '0' ],

                        "logoffTime" => [ $winmagic ],

                        "kickoffTime" => [ $winmagic ],

                        "pwdCanChange" => [ '0' ],

                        "pwdMustChange" => [ $winmagic ],

                        "displayName" => [ $uid ],

                        "acctFlags" => [ '[UX       ]' ],

                        "rid" => [ $userRid ],

                        "primaryGroupID" => [ $userGroupRid ],

                        "smbHome" => [ $home_rep_samba ],

                        "lmPassword" => [ $lmpassword ],

                        "ntPassword" => [ $ntpassword ],

                        "homeDrive" => [ $home_drive_samba ],

                        "profilePath" => [ $profile_rep_samba ]

                        ]);

                $res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;

                     last SWITCH;

                }

 

          if ($type_creation =~ "unix")

                {

                my $res = $ldap->add(dn=>$dn,

                           attrs =>

                           [ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount' ],

                        "uid" => [ $uid ],

                        "cn" => [ $uid ],

                        "sn" => [ $sn ],

                        "userPassword" => [ $userpassword ],

                        "shadowLastChange" => [ $shadow_lastchange ],

                        "shadowMax" => [ $shadow_max ],

                        "shadowWarning" => [ $shadow_warning ],

                        "loginShell" => [ $login_shell ],

                        "uidNumber" => [ $uidNumber ],

                        "gidNumber" => [ $gidNumber ],

                        "homeDirectory" => [ $home_rep ],

                        "gecos" => [ $uid ]]);

                $res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;

                     last SWITCH;

                }

     }

}

 

close(FILE);

 

#!/usr/bin/perl -w

#

# Script permettant de creer les groupes utilisateurs dans l'annuaire LDAP

# Copyright marc.boget@gendarmerie.org

# Script fonctionnant de pair avec le script maitre gestion_ldap

 

#use strict;

use Net::LDAP;

 

# Recuperation des variables environnements exportes par gestion_ldap

my $serveur=$ENV{"SERVEUR"};

my $binddn=$ENV{"BINDDN"};

my $basedn=$ENV{"BASEDN"};

my $password=$ENV{"PASSWORD"};

my $ou_groups=$ENV{"OU_GROUPS"};

my $fichier_travail=$ENV{"FICHIER_TEMP_GROUPS"};

 

# Ouverture de la connexion sur l'annuaire LDAP

my $ldap = Net::LDAP->new($serveur, async => 1) or die "$@";

 

# on se connecte avec le BINDDN

$ldap->bind(dn=>$binddn,

         password=>$password)  or die "$@";

 

# on lit un fichier qui contient les groupes à créer dans l'annuaire

open (FILE, "<$fichier_travail");

 

my $line;

while (defined ($line = <FILE>))

{

    chomp($line);

    if ($line =~ /^\s*$/)

    {

     next;

    }

    my ($gid, $gidNumber) = split(/:/, $line);

    my $dn = "cn=$gid,$ou_groups,$basedn";

    my $res = $ldap->add(dn=>$dn,

                 attrs =>

                 [ "objectclass" => [ 'posixGroup', 'top' ],

                   "cn" => [ $gid ],

                   "gidNumber" => [ $gidNumber ]]);

 

    $res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;

}

 

close(FILE);

 

#!/usr/bin/perl -w

#

# Script permettant de creer les utilisateurs de /etc/passwd

# dans l'annuaire LDAP

# Copyright marc.boget@gendarmerie.org

# Script fonctionnant de pair avec le script maitre gestion_ldap

 

#use strict;

use Net::LDAP;

 

# Recuperation des variables environnements exportes par gestion_ldap

my $serveur=$ENV{"SERVEUR"};

my $binddn=$ENV{"BINDDN"};

my $basedn=$ENV{"BASEDN"};

my $password=$ENV{"PASSWORD"};

my $ou_users=$ENV{"OU_USERS"};

my $fichier_travail=$ENV{"FICHIER_TEMP_USERS"};

my $shadow_lastchange="11111";

my $shadow_max="99999";

my $shadow_warning="7";

 

# Ouverture de la connexion sur l'annuaire LDAP

my $ldap = Net::LDAP->new($serveur, async => 1) or die "$@";

 

# on se connecte avec le BINDDN

$ldap->bind(dn=>$binddn,

         password=>$password)  or die "$@";

 

# on lit un fichier qui contient les personnes à créer dans l'annuaire

open (FILE, "<$fichier_travail");

 

my $line;

while (defined ($line = <FILE>))

{

    chomp($line);

    if ($line =~ /^\s*$/)

    {

     next;

    }

    my ($uid, $uidNumber, $gidNumber, $pass, $sn, $home_rep, $login_shell) = split(/:/, $line);

    my $dn = "uid=$uid,$ou_users,$basedn";

    my $userpassword="{crypt}$pass";

    my $res = $ldap->add(dn=>$dn,

                 attrs =>

                 [ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount' ],

                   "uid" => [ $uid ],

                   "cn" => [ $uid ],

                   "sn" => [ $sn ],

                   "userPassword" => [ $userpassword ],

                   "shadowLastChange" => [ $shadow_lastchange ],

                   "shadowMax" => [ $shadow_max ],

                   "shadowWarning" => [ $shadow_warning ],

                   "loginShell" => [ $login_shell ],

                   "uidNumber" => [ $uidNumber ],

                   "gidNumber" => [ $gidNumber ],

                   "homeDirectory" => [ $home_rep ],

                   "gecos" => [ $uid ]]);

 

    $res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;

}

 

close(FILE);



Precedent Haut Suivant