[ldap_crans.py] stop doing drugs

Ignore-this: 7bf92831b6ce1ec3bfc77b63fea84f9b

darcs-hash:20090929232441-ffbb2-460922e5b3d9b77c114ea159be21e36985aef064.gz
This commit is contained in:
Nicolas Dandrimont 2009-09-30 01:24:41 +02:00
parent fd5cca07f2
commit 80898c00d4
2 changed files with 57 additions and 191 deletions

View file

@ -191,7 +191,7 @@ def set_etudes(adher):
arg += u'"P4" "Université Paris Sorbonne" ' arg += u'"P4" "Université Paris Sorbonne" '
arg += u'"P5" "Université René Descartes" ' arg += u'"P5" "Université René Descartes" '
arg += u'"P6" "Université Pierre et Marie Curie" ' arg += u'"P6" "Université Pierre et Marie Curie" '
arg += u'"P7" "Université Paris Diderot" ' arg += u'"P7" "Université Denis Diderot" '
arg += u'"P8" "Université Vincennes Saint Denis" ' arg += u'"P8" "Université Vincennes Saint Denis" '
arg += u'"P9" "Université Paris Dauphine" ' arg += u'"P9" "Université Paris Dauphine" '
arg += u'"P10" "Université de Nanterre" ' arg += u'"P10" "Université de Nanterre" '

View file

