[lc_ldap] Utilisation des fonctions newMachine, newAdherent, newClub, ... comme un context manager

This commit is contained in:
Valentin Samir 2014-03-02 01:49:16 +01:00
parent 79149ebb4f
commit 879bebbae2

View file

@ -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