On utilise un champ ldap_name pour savoir quelle classe doit être utilisée pour instancier quel objet/attribut LDAP.
Et comme ça on fiche à la poubelle le dégueulasse globals() et on décorrelle les noms des classes des noms LDAP.
This commit is contained in:
parent
294f7ce949
commit
c392a2a986
3 changed files with 391 additions and 170 deletions
70
lc_ldap.py
70
lc_ldap.py
|
@ -53,9 +53,10 @@ try:
|
|||
from Levenshtein import jaro
|
||||
except ImportError:
|
||||
def jaro(a, b): return 0
|
||||
sys.path.append('/usr/scripts/gestion')
|
||||
|
||||
sys.path.append('/usr/scripts/gestion')
|
||||
import config
|
||||
|
||||
import crans_utils
|
||||
import attributs
|
||||
import ldap_locks
|
||||
|
@ -71,9 +72,9 @@ created = 'created'
|
|||
modified = 'modified'
|
||||
deleted = 'deleted'
|
||||
|
||||
# Pour enregistrer dans l'historique, on a besoin de savoir qui exécute le script
|
||||
# Si le script a été exécuté via un sudo, la variable SUDO_USER (l'utilisateur qui a effectué le sudo)
|
||||
# est plus pertinente que USER (qui sera root)
|
||||
#: Pour enregistrer dans l'historique, on a besoin de savoir qui exécute le script
|
||||
#: Si le script a été exécuté via un sudo, la variable SUDO_USER (l'utilisateur qui a effectué le sudo)
|
||||
#: est plus pertinente que USER (qui sera root)
|
||||
current_user = os.getenv("SUDO_USER") or os.getenv("USER")
|
||||
|
||||
# Quand on a besoin du fichier de secrets
|
||||
|
@ -84,7 +85,7 @@ def import_secrets():
|
|||
import secrets
|
||||
return secrets
|
||||
|
||||
# Champs à ignorer dans l'historique
|
||||
#: Champs à ignorer dans l'historique
|
||||
HIST_IGNORE_FIELDS = ["modifiersName", "entryCSN", "modifyTimestamp", "historique"]
|
||||
|
||||
def escape(chaine):
|
||||
|
@ -453,9 +454,9 @@ class lc_ldap_local(lc_ldap):
|
|||
|
||||
|
||||
def new_cransldapobject(conn, dn, mode='ro', ldif = None):
|
||||
"""Crée un objet :py:class:`CransLdap` en utilisant la classe correspondant à
|
||||
"""Crée un objet :py:class:`CransLdapObject` en utilisant la classe correspondant à
|
||||
l'``objectClass`` du ``ldif``
|
||||
--pour usage interne à la libraire uniquement !"""
|
||||
--pour usage interne à la librairie uniquement !"""
|
||||
|
||||
classe = None
|
||||
|
||||
|
@ -464,13 +465,13 @@ def new_cransldapobject(conn, dn, mode='ro', ldif = None):
|
|||
elif dn == invite_dn:
|
||||
classe = BaseInvites
|
||||
elif ldif:
|
||||
classe = globals()[ldif['objectClass'][0]]
|
||||
classe = ObjectFactory.get(ldif['objectClass'][0])
|
||||
else:
|
||||
res = conn.search_s(dn, 0)
|
||||
if not res:
|
||||
raise ValueError ('objet inexistant: %s' % dn)
|
||||
_, attrs = res[0]
|
||||
classe = globals()[attrs['objectClass'][0]]
|
||||
classe = ObjectFactory.get(attrs['objectClass'][0])
|
||||
|
||||
return classe(conn, dn, mode, ldif)
|
||||
|
||||
|
@ -793,6 +794,36 @@ class CransLdapObject(object):
|
|||
|
||||
self._modifs.setdefault('blacklist', []).append(bl)
|
||||
|
||||
class ObjectFactory(object):
|
||||
"""Utilisée pour enregistrer toutes les classes servant à instancier un objet LDAP.
|
||||
Elle sert à les récupérer à partir de leur nom LDAP.
|
||||
|
||||
Cette classe n'est jamais instanciée.
|
||||
|
||||
"""
|
||||
_classes = {}
|
||||
|
||||
@classmethod
|
||||
def register(cls, name, classe):
|
||||
"""Enregistre l'association ``name`` -> ``classe``"""
|
||||
cls._classes[name] = classe
|
||||
|
||||
@classmethod
|
||||
def get(cls, name):
|
||||
"""Retourne la classe qui a ``name`` pour ``ldap_name``.
|
||||
|
||||
Pas de fallback, on ne veut pas instancier des objets de manière hasardeuse.
|
||||
"""
|
||||
return cls._classes.get(name)
|
||||
|
||||
def crans_object(classe):
|
||||
"""Pour décorer les classes permettant d'instancier des attributs LDAP,
|
||||
afin de les enregistrer dans :py:class:`ObjectFactory`.
|
||||
|
||||
"""
|
||||
ObjectFactory.register(classe.ldap_name, classe)
|
||||
return classe
|
||||
|
||||
|
||||
class proprio(CransLdapObject):
|
||||
u""" Un propriétaire de machine (adhérent, club…) """
|
||||
|
@ -944,6 +975,7 @@ class BaseInvites(proprio):
|
|||
pass
|
||||
|
||||
|
||||
@crans_object
|
||||
class adherent(proprio):
|
||||
u"""Adhérent crans."""
|
||||
attribs = proprio.attribs + [attributs.aid, attributs.prenom, attributs.tel,
|
||||
|
@ -951,6 +983,7 @@ class adherent(proprio):
|
|||
attributs.derniereConnexion, attributs.gpgFingerprint,
|
||||
attributs.carteEtudiant, attributs.droits, attributs.etudes,
|
||||
attributs.postalAddress, attributs.mailExt, attributs.compteWiki]
|
||||
ldap_name = "adherent"
|
||||
|
||||
def __init__(self, conn, dn, mode='ro', ldif = None):
|
||||
super(adherent, self).__init__(conn, dn, mode, ldif)
|
||||
|
@ -1028,17 +1061,22 @@ class adherent(proprio):
|
|||
raise EnvironmentError("L'adhérent n'a pas de compte crans")
|
||||
|
||||
|
||||
@crans_object
|
||||
class club(proprio):
|
||||
u"""Club crans"""
|
||||
attribs = proprio.attribs + [attributs.cid, attributs.responsable, attributs.imprimeurClub]
|
||||
ldap_name = "club"
|
||||
|
||||
@crans_object
|
||||
class machineFixe(machine):
|
||||
u"""Machine fixe"""
|
||||
pass
|
||||
ldap_name = "machineFixe"
|
||||
|
||||
@crans_object
|
||||
class machineWifi(machine):
|
||||
u"""Machine wifi"""
|
||||
attribs = machine.attribs + [attributs.ipsec]
|
||||
ldap_name = "machineWifi"
|
||||
|
||||
def set_ipv4(self, login=None):
|
||||
u"""Définie une ipv4 à la machine si elle n'est possède pas déjà une."""
|
||||
|
@ -1053,13 +1091,16 @@ class machineWifi(machine):
|
|||
dhcp=dydhcp()
|
||||
dhcp.add_host(str(self['ipHostNumber'][0]), str(self['macAddress'][0]), str(self['host'][0]))
|
||||
|
||||
@crans_object
|
||||
class machineCrans(machine):
|
||||
can_be_by = { created: [attributs.nounou],
|
||||
modified: [attributs.nounou],
|
||||
deleted: [attributs.nounou],
|
||||
}
|
||||
attribs = machine.attribs + [attributs.prise, attributs.nombrePrises]
|
||||
ldap_name = "machineCrans"
|
||||
|
||||
@crans_object
|
||||
class borneWifi(machine):
|
||||
can_be_by = { created: [attributs.nounou],
|
||||
modified: [attributs.nounou],
|
||||
|
@ -1067,16 +1108,21 @@ class borneWifi(machine):
|
|||
}
|
||||
attribs = machine.attribs + [attributs.canal, attributs.puissance, attributs.hotspot,
|
||||
attributs.prise, attributs.positionBorne, attributs.nvram]
|
||||
ldap_name = "borneWifi"
|
||||
|
||||
@crans_object
|
||||
class facture(CransLdapObject):
|
||||
can_be_by = { created: [attributs.nounou, attributs.bureau, attributs.cableur],
|
||||
modified: [attributs.nounou, attributs.bureau, attributs.cableur],
|
||||
deleted: [attributs.nounou, attributs.bureau, attributs.cableur],
|
||||
}
|
||||
attribs = [attributs.fid, attributs.modePaiement, attributs.recuPaiement]
|
||||
ldap_name = "facture"
|
||||
|
||||
@crans_object
|
||||
class service(CransLdapObject):
|
||||
pass
|
||||
ldap_name = "service"
|
||||
|
||||
@crans_object
|
||||
class lock(CransLdapObject):
|
||||
pass
|
||||
ldap_name = "lock"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue