diff --git a/lc_ldap.py b/lc_ldap.py index bf8bac3..3abe27e 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -90,6 +90,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject): if user and not re.match('[a-z_][a-z0-9_-]*', user): raise ValueError('Invalid user name: %s' % user) + # Si un username, on récupère le dn associé if user and not dn: self.simple_bind_s(base_dn) res = self.search_s(base_dn, 1, 'uid=%s' % user) @@ -99,6 +100,9 @@ class lc_ldap(ldap.ldapobject.LDAPObject): raise ldap.INVALID_CREDENTIALS({'desc': 'Too many matches: uid=%s' % user }) else: dn = res[0][0] + + # Si on a un dn, on se connecte avec à la base ldap sinon on s'y + # connecte en anonyme if dn: self.conn = self.bind_s(dn, cred) self.dn = dn @@ -109,16 +113,23 @@ class lc_ldap(ldap.ldapobject.LDAPObject): self.droits = [] def search(self, filterstr='(objectClass=*)', mode='ro', dn= base_dn, scope= 2, sizelimit=400): + """La fonction de recherche dans la base ldap qui renvoie un liste de + CransLdapObjects. On utilise la feature de sizelimit de python ldap""" res = self.search_ext_s(dn, scope, filterstr, sizelimit=sizelimit) return [ new_cransldapobject(self, r[0], mode=mode) for r in res ] def allMachines(self): - """Renvoie la liste de toutes les machines, - Conçue pour s'éxécuter le plus rapidement possible""" + """Renvoie la liste de toutes les machines, Conçue pour + s'éxécuter le plus rapidement possible. On dumpe malgré tout + toute la base, c'est pour pouvoir aussi rajouter à moindre coût + les propriétaires.""" res = {} machines = [] + # On récupère tous les objets ldap et on les met dans un dico + # (proxying de la base ldap) for dn, attrs in self.search_s(base_dn, scope=2): res[dn] = attrs + # On crée la liste des machines for dn, attrs in res.items(): if dn.startswith('mid='): m = new_cransldapobject(self, dn, ldif = attrs) @@ -155,10 +166,13 @@ class lc_ldap(ldap.ldapobject.LDAPObject): else: raise ValueError("Realm inconnu: %s" % realm) + # On récupère la plage des mids if realm == 'fil': plage = xrange(256, 2047) else: plage = xrange( *(config.mid[realm])) + # On récupère le premier id libre dans la plages s'il n'est pas + # déjà précisé dans le ldiff mid = uldif.setdefault('mid', [ unicode(self._find_id('mid', plage)) ]) uldif['ipHostNumber'] = [ unicode(crans_utils.ip_of_mid(int (mid[0]))) ] return self._create_entity('mid=%s,%s' % (mid[0], parent), uldif) @@ -180,20 +194,18 @@ class lc_ldap(ldap.ldapobject.LDAPObject): def _create_entity(self, dn, uldif): '''Crée une nouvelle entité ldap en dn, avec attributs ldif: uniquement en unicode''' + # Conversion en cldiff pour vérification des valeurs cldif = ldif_to_cldif(uldif, self) - #lock = CransLock(self) - # for item in ['aid', 'uid', 'chbre', 'mailAlias', 'canonicalAlias', - # 'fid', 'cid', 'mid', 'macAddress', 'host', 'hostAlias' ]: - # for val in cldif.get(item, []): - # lock.add(item, val) + # Conversion en ascii ldif = cldif_to_ldif(cldif) + # Création de la requête LDAP modlist = addModlist(ldif) - #with lock: - # print dn, modlist - # + # Requête LDAP de création de l'objet self.add_s(dn, modlist) + # Renvoi du CransLdapObject return new_cransldapobject(self, dn, mode='w') + def _find_id(self, attr, plage = xrange(1, 32000)): '''Trouve un id libre dans plage''' res = self.search_s(base_dn, 2, '%s=*' % attr, attrlist = [attr]) @@ -211,12 +223,6 @@ class lc_ldap(ldap.ldapobject.LDAPObject): (attr, plage[0], i)) return i - # def _hist(self, msg): - # now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M : ') - # return unicode(now) + msg - - # ? def reconnect(self, conn=None): - def new_cransldapobject(conn, dn, mode='ro', ldif = None): """Crée un objet CransLdap en utilisant la classe correspondant à @@ -290,10 +296,6 @@ class CransLdapObject(object): if self.mode not in ['w', 'rw']: raise EnvironmentError("Objet en lecture seule, réessayer en lecture/écriture") - # Vérifications et Historique - #histo = self._gen_hist(self._modifs) - #self._modifs['historique'] += histo - # On récupère la liste des modifications modlist = self.get_modlist() self.conn.modify_s(self.dn, modlist)