Evite d'ouvrir 1000 connexions la base LDAP

darcs-hash:20040831153442-d1718-cb93c1c5da074b56a61db18e225e8ee9148bffd6.gz
This commit is contained in:
bernat 2004-08-31 17:34:42 +02:00
parent 6626a44f15
commit 31ef749810
2 changed files with 31 additions and 28 deletions

View file

@ -124,7 +124,7 @@ if inst :
##### Récolte des données ##### Récolte des données
cprint('Lecture base LDAP','gras') cprint('Lecture base LDAP','gras')
# Machines de l'assoce # Machines de l'assoce
machines = crans().machines() machines = crans(db.conn).machines()
# Machines des adhérents et clubs de l'année en cours # Machines des adhérents et clubs de l'année en cours
if localtime()[1] == 9: if localtime()[1] == 9:
# On est en septembre, on autorise ceux qui ont payé l'an dernier et cette année # On est en septembre, on autorise ceux qui ont payé l'an dernier et cette année

View file

@ -365,7 +365,7 @@ class crans_ldap :
el = '(%s=%s*)' % ( champ, expr) el = '(%s=%s*)' % ( champ, expr)
elif champ == 'macAddress' : elif champ == 'macAddress' :
# Formatage adresse mac # Formatage adresse mac
try : el = '(macAddress=%s)' % format_mac(expression) try : el = '(macAddress=%s)' % format_mac(expr)
except : return '' except : return ''
else : else :
# Cas général # Cas général
@ -411,7 +411,7 @@ class crans_ldap :
if champ in self.auto_search_champs[i] + self.non_auto_search_champs[i] : if champ in self.auto_search_champs[i] + self.non_auto_search_champs[i] :
filtre[i] += build_filtre(champ,expr,neg) filtre[i] += build_filtre(champ,expr,neg)
ok = 1 ok = 1
if expr!='*' : if expr!='*' or neg :
filtre_cond[i] = 1 filtre_cond[i] = 1
filtre_tout=0 filtre_tout=0
if not ok : if not ok :
@ -439,16 +439,16 @@ class crans_ldap :
# Il n'y avait seulement un filtre machine # Il n'y avait seulement un filtre machine
# => on retourne uniquement les machines trouvées # => on retourne uniquement les machines trouvées
for m in r['machine'] : for m in r['machine'] :
result['machine'].append(machine(m,mode) ) result['machine'].append(machine(m,mode,self.conn) )
elif not r['machine'] : elif not r['machine'] :
# Il n'y avait pas de filtre machine # Il n'y avait pas de filtre machine
# => on retourne uniquement les adhérents # => on retourne uniquement les adhérents
if r['adherent'] : if r['adherent'] :
for a in r['adherent'] : for a in r['adherent'] :
result['adherent'].append(adherent(a,mode) ) result['adherent'].append(adherent(a,mode,self.conn) )
if r['club'] : if r['club'] :
for a in r['club'] : for a in r['club'] :
result['club'].append(club(a,mode) ) result['club'].append(club(a,mode,self.conn) )
else : else :
# Il faut croiser les résultats machine et propriétaire # Il faut croiser les résultats machine et propriétaire
# Traitement des machines # Traitement des machines
@ -465,12 +465,12 @@ class crans_ldap :
for a in r['adherent'] : for a in r['adherent'] :
if a[0] in mach_adh and not a[0] in bons_dn : if a[0] in mach_adh and not a[0] in bons_dn :
bons_dn.append(a[0]) bons_dn.append(a[0])
result['adherent'].append(adherent(a,mode) ) result['adherent'].append(adherent(a,mode,self.conn) )
if r['club'] : if r['club'] :
for a in r['club'] : for a in r['club'] :
if a[0] in mach_adh and not a[0] in bons_dn : if a[0] in mach_adh and not a[0] in bons_dn :
bons_dn.append(a[0]) bons_dn.append(a[0])
result['club'].append(club(a,mode) ) result['club'].append(club(a,mode,self.conn) )
# Maintenant c'est au tour des bonnes machines # Maintenant c'est au tour des bonnes machines
bons_dn2 = [] bons_dn2 = []
@ -478,7 +478,7 @@ class crans_ldap :
dn = string.join(a[0].split(',')[-4:],',') dn = string.join(a[0].split(',')[-4:],',')
if dn in bons_dn and not a[0] in bons_dn2 : if dn in bons_dn and not a[0] in bons_dn2 :
bons_dn2.append(dn) bons_dn2.append(dn)
result['machine'].append(machine(a,mode) ) result['machine'].append(machine(a,mode,self.conn) )
else : else :
### Recherche d'une chaine sur tous les champs ### Recherche d'une chaine sur tous les champs
@ -495,7 +495,7 @@ class crans_ldap :
# Recherche # Recherche
for r in self.conn.search_s(self.base_dn,self.scope[i],filtre) : for r in self.conn.search_s(self.base_dn,self.scope[i],filtre) :
result[i].append( cl(r,mode) ) result[i].append( cl(r,mode,self.conn) )
return result return result
@ -779,7 +779,7 @@ class base_classes_crans(crans_ldap) :
class base_proprietaire(base_classes_crans) : class base_proprietaire(base_classes_crans) :
""" Méthodes de bases pour les classes adherent et club """ """ Méthodes de bases pour les classes adherent et club """
def __init__(self,data=(),mode='') : def __init__(self,data=(),mode='',conn=None) :
""" """
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:
@ -788,7 +788,10 @@ class base_proprietaire(base_classes_crans) :
Attention, si mode ='w' mais si l'objet est déja locké il n'y a pas d'erreur Attention, si mode ='w' mais si l'objet est déja locké il n'y a pas d'erreur
vérifier l'obtetion du lock grace à la valeur de _modifiable (si =w c'est bon) vérifier l'obtetion du lock grace à la valeur de _modifiable (si =w c'est bon)
Il est inutile de préciser le mode pour un nouveau proprietaire Il est inutile de préciser le mode pour un nouveau proprietaire
conn est une instance de la classe de connexion à la base LDAP
""" """
if not self.conn : self.conn = conn
if type(data) != tuple : if type(data) != tuple :
raise TypeError raise TypeError
@ -816,14 +819,17 @@ class base_proprietaire(base_classes_crans) :
self._modifiable = 'w' self._modifiable = 'w'
def machines(self) : def machines(self) :
""" Retroune les machines (instances) appartenant à la classe """ """ Retourne les machines (instances) appartenant à la classe """
if not self.conn : if not self.conn :
self.connect() self.connect()
if self.id() : if self.id() :
res = [] res = []
for r in self.conn.search_s('%s=%s,%s' % ( self.idn,self.id() , self.base_dn ),1,'objectClass=machine') : try :
res.append(machine(r, self._modifiable) ) for r in self.conn.search_s('%s=%s,%s' % ( self.idn,self.id() , self.base_dn ),1,'objectClass=machine') :
return res res.append(machine(r, self._modifiable,self.conn) )
return res
except :
return []
else : else :
return [] return []
@ -850,10 +856,7 @@ class base_proprietaire(base_classes_crans) :
return '' return ''
def delete(self,comment='') : def delete(self,comment='') :
""" """Destruction du proprietaire"""
Destruction du proprietaire, retourne le liste des services à redémarrer
"""
done = 0 done = 0
for m in self.machines() : for m in self.machines() :
if m.ipsec() and not 'conf_wifi' in serv : if m.ipsec() and not 'conf_wifi' in serv :
@ -1475,7 +1478,7 @@ class machine(base_classes_crans) :
""" Classe de définition d'une machine """ """ Classe de définition d'une machine """
idn = 'mid' idn = 'mid'
def __init__(self,parent_or_tuple,typ='fixe') : def __init__(self,parent_or_tuple,typ='fixe',conn=None) :
""" """
parent_or_tuple 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
@ -1489,8 +1492,9 @@ class machine(base_classes_crans) :
Attention, si typ ='w' mais si l'objet est déja locké il n'y a pas d'erreur Attention, si typ ='w' mais si l'objet est déja locké il n'y a pas d'erreur
vérifier l'obtetion du lock grace à la valeur de _modifiable (si =w c'est bon) vérifier l'obtetion du lock grace à la valeur de _modifiable (si =w c'est bon)
conn est une instance de la classe de connexion à la base LDAP
""" """
if not self.conn : self.conn = conn
self.modifs=[] self.modifs=[]
self._locks=[] self._locks=[]
t = parent_or_tuple.__class__ t = parent_or_tuple.__class__
@ -1736,9 +1740,9 @@ class machine(base_classes_crans) :
if len(res) != 1 : njoqmf if len(res) != 1 : njoqmf
if 'adherent' in res[0][1]['objectClass'] : if 'adherent' in res[0][1]['objectClass'] :
self.__proprietaire = adherent(res[0],self._modifiable) self.__proprietaire = adherent(res[0],self._modifiable,self.conn)
elif 'club' in res[0][1]['objectClass'] : elif 'club' in res[0][1]['objectClass'] :
self.__proprietaire = club(res[0],self._modifiable) self.__proprietaire = club(res[0],self._modifiable,self.conn)
else : else :
self.__proprietaire = crans() self.__proprietaire = crans()
@ -1826,9 +1830,7 @@ class machine(base_classes_crans) :
return ret return ret
def delete(self,comment='') : def delete(self,comment='') :
""" """ Destruction de la machines """
Destruction de la machines, retourne la liste de services à redémarrer
"""
if self.proprietaire() == crans and not isadm : if self.proprietaire() == crans and not isadm :
raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.')
@ -1873,7 +1875,8 @@ class machine(base_classes_crans) :
class crans(crans_ldap) : class crans(crans_ldap) :
""" Classe définissant l'assoce (pour affichage de ses machines) """ """ Classe définissant l'assoce (pour affichage de ses machines) """
idn = '' idn = ''
def __init__(s): def __init__(s,conn=None):
if not s.conn : s.conn = conn
s.dn = s.base_dn s.dn = s.base_dn
def id(s) : def id(s) :
return '' return ''
@ -1894,7 +1897,7 @@ class crans(crans_ldap) :
res = s.conn.search_s(s.dn,1,'objectClass=machine') res = s.conn.search_s(s.dn,1,'objectClass=machine')
m = [] m = []
for r in res : for r in res :
m.append(machine(r)) m.append(machine(r,'',s.conn))
return m return m
if __name__ == '__main__' : if __name__ == '__main__' :