[ldap_crans.py] l'interface avec des dicos marche! même la copie mde dicos marche!

Ignore-this: 192f099c2b334df59cca5d73c12309d2

darcs-hash:20090929205903-bd074-77224dc37a11f4fe18a0dc2aac3edcefd7ef6c0d.gz
This commit is contained in:
Antoine Durand-Gasselin 2009-09-29 22:59:03 +02:00
parent f5bae74159
commit fd5cca07f2
4 changed files with 122 additions and 64 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é Denis Diderot" ' arg += u'"P7" "Université Paris 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,7 +228,8 @@ 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
@ -329,22 +330,31 @@ class CransLdap(dict):
'borneWifi': 2, 'borneWifi': 2,
'facture': 2} 'facture': 2}
def __init__(self, readonly=False, conn=None): def __init__(self, **kw):
"""Fonction d'initialisation.
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: if not self.conn:
self.conn = conn self.conn = conn
if not self.conn: if not self.conn:
self.connect(readonly) self.connect(readonly)
self['readonly'] = readonly
self['witness'] = "I exist"
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
@ -364,9 +374,8 @@ class CransLdap(dict):
time.sleep(0.3) time.sleep(0.3)
def exist(self, arg): def exist(self, arg):
u""" """Vérifie l'existence d'une entrée dans la base et que cette entrée
Vérifie l'existence d'une entrée dans la base et que cette n'appartient pas à l'objet en cours.
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.
@ -598,12 +607,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(entry, mode, self.conn) return classe(data= entry, mode= mode, conn= 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=''):
@ -887,10 +896,12 @@ class CransLdap(dict):
######################################################################## ########################################################################
# Méthodes pour fournir une interface proche d'un dictionnaire # 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): def copy(self):
new = dict.copy(self) new = self.__class__(conn = self.conn, dico = self)
new._locks = self._locks new._locks = self._locks
new.conn = self.conn
return new return new
############################################################################# #############################################################################
@ -1320,7 +1331,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 __init__(self, data=(), mode='', conn=None): def __obj_init__(self, mode='', conn= None, **kw):
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:
@ -1332,11 +1343,16 @@ 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
""" """
BaseClasseCrans.__init__(self, conn = conn)
# 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':
@ -1357,6 +1373,7 @@ 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:
@ -1837,12 +1854,16 @@ class BaseProprietaire(BaseClasseCrans):
elif lbl == 'greylist': self.contourneGreylist(value) elif lbl == 'greylist': self.contourneGreylist(value)
else: pass else: pass
def __dict_init__(self, **kw):
dict.__setitem__(self, 'solde', self.solde())
dict.__setitem__(self, 'controle', self.controle())
def copy(self): def copy(self):
new = CransLdap.copy(self) new = CransLdap.copy(self)
new._init_data = self._init_data new._init_data = self._init_data
new._data = self._data new._data = self._data
new.modifs = self.modifs new.modifs = self.modifs
new.modifiable = self.modifiable new._modifiable = self._modifiable
return new return new
############################################################################# #############################################################################
@ -2450,15 +2471,15 @@ class Adherent(BaseProprietaire):
elif lbl == 'tel': self.tel(value) elif lbl == 'tel': self.tel(value)
elif lbl == 'chbre': self.chbre(value) elif lbl == 'chbre': self.chbre(value)
elif re.match(r'addr\d+', lbl): elif re.match(r'addr\d+', lbl):
addr = self.addresse() addr = self.adresse()
addr[int(lbl[4]) + 1] = value addr[int(lbl[4]) + 1] = value
self.addresse(addr) self.adresse(addr)
elif lbl == 'mail': self.mail(value) elif lbl == 'mail': self.email(value)
elif lbl == 'chartema': self.charteMA(value) elif lbl == 'chartema': self.charteMA(value)
elif lbl == 'payant': self.adherentPayant(value) elif lbl == 'payant': self.adherentPayant(value)
elif re.match(r'etud\d+', lbl): elif re.match(r'etud\d+', lbl):
etud = self.etudes() etud = [self.etudes(i) for i in range(3)]
etud[int(lbl[4]) + 1] = value etud[int(lbl[4]) - 1] = value
self.etudes(etud) self.etudes(etud)
elif lbl == 'carte': elif lbl == 'carte':
if value == True: self.carteEtudiant(ann_scol) if value == True: self.carteEtudiant(ann_scol)
@ -2471,6 +2492,17 @@ class Adherent(BaseProprietaire):
else: raise ValueError(u"les droits_* doivent être True ou False") else: raise ValueError(u"les droits_* doivent être True ou False")
else: pass 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 """
idn = 'cid' idn = 'cid'
@ -2623,15 +2655,25 @@ 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 __init__(self, parent_or_tuple, mode='', conn=None): def __obj_init__(self, data =(), mode='', conn=None, **kw):
u""" u"""
parent_or_tuple est : data 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.
@ -2646,17 +2688,18 @@ 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
BaseClasseCrans.__init__(self, conn = conn)
self.modifs = {} self.modifs = {}
t = parent_or_tuple.__class__ t = data.__class__
if t == tuple: if t == tuple:
# Initialisation avec données fournies # Initialisation avec données fournies
self.dn = parent_or_tuple[0] self.dn = data[0]
if mode == 'w': if mode == 'w':
try: try:
self.lock(self.idn, self.id()) self.lock(self.idn, self.id())
@ -2666,16 +2709,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 = parent_or_tuple[1].copy() self._init_data = data[1].copy()
self._data = parent_or_tuple[1] self._data = data[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 = parent_or_tuple self.__proprietaire = data
self.dn = parent_or_tuple.dn self.dn = data.dn
self._data = {'objectClass': [self.objectClass]} self._data = {'objectClass': [self.objectClass]}
self._init_data = {} self._init_data = {}
self._modifiable = 'w' self._modifiable = 'w'
@ -2982,11 +3025,13 @@ 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 = Adherent(res[0], self._modifiable, self.conn) self.__proprietaire = \
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 = Club(res[0], self._modifiable, self.conn) self.__proprietaire = \
Club(data = res[0], mode = self._modifiable, conn = self.conn)
else: else:
self.__proprietaire = AssociationCrans(self.conn) self.__proprietaire = AssociationCrans(conn = self.conn)
return self.__proprietaire return self.__proprietaire
@ -3158,26 +3203,35 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
elif lbl == 'alias': self.alias(value) elif lbl == 'alias': self.alias(value)
elif lbl == 'ip': self.alias(value) elif lbl == 'ip': self.alias(value)
elif lbl == 'exempt': self.exempt(value) elif lbl == 'exempt': self.exempt(value)
# elif lbl == 'proprio': # elif lbl == 'proprio':
# if re.match(r'\([a-zA-Z]=\d+\)', value): # if re.match(r'\([a-zA-Z]=\d+\)', value):
# proprio = self.search(value)['club'][0] # proprio = self.search(value)['club'][0]
# else: # else:
# proprio = self.search('(aid=%s)' % value)['adherent'][0] # proprio = self.search('(aid=%s)' % value)['adherent'][0]
# self.proprietaire(proprio) # 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 __init__(self, parent_or_tuple, typ='fixe', conn=None): def __obj_init__(self, typ='fixe', **kw):
Machine.__init__(self, parent_or_tuple, typ, conn) Machine.__obj_init__(self, typ = typ, **kw)
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 __init__(self, parent_or_tuple, typ='wifi', conn=None): def __obj_init__(self, typ='wifi', **kw):
Machine.__init__(self, parent_or_tuple, typ, conn) Machine.__obj_init__(self, typ=typ, **kw)
if not isinstance(parent_or_tuple, tuple): if not isinstance(kw.get('data', None), tuple):
# Initialisaton d'une nouvelle machine wifi # Initialisaton d'une nouvelle machine wifi
self.ipsec(True) self.ipsec(True)
@ -3204,8 +3258,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 __init__(self, parent_or_tuple, typ='fixe', conn=None): def __obj_init__(self, typ='fixe', **kw):
Machine.__init__(self, parent_or_tuple, typ, conn) Machine.__obj_init__(self, typ, **kw)
def nombrePrises(self, new=None): def nombrePrises(self, new=None):
u""" Nombre de prises, pour les switchs """ u""" Nombre de prises, pour les switchs """
@ -3228,9 +3282,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 __init__(self, parent_or_tuple, typ='borne', conn=None): def __obj_init__(self, typ='borne', **kw):
Machine.__init__(self, parent_or_tuple, typ, conn) Machine.__obj_init__(self, typ=typ, **kw)
if not isinstance(parent_or_tuple, tuple): if not isinstance(kw.get('data', None), 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']
@ -3404,7 +3458,7 @@ class Facture(BaseClasseCrans):
idn = 'fid' idn = 'fid'
filtre_idn = '(objectClass=facture)' filtre_idn = '(objectClass=facture)'
def __init__(self, parent_or_tuple, mode='', conn=None): def __obj_init__(self, mode='', **kw):
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
@ -3419,11 +3473,11 @@ 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.__init__(self, conn= conn) BaseClasseCrans.__obj_init__(self, conn= conn, **kw)
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
@ -3480,9 +3534,11 @@ 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 = Adherent(res[0], self._modifiable, self.conn) self.__proprietaire = \
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 = Club(res[0], self._modifiable, self.conn) self.__proprietaire = \
Club(data = res[0], mode = self._modifiable, conn = self.conn)
else: else:
raise ValueError, u'Propriétaire inconnu' raise ValueError, u'Propriétaire inconnu'
@ -3730,8 +3786,8 @@ 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 __init__(self, conn=None): def __obj_init__(self, conn=None):
CransLdap.__init__(self, conn = conn) CransLdap.__obj_init__(self, conn = conn)
self.dn = self.base_dn self.dn = self.base_dn
def id(self): def id(self):
return '' return ''
@ -3754,8 +3810,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 __init__(self, conn=None): def __obj_init__(self, conn=None):
_FakeProprio.__init__(self, conn) _FakeProprio.__obj_init__(self, conn)
def Nom(self): def Nom(self):
return u"Crans" return u"Crans"
def chbre(self): def chbre(self):

View file

@ -14,7 +14,7 @@ def really_quit(dico):
raise EndScenario("game over!", data = dico) raise EndScenario("game over!", data = dico)
def error_handler(exc): def error_handler(exc):
dialog.Dialog().msgbox(str(exc), width=0, height =0, title = 'Erreur :') dialog.Dialog().msgbox(str(exc), widht=0, height =0, title = 'Erreur :')
raise TryAgain() raise TryAgain()
class DialogStepGenerator: class DialogStepGenerator:

View file

@ -118,7 +118,9 @@ class Running:
if self.steps[0] == 'CASE' : if self.steps[0] == 'CASE' :
switch, cases, fallback = self.steps[1] switch, cases, fallback = self.steps[1]
self.steps = self.steps[2] self.steps = self.steps[2]
plan_steps = cases.get(switch(self.env), fallback).steps scenar = cases.get(switch(self.env), fallback)
if scenar: plan_steps = scenar.steps
else: plan_steps = None
while plan_steps: while plan_steps:
self.steps = plan_steps[0], plan_steps[1], self.steps self.steps = plan_steps[0], plan_steps[1], self.steps
plan_steps = plan_steps[2] plan_steps = plan_steps[2]