@ -228,8 +228,7 @@ def format_mac(mac):
### Définition des classes ### Définition des classes
class Service: class Service:
u"Définit un service à redémarrer" u""" Définit un service à redémarrer """
def __init__(self, nom, args=[], start=[]): def __init__(self, nom, args=[], start=[]):
""" """
Nom du service Nom du service
@ -257,7 +256,7 @@ class Service:
def __str__(self): def __str__(self):
return self.__unicode__().encode("utf-8", "ignore") return self.__unicode__().encode("utf-8", "ignore")
class CransLdap(dict): class CransLdap:
""" """
Classe de connexion à la base LDAP du crans. Classe de connexion à la base LDAP du crans.
""" """
@ -330,31 +329,17 @@ class CransLdap(dict):
'borneWifi': 2, 'borneWifi': 2,
'facture': 2} 'facture': 2}
def __init__(self, **kw): def __init__(self, readonly=False):
"""Fonction d'initialisation. self.connect(readonly)
Marche en 2 temps: initialise la connexion ldap, puis initialise
le dictionnaire."""
self.__obj_init__(**kw)
self.__dict_init__(**kw)
def __obj_init__(self, readonly = False, conn = None, **kw):
"""Initialisation de la connexion à la base LDAP.
Cette connexion sera réutilisée pour tous les objets créés
depuis cet objet (notamment grâce à la méthode make)"""
if not self.conn:
self.conn = conn
if not self.conn:
self.connect(readonly)
def __del__(self): def __del__(self):
"Destruction de l'objet, et surtout des locks."
# Destruction des locks résiduels # Destruction des locks résiduels
if hasattr(self, '_locks'): if hasattr(self, '_locks'):
for lock in self._locks: for lock in self._locks:
self.remove_lock(lock) self.remove_lock(lock)
def connect(self, readonly=False): def connect(self, readonly=False):
u"Initialisation la connexion vers le serveur LDAP" u""" Initialisation la connexion vers le serveur LDAP """
if readonly: if readonly:
self.conn = ldap.initialize(ro_uri) self.conn = ldap.initialize(ro_uri)
return return
@ -374,8 +359,9 @@ class CransLdap(dict):
time.sleep(0.3) time.sleep(0.3)
def exist(self, arg): def exist(self, arg):
"""Vérifie l'existence d'une entrée dans la base et que cette entrée u"""
n'appartient pas à l'objet en cours. Vérifie l'existence d'une entrée dans la base et que cette
entrée n'appartient pas à l'objet en cours.
La méthode prend en compte les locks. La méthode prend en compte les locks.
@ -607,12 +593,12 @@ class CransLdap(dict):
# On récupère la bonne classe # On récupère la bonne classe
nom_classe = (entry[1].get('objectClass') or ['none'])[0] nom_classe = (entry[1].get('objectClass') or ['none'])[0]
nom_classe = nom_classe[0].upper() + nom_classe[1:] nom_classe = nom_classe[0].upper() + nom_classe[1:]
#try: try:
classe = eval(nom_classe) classe = eval(nom_classe)
# On crée l'objet # On crée l'objet
return classe(data= entry, mode= mode, conn= self.conn) return classe(entry, mode, self.conn)
#except: except:
# raise ValueError(u"Impossible de créer l'objet %s" % nom_classe) raise ValueError(u"Impossible de créer l'objet %s" % nom_classe)
def search(self, expression, mode=''): def search(self, expression, mode=''):
@ -894,16 +880,6 @@ class CransLdap(dict):
return self.__machines return self.__machines
########################################################################
# Méthodes pour fournir une interface proche d'un dictionnaire
def __dict_init__(self, dico= {}, **kw):
for lbl, value in dico.items(): dict.__setitem__(self, lbl, value)
def init_locks(self, locks): self._locks = locks
def copy(self):
new = self.__class__(conn = self.conn, dico = self)
new._locks = self._locks
return new
############################################################################# #############################################################################
class BaseClasseCrans(CransLdap): class BaseClasseCrans(CransLdap):
@ -1331,7 +1307,7 @@ class BaseClasseCrans(CransLdap):
class BaseProprietaire(BaseClasseCrans): class BaseProprietaire(BaseClasseCrans):
u""" Méthodes de bases pour les classes Adherent et Club """ u""" Méthodes de bases pour les classes Adherent et Club """
def __obj_init__(self, mode='', conn= None, **kw): def __init__(self, data=(), mode='', conn=None):
u""" u"""
Si data est fourni initialise l'adhérent avec les valeurs données Si data est fourni initialise l'adhérent avec les valeurs données
Format de data : tuple comme retourné par une recherche dans la base ldap: Format de data : tuple comme retourné par une recherche dans la base ldap:
@ -1343,16 +1319,14 @@ class BaseProprietaire(BaseClasseCrans):
conn est une instance de la classe de connexion à la base LDAP conn est une instance de la classe de connexion à la base LDAP
""" """
self.conn = conn
if not self.conn:
self.connect()
# Initialisation de la connexion à zelda
BaseClasseCrans.__obj_init__(self, conn = conn)
data = kw.get('data', ())
if type(data) != tuple: if type(data) != tuple:
raise TypeError raise TypeError
self.modifs = {} self.modifs = {}
data = kw.get('data', ())
if data: if data:
self.dn = data[0] self.dn = data[0]
if mode == 'w': if mode == 'w':
@ -1373,7 +1347,6 @@ class BaseProprietaire(BaseClasseCrans):
self._init_data = {} self._init_data = {}
self._modifiable = 'w' self._modifiable = 'w'
def chsh(self, new=None): def chsh(self, new=None):
u""" Retourne ou change le shell de l'adhérent """ u""" Retourne ou change le shell de l'adhérent """
if new == None: if new == None:
@ -1838,34 +1811,6 @@ class BaseProprietaire(BaseClasseCrans):
return self._data[champ] return self._data[champ]
########################################################################
# définition des méthodes de dictionnaire
def __setitem__(self, lbl, value):
# on exécute la parente
BaseClasseCrans.__setitem__(self, lbl, value)
# on fait des trucs sur les labels qui nous intéressent
if lbl in ['+p', '+c']:
if value == True: self.controle(lbl)
elif value == False: self.controle('-' + lbl[1])
else: raise ValueError(lbl + u'doit être True ou False')
elif lbl == 'shell': self.chsh(value)
elif lbl == 'alias': self.alias(value)
elif lbl == 'greylist': self.contourneGreylist(value)
else: pass
def __dict_init__(self, **kw):
dict.__setitem__(self, 'solde', self.solde())
dict.__setitem__(self, 'controle', self.controle())
def copy(self):
new = CransLdap.copy(self)
new._init_data = self._init_data
new._data = self._data
new.modifs = self.modifs
new._modifiable = self._modifiable
return new
############################################################################# #############################################################################
class Adherent(BaseProprietaire): class Adherent(BaseProprietaire):
@ -2459,49 +2404,6 @@ class Adherent(BaseProprietaire):
def is_nounou( self ): def is_nounou( self ):
return u"Nounou" in self.droits() return u"Nounou" in self.droits()
##############################################################
# définition de __setitem__
def __setitem__(self, lbl, value):
# on exécute la parente
BaseProprietaire.__setitem__(self, lbl, value)
# on fait les affectations
if lbl == 'nom': self.nom(value)
elif lbl == 'prenom': self.prenom(value)
elif lbl == 'tel': self.tel(value)
elif lbl == 'chbre': self.chbre(value)
elif re.match(r'addr\d+', lbl):
addr = self.adresse()
addr[int(lbl[4]) + 1] = value
self.adresse(addr)
elif lbl == 'mail': self.email(value)
elif lbl == 'chartema': self.charteMA(value)
elif lbl == 'payant': self.adherentPayant(value)
elif re.match(r'etud\d+', lbl):
etud = [self.etudes(i) for i in range(3)]
etud[int(lbl[4]) - 1] = value
self.etudes(etud)
elif lbl == 'carte':
if value == True: self.carteEtudiant(ann_scol)
elif value == False: self.carteEtudiant(-ann_scol)
else: raise ValueError(u"carte doit être True ou False")
elif lbl == 'compte': self.compte(value)
elif re.match('droits_.*', lbl):
if value == True: self.droits(droits.append(value[7:]))
elif value == False: self.droit(droits.remove(value[7:]))
else: raise ValueError(u"les droits_* doivent être True ou False")
else: pass
def __dict_init__(self, **kw):
BaseProprietaire.__dict_init__(self, **kw)
dict.__setitem__(self, 'nom', self.nom())
dict.__setitem__(self, 'prenom', self.prenom())
dict.__setitem__(self, 'chbre', self.chbre())
dict.__setitem__(self, 'mail', self.email())
dict.__setitem__(self, 'payant', self.adherentPayant())
for i in range(3): dict.__setitem__(self, 'etud%d'% (i+1), self.etudes(i))
dict.__setitem__(self, 'droits', self.droits())
dict.__setitem__(self, 'tel', self.tel())
class Club(BaseProprietaire): class Club(BaseProprietaire):
u""" Classe de définition d'un club """ u""" Classe de définition d'un club """
@ -2655,25 +2557,15 @@ class Club(BaseProprietaire):
u""" Retourne l'adresse mail du responsable """ u""" Retourne l'adresse mail du responsable """
return self.responsable().email() return self.responsable().email()
########################################################################
# Définition de l'initilisation du dico
def __dict_init__(self, **kw):
BaseProprietaire.__dict_init__(self, **kw)
dict.__setitem__(self, 'nom', self.Nom())
dict.__setitem__(self, 'chbre', self.chbre())
dict.__setitem__(self, 'email', self.email())
if self.compte(): dict.__setitem__(self, 'compte', self.compte())
dict.__setitem__(self, 'responsable', self.responsable())
class Machine(BaseClasseCrans): class Machine(BaseClasseCrans):
u""" Classe de définition d'une machine """ u""" Classe de définition d'une machine """
idn = 'mid' idn = 'mid'
filtre_idn = '(|(objectClass=machineFixe)(objectClass=machineWifi)' filtre_idn = '(|(objectClass=machineFixe)(objectClass=machineWifi)'
filtre_idn += '(objectClass=machineCrans)(objectClass=borneWifi))' filtre_idn += '(objectClass=machineCrans)(objectClass=borneWifi))'
def __obj_init__(self, data =(), mode='', conn=None, **kw): def __init__(self, parent_or_tuple, mode='', conn=None):
u""" u"""
data est : parent_or_tuple est :
* soit une instance d'une classe pouvant posséder une machine * soit une instance d'une classe pouvant posséder une machine
(Adherent, Club ou AssociationCrans), la nouvelle machine lui (Adherent, Club ou AssociationCrans), la nouvelle machine lui
sera alors associée. sera alors associée.
@ -2687,19 +2579,20 @@ class Machine(BaseClasseCrans):
conn est une instance de la classe de connexion à la base LDAP conn est une instance de la classe de connexion à la base LDAP
""" """
# Initialisation de la connexion
BaseClasseCrans.__obj_init__(self, conn = conn)
# Définition de l'objectClass LDAP à partir du nom de la classe Python # Définition de l'objectClass LDAP à partir du nom de la classe Python
self.objectClass = str(self.__class__).split('.')[-1] self.objectClass = str(self.__class__).split('.')[-1]
self.objectClass = self.objectClass[0].lower() + self.objectClass[1:] self.objectClass = self.objectClass[0].lower() + self.objectClass[1:]
# Initialisation de la connexion
self.conn = conn
if not self.conn:
self.connect()
self.modifs = {} self.modifs = {}
t = data.__class__ t = parent_or_tuple.__class__
if t == tuple: if t == tuple:
# Initialisation avec données fournies # Initialisation avec données fournies
self.dn = data[0] self.dn = parent_or_tuple[0]
if mode == 'w': if mode == 'w':
try: try:
self.lock(self.idn, self.id()) self.lock(self.idn, self.id())
@ -2709,16 +2602,16 @@ class Machine(BaseClasseCrans):
else: else:
self._modifiable = 0 self._modifiable = 0
# Utile pour construire l'instruction LDAP de modif # Utile pour construire l'instruction LDAP de modif
self._init_data = data[1].copy() self._init_data = parent_or_tuple[1].copy()
self._data = data[1] self._data = parent_or_tuple[1]
# Propriéraire inconnu mais ce n'est pas grave # Propriéraire inconnu mais ce n'est pas grave
self.__proprietaire = None self.__proprietaire = None
elif t in [Adherent, Club, AssociationCrans] and mode != 'w': elif t in [Adherent, Club, AssociationCrans] and mode != 'w':
# Machine vide # Machine vide
self.__proprietaire = data self.__proprietaire = parent_or_tuple
self.dn = data.dn self.dn = parent_or_tuple.dn
self._data = {'objectClass': [self.objectClass]} self._data = {'objectClass': [self.objectClass]}
self._init_data = {} self._init_data = {}
self._modifiable = 'w' self._modifiable = 'w'
@ -3025,13 +2918,11 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
if not self.__proprietaire: if not self.__proprietaire:
res = self.conn.search_s(','.join(self.dn.split(',')[1:]), 0) res = self.conn.search_s(','.join(self.dn.split(',')[1:]), 0)
if 'adherent' in res[0][1]['objectClass']: if 'adherent' in res[0][1]['objectClass']:
self.__proprietaire = \ self.__proprietaire = Adherent(res[0], self._modifiable, self.conn)
Adherent(data = res[0], mode = self._modifiable, conn = self.conn)
elif 'club' in res[0][1]['objectClass']: elif 'club' in res[0][1]['objectClass']:
self.__proprietaire = \ self.__proprietaire = Club(res[0], self._modifiable, self.conn)
Club(data = res[0], mode = self._modifiable, conn = self.conn)
else: else:
self.__proprietaire = AssociationCrans(conn = self.conn) self.__proprietaire = AssociationCrans(self.conn)
return self.__proprietaire return self.__proprietaire
@ -3192,46 +3083,19 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
u"""Retourne un hash de l'objet Machine""" u"""Retourne un hash de l'objet Machine"""
return hash(self.nom()) return hash(self.nom())
################################################################
# définintion de __setitem__
def __setitem__(self, lbl, value):
CransLdap.__setitem__(self, lbl, value)
if lbl == 'mac': self.mac(value)
elif lbl == 'host': self.nom(value)
elif lbl == 'prise': self.prise(value)
elif lbl == 'alias': self.alias(value)
elif lbl == 'ip': self.alias(value)
elif lbl == 'exempt': self.exempt(value)
# elif lbl == 'proprio':
# if re.match(r'\([a-zA-Z]=\d+\)', value):
# proprio = self.search(value)['club'][0]
# else:
# proprio = self.search('(aid=%s)' % value)['adherent'][0]
# self.proprietaire(proprio)
def __dict_init__(self, **kw):
BaseClasseCrans.__dict_init__(self, **kw)
dict.__setitem__(self, 'mac', self.mac())
dict.__setitem__(self, 'host', self.nom())
dict.__setitem__(self, 'prise', self.prise())
dict.__setitem__(self, 'alias', self.alias())
dict.__setitem__(self, 'ip', self.ip())
dict.__setitem__(self, 'proprietaire', self.proprietaire())
class MachineFixe(Machine): class MachineFixe(Machine):
u""" Classe de définition d'une machine fixe """ u""" Classe de définition d'une machine fixe """
def __obj_init__(self, typ='fixe', **kw): def __init__(self, parent_or_tuple, typ='fixe', conn=None):
Machine.__obj_init__(self, typ = typ, **kw) Machine.__init__(self, parent_or_tuple, typ, conn)
class MachineWifi(Machine): class MachineWifi(Machine):
u""" Classe de définition d'une machine wifi """ u""" Classe de définition d'une machine wifi """
def __obj_init__(self, typ='wifi', **kw): def __init__(self, parent_or_tuple, typ='wifi', conn=None):
Machine.__obj_init__(self, typ=typ, **kw) Machine.__init__(self, parent_or_tuple, typ, conn)
if not isinstance(kw.get('data', None), tuple): if not isinstance(parent_or_tuple, tuple):
# Initialisaton d'une nouvelle machine wifi # Initialisaton d'une nouvelle machine wifi
self.ipsec(True) self.ipsec(True)
@ -3258,8 +3122,8 @@ class MachineWifi(Machine):
class MachineCrans(Machine): class MachineCrans(Machine):
u""" Classe de définition d'une machine du Crans """ u""" Classe de définition d'une machine du Crans """
def __obj_init__(self, typ='fixe', **kw): def __init__(self, parent_or_tuple, typ='fixe', conn=None):
Machine.__obj_init__(self, typ, **kw) Machine.__init__(self, parent_or_tuple, typ, conn)
def nombrePrises(self, new=None): def nombrePrises(self, new=None):
u""" Nombre de prises, pour les switchs """ u""" Nombre de prises, pour les switchs """
@ -3282,9 +3146,9 @@ class MachineCrans(Machine):
class BorneWifi(Machine): class BorneWifi(Machine):
u"""Classe de définition d'une borne wifi""" u"""Classe de définition d'une borne wifi"""
def __obj_init__(self, typ='borne', **kw): def __init__(self, parent_or_tuple, typ='borne', conn=None):
Machine.__obj_init__(self, typ=typ, **kw) Machine.__init__(self, parent_or_tuple, typ, conn)
if not isinstance(kw.get('data', None), tuple): if not isinstance(parent_or_tuple, tuple):
# Initialisaton d'une nouvelle borne wifi # Initialisaton d'une nouvelle borne wifi
self._data['canal'] = ['2047'] self._data['canal'] = ['2047']
self._data['puissance'] = ['60'] self._data['puissance'] = ['60']
@ -3458,7 +3322,7 @@ class Facture(BaseClasseCrans):
idn = 'fid' idn = 'fid'
filtre_idn = '(objectClass=facture)' filtre_idn = '(objectClass=facture)'
def __obj_init__(self, mode='', **kw): def __init__(self, parent_or_tuple, mode='', conn=None):
u""" u"""
parent_or_tuple est : parent_or_tuple est :
* soit une instance d'une classe pouvant posséder une facture * soit une instance d'une classe pouvant posséder une facture
@ -3473,11 +3337,13 @@ class Facture(BaseClasseCrans):
conn est une instance de la classe de connexion à la base LDAP conn est une instance de la classe de connexion à la base LDAP
""" """
# Initialisation de la connexion # Initialisation de la connexion
BaseClasseCrans.__obj_init__(self, conn= conn, **kw) self.conn = conn
if not self.conn:
self.connect()
self.modifs = {} self.modifs = {}
parent_or_tuple = kw.get('data', None)
t = parent_or_tuple.__class__ t = parent_or_tuple.__class__
if t == tuple: if t == tuple:
# Initialisation avec données fournies # Initialisation avec données fournies
@ -3534,11 +3400,9 @@ class Facture(BaseClasseCrans):
if not self.__proprietaire: if not self.__proprietaire:
res = self.conn.search_s(','.join(self.dn.split(',')[1:]), 0) res = self.conn.search_s(','.join(self.dn.split(',')[1:]), 0)
if 'adherent' in res[0][1]['objectClass']: if 'adherent' in res[0][1]['objectClass']:
self.__proprietaire = \ self.__proprietaire = Adherent(res[0], self._modifiable, self.conn)
Adherent(data = res[0], mode = self._modifiable, conn = self.conn)
elif 'club' in res[0][1]['objectClass']: elif 'club' in res[0][1]['objectClass']:
self.__proprietaire = \ self.__proprietaire = Club(res[0], self._modifiable, self.conn)
Club(data = res[0], mode = self._modifiable, conn = self.conn)
else: else:
raise ValueError, u'Propriétaire inconnu' raise ValueError, u'Propriétaire inconnu'
@ -3786,8 +3650,10 @@ class Facture(BaseClasseCrans):
class _FakeProprio(CransLdap): class _FakeProprio(CransLdap):
u"""Définitions de base d'un propriétaire virtuel""" u"""Définitions de base d'un propriétaire virtuel"""
idn = '' idn = ''
def __obj_init__(self, conn=None): def __init__(self, conn=None):
CransLdap.__obj_init__(self, conn = conn) self.conn = conn
if not self.conn:
self.connect()
self.dn = self.base_dn self.dn = self.base_dn
def id(self): def id(self):
return '' return ''
@ -3810,8 +3676,8 @@ class _FakeProprio(CransLdap):
class AssociationCrans(_FakeProprio): class AssociationCrans(_FakeProprio):
u""" Classe définissant l'assoce (pour affichage de ses machines) """ u""" Classe définissant l'assoce (pour affichage de ses machines) """
def __obj_init__(self, conn=None): def __init__(self, conn=None):
_FakeProprio.__obj_init__(self, conn) _FakeProprio.__init__(self, conn)
def Nom(self): def Nom(self):
return u"Crans" return u"Crans"
def chbre(self): def chbre(self):