[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'"P5" "Université René Descartes" '
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'"P9" "Université Paris Dauphine" '
arg += u'"P10" "Université de Nanterre" '

View file

@ -228,7 +228,8 @@ def format_mac(mac):
### Définition des classes
class Service:
u""" Définit un service à redémarrer """
u"Définit un service à redémarrer"
def __init__(self, nom, args=[], start=[]):
"""
Nom du service
@ -329,22 +330,31 @@ class CransLdap(dict):
'borneWifi': 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:
self.conn = conn
if not self.conn:
self.connect(readonly)
self['readonly'] = readonly
self['witness'] = "I exist"
def __del__(self):
"Destruction de l'objet, et surtout des locks."
# Destruction des locks résiduels
if hasattr(self, '_locks'):
for lock in self._locks:
self.remove_lock(lock)
def connect(self, readonly=False):
u""" Initialisation la connexion vers le serveur LDAP """
u"Initialisation la connexion vers le serveur LDAP"
if readonly:
self.conn = ldap.initialize(ro_uri)
return
@ -364,9 +374,8 @@ class CransLdap(dict):
time.sleep(0.3)
def exist(self, arg):
u"""
Vérifie l'existence d'une entrée dans la base et que cette
entrée 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.
@ -598,12 +607,12 @@ class CransLdap(dict):
# On récupère la bonne classe
nom_classe = (entry[1].get('objectClass') or ['none'])[0]
nom_classe = nom_classe[0].upper() + nom_classe[1:]
try:
classe = eval(nom_classe)
#try:
classe = eval(nom_classe)
# On crée l'objet
return classe(entry, mode, self.conn)
except:
raise ValueError(u"Impossible de créer l'objet %s" % nom_classe)
return classe(data= entry, mode= mode, conn= self.conn)
#except:
# raise ValueError(u"Impossible de créer l'objet %s" % nom_classe)
def search(self, expression, mode=''):
@ -887,10 +896,12 @@ class CransLdap(dict):
########################################################################
# 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 = dict.copy(self)
new = self.__class__(conn = self.conn, dico = self)
new._locks = self._locks
new.conn = self.conn
return new
#############################################################################
@ -1320,7 +1331,7 @@ class BaseClasseCrans(CransLdap):
class BaseProprietaire(BaseClasseCrans):
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"""
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:
@ -1332,11 +1343,16 @@ class BaseProprietaire(BaseClasseCrans):
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:
raise TypeError
self.modifs = {}
data = kw.get('data', ())
if data:
self.dn = data[0]
if mode == 'w':
@ -1357,6 +1373,7 @@ class BaseProprietaire(BaseClasseCrans):
self._init_data = {}
self._modifiable = 'w'
def chsh(self, new=None):
u""" Retourne ou change le shell de l'adhérent """
if new == None:
@ -1837,12 +1854,16 @@ class BaseProprietaire(BaseClasseCrans):
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
new._modifiable = self._modifiable
return new
#############################################################################
@ -2450,15 +2471,15 @@ class Adherent(BaseProprietaire):
elif lbl == 'tel': self.tel(value)
elif lbl == 'chbre': self.chbre(value)
elif re.match(r'addr\d+', lbl):
addr = self.addresse()
addr = self.adresse()
addr[int(lbl[4]) + 1] = value
self.addresse(addr)
elif lbl == 'mail': self.mail(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()
etud[int(lbl[4]) + 1] = value
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)
@ -2471,6 +2492,17 @@ class Adherent(BaseProprietaire):
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):
u""" Classe de définition d'un club """
idn = 'cid'
@ -2623,15 +2655,25 @@ class Club(BaseProprietaire):
u""" Retourne l'adresse mail du responsable """
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):
u""" Classe de définition d'une machine """
idn = 'mid'
filtre_idn = '(|(objectClass=machineFixe)(objectClass=machineWifi)'
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"""
parent_or_tuple est :
data est :
* soit une instance d'une classe pouvant posséder une machine
(Adherent, Club ou AssociationCrans), la nouvelle machine lui
sera alors associée.
@ -2646,17 +2688,18 @@ class Machine(BaseClasseCrans):
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
self.objectClass = str(self.__class__).split('.')[-1]
self.objectClass = self.objectClass[0].lower() + self.objectClass[1:]
# Initialisation de la connexion
BaseClasseCrans.__init__(self, conn = conn)
self.modifs = {}
t = parent_or_tuple.__class__
t = data.__class__
if t == tuple:
# Initialisation avec données fournies
self.dn = parent_or_tuple[0]
self.dn = data[0]
if mode == 'w':
try:
self.lock(self.idn, self.id())
@ -2666,16 +2709,16 @@ class Machine(BaseClasseCrans):
else:
self._modifiable = 0
# Utile pour construire l'instruction LDAP de modif
self._init_data = parent_or_tuple[1].copy()
self._data = parent_or_tuple[1]
self._init_data = data[1].copy()
self._data = data[1]
# Propriéraire inconnu mais ce n'est pas grave
self.__proprietaire = None
elif t in [Adherent, Club, AssociationCrans] and mode != 'w':
# Machine vide
self.__proprietaire = parent_or_tuple
self.dn = parent_or_tuple.dn
self.__proprietaire = data
self.dn = data.dn
self._data = {'objectClass': [self.objectClass]}
self._init_data = {}
self._modifiable = 'w'
@ -2982,11 +3025,13 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
if not self.__proprietaire:
res = self.conn.search_s(','.join(self.dn.split(',')[1:]), 0)
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']:
self.__proprietaire = Club(res[0], self._modifiable, self.conn)
self.__proprietaire = \
Club(data = res[0], mode = self._modifiable, conn = self.conn)
else:
self.__proprietaire = AssociationCrans(self.conn)
self.__proprietaire = AssociationCrans(conn = self.conn)
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 == '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)
# 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):
u""" Classe de définition d'une machine fixe """
def __init__(self, parent_or_tuple, typ='fixe', conn=None):
Machine.__init__(self, parent_or_tuple, typ, conn)
def __obj_init__(self, typ='fixe', **kw):
Machine.__obj_init__(self, typ = typ, **kw)
class MachineWifi(Machine):
u""" Classe de définition d'une machine wifi """
def __init__(self, parent_or_tuple, typ='wifi', conn=None):
Machine.__init__(self, parent_or_tuple, typ, conn)
if not isinstance(parent_or_tuple, tuple):
def __obj_init__(self, typ='wifi', **kw):
Machine.__obj_init__(self, typ=typ, **kw)
if not isinstance(kw.get('data', None), tuple):
# Initialisaton d'une nouvelle machine wifi
self.ipsec(True)
@ -3204,8 +3258,8 @@ class MachineWifi(Machine):
class MachineCrans(Machine):
u""" Classe de définition d'une machine du Crans """
def __init__(self, parent_or_tuple, typ='fixe', conn=None):
Machine.__init__(self, parent_or_tuple, typ, conn)
def __obj_init__(self, typ='fixe', **kw):
Machine.__obj_init__(self, typ, **kw)
def nombrePrises(self, new=None):
u""" Nombre de prises, pour les switchs """
@ -3228,9 +3282,9 @@ class MachineCrans(Machine):
class BorneWifi(Machine):
u"""Classe de définition d'une borne wifi"""
def __init__(self, parent_or_tuple, typ='borne', conn=None):
Machine.__init__(self, parent_or_tuple, typ, conn)
if not isinstance(parent_or_tuple, tuple):
def __obj_init__(self, typ='borne', **kw):
Machine.__obj_init__(self, typ=typ, **kw)
if not isinstance(kw.get('data', None), tuple):
# Initialisaton d'une nouvelle borne wifi
self._data['canal'] = ['2047']
self._data['puissance'] = ['60']
@ -3404,7 +3458,7 @@ class Facture(BaseClasseCrans):
idn = 'fid'
filtre_idn = '(objectClass=facture)'
def __init__(self, parent_or_tuple, mode='', conn=None):
def __obj_init__(self, mode='', **kw):
u"""
parent_or_tuple est :
* 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
"""
# Initialisation de la connexion
BaseClasseCrans.__init__(self, conn= conn)
BaseClasseCrans.__obj_init__(self, conn= conn, **kw)
self.modifs = {}
parent_or_tuple = kw.get('data', None)
t = parent_or_tuple.__class__
if t == tuple:
# Initialisation avec données fournies
@ -3480,9 +3534,11 @@ class Facture(BaseClasseCrans):
if not self.__proprietaire:
res = self.conn.search_s(','.join(self.dn.split(',')[1:]), 0)
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']:
self.__proprietaire = Club(res[0], self._modifiable, self.conn)
self.__proprietaire = \
Club(data = res[0], mode = self._modifiable, conn = self.conn)
else:
raise ValueError, u'Propriétaire inconnu'
@ -3730,8 +3786,8 @@ class Facture(BaseClasseCrans):
class _FakeProprio(CransLdap):
u"""Définitions de base d'un propriétaire virtuel"""
idn = ''
def __init__(self, conn=None):
CransLdap.__init__(self, conn = conn)
def __obj_init__(self, conn=None):
CransLdap.__obj_init__(self, conn = conn)
self.dn = self.base_dn
def id(self):
return ''
@ -3754,8 +3810,8 @@ class _FakeProprio(CransLdap):
class AssociationCrans(_FakeProprio):
u""" Classe définissant l'assoce (pour affichage de ses machines) """
def __init__(self, conn=None):
_FakeProprio.__init__(self, conn)
def __obj_init__(self, conn=None):
_FakeProprio.__obj_init__(self, conn)
def Nom(self):
return u"Crans"
def chbre(self):

View file

@ -14,7 +14,7 @@ def really_quit(dico):
raise EndScenario("game over!", data = dico)
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()
class DialogStepGenerator:

View file

@ -118,7 +118,9 @@ class Running:
if self.steps[0] == 'CASE' :
switch, cases, fallback = self.steps[1]
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:
self.steps = plan_steps[0], plan_steps[1], self.steps
plan_steps = plan_steps[2]