[lc_ldap] Utilisation des fonctions newMachine, newAdherent, newClub, ... comme un context manager
This commit is contained in:
parent
79149ebb4f
commit
879bebbae2
1 changed files with 110 additions and 53 deletions
163
lc_ldap.py
163
lc_ldap.py
|
@ -39,6 +39,7 @@
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
import ldap
|
import ldap
|
||||||
|
|
||||||
|
@ -270,18 +271,30 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
|
||||||
_, adherents = self.allMachinesAdherents(mode)
|
_, adherents = self.allMachinesAdherents(mode)
|
||||||
return adherents
|
return adherents
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
def newMachine(self, parent, realm, mldif, login=None):
|
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
|
fil, adherents-v6, wifi, wifi-adh-v6, adm, gratuit, personnel-ens, special
|
||||||
mldif est un uldif pour la machine
|
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
|
# On ne veut pas modifier mldif directement
|
||||||
uldif = copy.deepcopy(mldif)
|
uldif = copy.deepcopy(mldif)
|
||||||
if login is None:
|
if login is None:
|
||||||
login = self.current_login
|
login = self.current_login
|
||||||
#adm, serveurs, bornes, wifi, adherents, gratuit ou personnel-ens"""
|
#adm, serveurs, bornes, wifi, adherents, gratuit ou personnel-ens"""
|
||||||
owner = self.search(u'objectClass=*', dn=parent, scope=0)[0]
|
owner = self.search(u'objectClass=*', dn=parent, scope=0)[0]
|
||||||
lockId = self.lockholder.newid()
|
|
||||||
|
|
||||||
if realm in ["adm", "serveurs", "serveurs-v6", "adm-v6"]:
|
if realm in ["adm", "serveurs", "serveurs-v6", "adm-v6"]:
|
||||||
uldif['objectClass'] = [u'machineCrans']
|
uldif['objectClass'] = [u'machineCrans']
|
||||||
|
@ -302,76 +315,120 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
|
||||||
else:
|
else:
|
||||||
raise ValueError("Realm inconnu: %r" % realm)
|
raise ValueError("Realm inconnu: %r" % realm)
|
||||||
|
|
||||||
# On récupère le premier id libre dans la plages s'il n'est pas
|
try:
|
||||||
# déjà précisé dans le ldif
|
# On récupère le premier id libre dans la plages s'il n'est pas
|
||||||
rid = uldif.setdefault('rid', [unicode(self._find_id('rid', realm, lockId=lockId))])
|
# 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 ?
|
# La machine peut-elle avoir une ipv4 ?
|
||||||
if 'v6' not in realm:
|
if 'v6' not in realm:
|
||||||
uldif['ipHostNumber'] = [ unicode(crans_utils.ip4_of_rid(int(rid[0]))) ]
|
uldif['ipHostNumber'] = [ unicode(crans_utils.ip4_of_rid(int(rid[0]))) ]
|
||||||
|
|
||||||
ip6 = unicode(crans_utils.ip6_of_mac(uldif['macAddress'][0], int(rid[0])))
|
ip6 = unicode(crans_utils.ip6_of_mac(uldif['macAddress'][0], int(rid[0])))
|
||||||
uldif['ip6HostNumber'] = [ ip6 ] if ip6 else []
|
uldif['ip6HostNumber'] = [ ip6 ] if ip6 else []
|
||||||
|
|
||||||
# Mid
|
# Mid
|
||||||
uldif['mid'] = [ unicode(self._find_id('mid', lockId=lockId)) ]
|
uldif['mid'] = [ unicode(self._find_id('mid', lockId=lockId)) ]
|
||||||
|
|
||||||
# Tout doit disparaître !!
|
# Tout doit disparaître !!
|
||||||
machine = self._create_entity('mid=%s,%s' % (uldif['mid'][0], parent), uldif, lockId)
|
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)):
|
machine.__enter__()
|
||||||
return machine
|
if machine.may_be(variables.created, self.droits + self._check_parent(machine.dn)):
|
||||||
else:
|
yield machine
|
||||||
raise EnvironmentError("Vous n'avez pas le droit de créer cette 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):
|
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()
|
lockId = self.lockholder.newid()
|
||||||
uldif = copy.deepcopy(aldif)
|
uldif = copy.deepcopy(aldif)
|
||||||
aid = uldif.setdefault('aid', [ unicode(self._find_id('aid', lockId=lockId)) ])
|
try:
|
||||||
uldif['objectClass'] = [u'adherent']
|
aid = uldif.setdefault('aid', [ unicode(self._find_id('aid', lockId=lockId)) ])
|
||||||
adherent = self._create_entity('aid=%s,%s' % (aid[0], variables.base_dn), uldif, lockId)
|
uldif['objectClass'] = [u'adherent']
|
||||||
if adherent.may_be(variables.created, self.droits):
|
adherent = self._create_entity('aid=%s,%s' % (aid[0], variables.base_dn), uldif, lockId)
|
||||||
return adherent
|
adherent.__enter__()
|
||||||
else:
|
if adherent.may_be(variables.created, self.droits):
|
||||||
raise EnvironmentError("Vous n'avez pas le droit de créer cet adhérent.")
|
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):
|
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()
|
lockId = self.lockholder.newid()
|
||||||
uldif = copy.deepcopy(cldif)
|
uldif = copy.deepcopy(cldif)
|
||||||
cid = uldif.setdefault('cid', [ unicode(self._find_id('cid', lockId=lockId)) ])
|
try:
|
||||||
uldif['objectClass'] = [u'club']
|
cid = uldif.setdefault('cid', [ unicode(self._find_id('cid', lockId=lockId)) ])
|
||||||
club = self._create_entity('cid=%s,%s' % (cid[0], variables.base_dn), uldif, lockId)
|
uldif['objectClass'] = [u'club']
|
||||||
if club.may_be(variables.created, self.droits):
|
club = self._create_entity('cid=%s,%s' % (cid[0], variables.base_dn), uldif, lockId)
|
||||||
return club
|
club.__enter__()
|
||||||
else:
|
if club.may_be(variables.created, self.droits):
|
||||||
raise EnvironmentError("Vous n'avez pas le droit de créer cet adhérent.")
|
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):
|
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()
|
lockId = self.lockholder.newid()
|
||||||
uldif = copy.deepcopy(fldif)
|
uldif = copy.deepcopy(fldif)
|
||||||
# fid
|
try:
|
||||||
uldif['fid'] = [ unicode(self._find_id('fid', lockId=lockId)) ]
|
# fid
|
||||||
uldif['objectClass'] = [u'facture']
|
uldif['fid'] = [ unicode(self._find_id('fid', lockId=lockId)) ]
|
||||||
facture = self._create_entity('fid=%s,%s' % (uldif['fid'][0], parent), uldif, lockId)
|
uldif['objectClass'] = [u'facture']
|
||||||
if facture.may_be(variables.created, self.droits + self._check_parent(facture.dn)):
|
facture = self._create_entity('fid=%s,%s' % (uldif['fid'][0], parent), uldif, lockId)
|
||||||
return facture
|
facture.__enter__()
|
||||||
else:
|
if facture.may_be(variables.created, self.droits + self._check_parent(facture.dn)):
|
||||||
raise EnvironmentError("Vous n'avez pas le droit de créer cette facture.")
|
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):
|
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()
|
lockId = self.lockholder.newid()
|
||||||
uldif = copy.deepcopy(xldif)
|
uldif = copy.deepcopy(xldif)
|
||||||
# xid
|
try:
|
||||||
uldif['xid'] = [ unicode(self._find_id('xid', lockId=lockId)) ]
|
# xid
|
||||||
uldif['objectClass'] = [u'baseCert']
|
uldif['xid'] = [ unicode(self._find_id('xid', lockId=lockId)) ]
|
||||||
baseCert = self._create_entity('xid=%s,%s' % (uldif['xid'][0], parent), uldif, lockId)
|
uldif['objectClass'] = [u'baseCert']
|
||||||
if baseCert.may_be(variables.created, self.droits + self._check_parent(baseCert.dn)):
|
baseCert = self._create_entity('xid=%s,%s' % (uldif['xid'][0], parent), uldif, lockId)
|
||||||
return baseCert
|
baseCert.__enter__()
|
||||||
else:
|
if baseCert.may_be(variables.created, self.droits + self._check_parent(baseCert.dn)):
|
||||||
raise EnvironmentError("Vous n'avez pas le droit de créer ce certiticat.")
|
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):
|
def _create_entity(self, dn, uldif, lockId):
|
||||||
'''Crée une nouvelle entité ldap avec le dn ``dn`` et les
|
'''Crée une nouvelle entité ldap avec le dn ``dn`` et les
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue