diff --git a/lc_ldap.py b/lc_ldap.py index 98c3e7f..a228838 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -39,6 +39,7 @@ import os import sys import re +from contextlib import contextmanager import ldap @@ -270,18 +271,30 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): _, adherents = self.allMachinesAdherents(mode) return adherents + @contextmanager def newMachine(self, parent, realm, mldif, login=None): - """Crée une nouvelle machine: ``realm`` peut être: + """ + Crée une nouvelle machine: ``realm`` peut être: fil, adherents-v6, wifi, wifi-adh-v6, adm, gratuit, personnel-ens, special mldif est un uldif pour la machine - --Partiellement implémenté""" + --Partiellement implémenté + + Doit être utilisé avec un context manager, c'est à dire comme ci-dessous : + 1: with newMachine(parent, realm, mldif) as machine: + 2: machine.create() + 3: print machine + La fonction est executé jusqu'au yield à la ligne 1, puis son exécution reprend + au niveau du yield jusqu'à la fin de la fonction à la ligne 3, en sortant du contexte + Une fois sorti du contexte, il n'est plus possible d'effectuer des actions d'écriture + sur l'objet. + """ + lockId = self.lockholder.newid() # On ne veut pas modifier mldif directement uldif = copy.deepcopy(mldif) if login is None: login = self.current_login #adm, serveurs, bornes, wifi, adherents, gratuit ou personnel-ens""" owner = self.search(u'objectClass=*', dn=parent, scope=0)[0] - lockId = self.lockholder.newid() if realm in ["adm", "serveurs", "serveurs-v6", "adm-v6"]: uldif['objectClass'] = [u'machineCrans'] @@ -302,76 +315,120 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): else: raise ValueError("Realm inconnu: %r" % realm) - # On récupère le premier id libre dans la plages s'il n'est pas - # déjà précisé dans le ldif - rid = uldif.setdefault('rid', [unicode(self._find_id('rid', realm, lockId=lockId))]) + try: + # On récupère le premier id libre dans la plages s'il n'est pas + # déjà précisé dans le ldif + rid = uldif.setdefault('rid', [unicode(self._find_id('rid', realm, lockId=lockId))]) - # La machine peut-elle avoir une ipv4 ? - if 'v6' not in realm: - uldif['ipHostNumber'] = [ unicode(crans_utils.ip4_of_rid(int(rid[0]))) ] + # La machine peut-elle avoir une ipv4 ? + if 'v6' not in realm: + uldif['ipHostNumber'] = [ unicode(crans_utils.ip4_of_rid(int(rid[0]))) ] - ip6 = unicode(crans_utils.ip6_of_mac(uldif['macAddress'][0], int(rid[0]))) - uldif['ip6HostNumber'] = [ ip6 ] if ip6 else [] + ip6 = unicode(crans_utils.ip6_of_mac(uldif['macAddress'][0], int(rid[0]))) + uldif['ip6HostNumber'] = [ ip6 ] if ip6 else [] - # Mid - uldif['mid'] = [ unicode(self._find_id('mid', lockId=lockId)) ] + # Mid + uldif['mid'] = [ unicode(self._find_id('mid', lockId=lockId)) ] - # Tout doit disparaître !! - machine = self._create_entity('mid=%s,%s' % (uldif['mid'][0], parent), uldif, lockId) - if machine.may_be(variables.created, self.droits + self._check_parent(machine.dn)): - return machine - else: - raise EnvironmentError("Vous n'avez pas le droit de créer cette machine.") + # Tout doit disparaître !! + machine = self._create_entity('mid=%s,%s' % (uldif['mid'][0], parent), uldif, lockId) + machine.__enter__() + if machine.may_be(variables.created, self.droits + self._check_parent(machine.dn)): + yield machine + else: + raise EnvironmentError("Vous n'avez pas le droit de créer cette machine.") + finally: + try: + machine.__exit__(None, None, None) + except NameError: + self.lockholder.purge(lockId) + @contextmanager def newAdherent(self, aldif): - """Crée un nouvel adhérent""" + """Crée un nouvel adhérent + Doit être utilisé avec un context manager, voir newMachine pour plus de détails""" lockId = self.lockholder.newid() uldif = copy.deepcopy(aldif) - aid = uldif.setdefault('aid', [ unicode(self._find_id('aid', lockId=lockId)) ]) - uldif['objectClass'] = [u'adherent'] - adherent = self._create_entity('aid=%s,%s' % (aid[0], variables.base_dn), uldif, lockId) - if adherent.may_be(variables.created, self.droits): - return adherent - else: - raise EnvironmentError("Vous n'avez pas le droit de créer cet adhérent.") + try: + aid = uldif.setdefault('aid', [ unicode(self._find_id('aid', lockId=lockId)) ]) + uldif['objectClass'] = [u'adherent'] + adherent = self._create_entity('aid=%s,%s' % (aid[0], variables.base_dn), uldif, lockId) + adherent.__enter__() + if adherent.may_be(variables.created, self.droits): + yield adherent + else: + raise EnvironmentError("Vous n'avez pas le droit de créer cet adhérent.") + finally: + try: + adherent.__exit__(None, None, None) + except NameError: + self.lockholder.purge(lockId) + @contextmanager def newClub(self, cldif): - """Crée un nouveau club""" + """Crée un nouveau club + Doit être utilisé avec un context manager, voir newMachine pour plus de détails""" lockId = self.lockholder.newid() uldif = copy.deepcopy(cldif) - cid = uldif.setdefault('cid', [ unicode(self._find_id('cid', lockId=lockId)) ]) - uldif['objectClass'] = [u'club'] - club = self._create_entity('cid=%s,%s' % (cid[0], variables.base_dn), uldif, lockId) - if club.may_be(variables.created, self.droits): - return club - else: - raise EnvironmentError("Vous n'avez pas le droit de créer cet adhérent.") + try: + cid = uldif.setdefault('cid', [ unicode(self._find_id('cid', lockId=lockId)) ]) + uldif['objectClass'] = [u'club'] + club = self._create_entity('cid=%s,%s' % (cid[0], variables.base_dn), uldif, lockId) + club.__enter__() + if club.may_be(variables.created, self.droits): + yield club + else: + raise EnvironmentError("Vous n'avez pas le droit de créer cet adhérent.") + finally: + try: + club.__exit__(None, None, None) + except NameError: + self.lockholder.purge(lockId) + @contextmanager def newFacture(self, parent, fldif): - """Crée une nouvelle facture""" + """Crée une nouvelle facture + Doit être utilisé avec un context manager, voir newMachine pour plus de détails""" lockId = self.lockholder.newid() uldif = copy.deepcopy(fldif) - # fid - uldif['fid'] = [ unicode(self._find_id('fid', lockId=lockId)) ] - uldif['objectClass'] = [u'facture'] - facture = self._create_entity('fid=%s,%s' % (uldif['fid'][0], parent), uldif, lockId) - if facture.may_be(variables.created, self.droits + self._check_parent(facture.dn)): - return facture - else: - raise EnvironmentError("Vous n'avez pas le droit de créer cette facture.") + try: + # fid + uldif['fid'] = [ unicode(self._find_id('fid', lockId=lockId)) ] + uldif['objectClass'] = [u'facture'] + facture = self._create_entity('fid=%s,%s' % (uldif['fid'][0], parent), uldif, lockId) + facture.__enter__() + if facture.may_be(variables.created, self.droits + self._check_parent(facture.dn)): + yield facture + else: + raise EnvironmentError("Vous n'avez pas le droit de créer cette facture.") + finally: + try: + facture.__exit__(None, None, None) + except NameError: + self.lockholder.purge(lockId) + + @contextmanager def newCertificat(self, parent, xldif): - """Crée un nouveau certificat x509""" + """Crée un nouveau certificat x509 + Doit être utilisé avec un context manager, voir newMachine pour plus de détails""" lockId = self.lockholder.newid() uldif = copy.deepcopy(xldif) - # xid - uldif['xid'] = [ unicode(self._find_id('xid', lockId=lockId)) ] - uldif['objectClass'] = [u'baseCert'] - baseCert = self._create_entity('xid=%s,%s' % (uldif['xid'][0], parent), uldif, lockId) - if baseCert.may_be(variables.created, self.droits + self._check_parent(baseCert.dn)): - return baseCert - else: - raise EnvironmentError("Vous n'avez pas le droit de créer ce certiticat.") + try: + # xid + uldif['xid'] = [ unicode(self._find_id('xid', lockId=lockId)) ] + uldif['objectClass'] = [u'baseCert'] + baseCert = self._create_entity('xid=%s,%s' % (uldif['xid'][0], parent), uldif, lockId) + baseCert.__enter__() + if baseCert.may_be(variables.created, self.droits + self._check_parent(baseCert.dn)): + yield baseCert + else: + raise EnvironmentError("Vous n'avez pas le droit de créer ce certiticat.") + finally: + try: + baseCert.__exit__(None, None, None) + except NameError: + self.lockholder.purge(lockId) def _create_entity(self, dn, uldif, lockId): '''Crée une nouvelle entité ldap avec le dn ``dn`` et les