#!/usr/bin/python# -*- coding: utf-8 -*-import sys,ldap,string,ldap.modlist as modlist,ldif,Confglobal l,myConfclass LdapUserManage: #Définition des fonctions def __init__ (self): """ Initialise la connexion Établit une connexion avec le serveur LDAP en tant qu'administrateur Retour : référence vers la connexion """ global l,myConf myConf = Conf.Conf() l = ldap.initialize(myConf.LdapUrl()) l.simple_bind_s("cn=admin,dc=basch,dc=ac-rennes,dc=fr","1&a.!") def __del__ (self): l.unbind_s() def getid (self,cn="index"): """ Recupère l'identifiant du premier groupe libre Récupère sur le serveur LDAP le plus petit gid libre (> 1000) Retour : valeur de l'identifiant """ global l id = l.search_s("cn="+cn+",ou=mygroup,dc=basch,dc=ac-rennes,dc=fr",ldap.SCOPE_SUBTREE,"objectClass=posixGroup",[ "gidNumber" ]) id = id[0][1]["gidNumber"][0] return id def incid (self,curentid,cn='index'): """ Incrémente l'identifiant de groupe Incrémente l'identifiant du plus petit gid libre """ global l dn = "cn="+cn+",ou=mygroup,dc=basch,dc=ac-rennes,dc=fr" ldif = [(ldap.MOD_REPLACE, 'gidNumber',str(int(curentid) + 1))] #old = {'gidNumber':} #new = {'gidNumber':str(int(curentid) +1)} #ldif = modlist.modifyModlist(old,new) #print old l.modify_s(dn,ldif) def addUser (self,type): """Ajout d'un utilisateur Paramètre : chaine sous la forme 'username;nom;nom;prénom;class;password' Soit la chaine est passée en paramèetre du programme Soit lue sur l'entrée standard si $1 = '-' """ global l #Récupération de la chaine contenant les paramètres de l'utilisateur if len(sys.argv) == 1: print "Erreur, vous devez mettre au moins un paramètre" quit() id = self.getid() if sys.argv[1] == '-': ParamU = sys.stdin.readlines() else: ParamU = [sys.argv[1]] if len(sys.argv) == 3: ParamU = ParamU[0:int(sys.argv[2])] if type == 'Student': for i in ParamU: ParamUser = i.strip('\r\n') #Define attribute from parameters #a_Param["uid"],a_Param["sn"],a_Param["givenName"],a_Param["description"],a_Param["userPassword"] = [[x] for x in ParamUser.split(";")] self.addOneStudent(*[[x] for x in ParamUser.split(";")]); id = str(int(id) + 1) self.incid(id) elif type == 'Prof': for i in ParamU: ParamUser = i.strip('\r\n') #Define attribute from parameters #a_Param["uid"],a_Param["sn"],a_Param["givenName"],a_Param["description"],a_Param["userPassword"] = [[x] for x in ParamUser.split(";")] self.addOneProf(*[[x] for x in ParamUser.split(";")]); id = str(int(id) + 1) self.incid(id) #Generic function to add something to ldap from a dn string and a dictionnary def _add(self,dn,a_Param): global l #Ajout à LDAP ldi = modlist.addModlist(a_Param) l.add_s(dn,ldi) ca = l.search_s(dn,ldap.SCOPE_SUBTREE,"objectClass=*") if len(ca) != 0: return 0 #Add one Student def addOneStudent(self,uid,sn,givenname,description = None ,password = None): self.addOnePeople(uid,sn,givenname,description,password,'Student') #Add one Prof def addOneProf(self,uid,sn,givenname,description = None,password = None): self.addOnePeople(uid,sn,givenname,description,password,'Prof') #Add only one person def addOnePeople(self,uid,sn,givenname,description,password,ou): id = self.getid() global myConf if password is None: password = myConf.getDefaultPass() if description is None: description = "NoClass" else: #Parsing the list of class separated by ',' and add the user to groups for cl in description[0].split(","): if ou == 'Prof': cl = 'Prof_'+ cl if not self.ClassExist(cl): self.addOneClass(cl) self.addToAClass(uid,cl) a_Param = {} a_Param["uid"],a_Param["sn"],a_Param["givenName"],a_Param["description"],a_Param["userPassword"] = uid,sn,givenname,description,password #Build missing attributes a_Param["objectclass"] = ['inetOrgPerson','posixAccount','shadowAccount','sambaSamAccount'] a_Param["uidNumber"] = [id] a_Param["gidNumber"] = [id] a_Param["homeDirectory"] = ['/home/' + a_Param["uid"][0]] a_Param["loginShell"] = ['/bin/bash'] a_Param["cn"] = [a_Param["givenName"][0]+ " " + a_Param["sn"][0]] a_Param["sambaSID"] = ['S-1-5-21-4043153765-4081505042-1247131504-512'] dn = "uid=" + a_Param["uid"][0] +",ou="+ou+",ou=People,dc=basch,dc=ac-rennes,dc=fr" print dn print a_Param res = self._add(dn,a_Param) if res == 0: print "Utilisateur "+a_Param["cn"][0]+" ajouté !" self.incid(id) #Delete one user by uid #Return ldap.result() def delOneUser(self,uid): global l,myConf dn = "uid=" + uid + ",ou=Student,ou=People," + myConf.getBaseDn() l.delete_s(dn) return l.result() #DElete a professor by uid #Retrun ldap result def delOneProf(self,uid): global l,myConf dn = "uid=" + uid + ",ou=Prof,ou=People," + myConf.getBaseDn() l.delete_s(dn) return l.result() #Add a class def addOneClass(self,name): global l,myConf #Get the fist gid available id = self.getid('Gindex') dn = "cn=" + name + ",ou=mygroup,"+ myConf.getBaseDn() a_Param = {} a_Param["cn"] = [name] a_Param["objectClass"] = ['posixGroup'] a_Param["gidNumber"] = [id] self._add(dn,a_Param) self.incid(id,'Gindex') #Add someone to a class def addToAClass(self,uid,classname): global l,myConf dn = "cn=" + classname + ",ou=mygroup,"+ myConf.getBaseDn() ldif = [(ldap.MOD_ADD,'memberUid',uid)] res = l.modify_s(dn,ldif) ca = l.search_s(dn,ldap.SCOPE_SUBTREE,"objectClass=*") if ca != 0: print "Utilisateur "+ str(uid) +" ajouté à la classe " + classname #Does this class exist ? def ClassExist(self,classname): global l,myConf dn = "ou=mygroup,"+ myConf.getBaseDn() id = l.search_s(dn,ldap.SCOPE_SUBTREE,"cn="+classname, None) if str(id) != "[]": print "Classe existante :"+classname return True else: print "Classe inexistante :"+classname return False