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

@ -365,7 +365,7 @@ class crans_ldap :
el = '(%s=%s*)' % ( champ, expr)
elif champ == 'macAddress' :
# Formatage adresse mac
try : el = '(macAddress=%s)' % format_mac(expression)
try : el = '(macAddress=%s)' % format_mac(expr)
except : return ''
else :
# 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] :
filtre[i] += build_filtre(champ,expr,neg)
ok = 1
if expr!='*' :
if expr!='*' or neg :
filtre_cond[i] = 1
filtre_tout=0
if not ok :
@ -439,16 +439,16 @@ class crans_ldap :
# Il n'y avait seulement un filtre machine
# => on retourne uniquement les machines trouvées
for m in r['machine'] :
result['machine'].append(machine(m,mode) )
result['machine'].append(machine(m,mode,self.conn) )
elif not r['machine'] :
# Il n'y avait pas de filtre machine
# => on retourne uniquement les adhérents
if r['adherent'] :
for a in r['adherent'] :
result['adherent'].append(adherent(a,mode) )
result['adherent'].append(adherent(a,mode,self.conn) )
if r['club'] :
for a in r['club'] :
result['club'].append(club(a,mode) )
result['club'].append(club(a,mode,self.conn) )
else :
# Il faut croiser les résultats machine et propriétaire
# Traitement des machines
@ -465,12 +465,12 @@ class crans_ldap :
for a in r['adherent'] :
if a[0] in mach_adh and not a[0] in bons_dn :
bons_dn.append(a[0])
result['adherent'].append(adherent(a,mode) )
result['adherent'].append(adherent(a,mode,self.conn) )
if r['club'] :
for a in r['club'] :
if a[0] in mach_adh and not a[0] in bons_dn :
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
bons_dn2 = []
@ -478,7 +478,7 @@ class crans_ldap :
dn = string.join(a[0].split(',')[-4:],',')
if dn in bons_dn and not a[0] in bons_dn2 :
bons_dn2.append(dn)
result['machine'].append(machine(a,mode) )
result['machine'].append(machine(a,mode,self.conn) )
else :
### Recherche d'une chaine sur tous les champs
@ -495,7 +495,7 @@ class crans_ldap :
# Recherche
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
@ -779,7 +779,7 @@ class base_classes_crans(crans_ldap) :
class base_proprietaire(base_classes_crans) :
""" 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
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
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
conn est une instance de la classe de connexion à la base LDAP
"""
if not self.conn : self.conn = conn
if type(data) != tuple :
raise TypeError
@ -816,14 +819,17 @@ class base_proprietaire(base_classes_crans) :
self._modifiable = 'w'
def machines(self) :
""" Retroune les machines (instances) appartenant à la classe """
""" Retourne les machines (instances) appartenant à la classe """
if not self.conn :
self.connect()
if self.id() :
res = []
for r in self.conn.search_s('%s=%s,%s' % ( self.idn,self.id() , self.base_dn ),1,'objectClass=machine') :
res.append(machine(r, self._modifiable) )
return res
try :
for r in self.conn.search_s('%s=%s,%s' % ( self.idn,self.id() , self.base_dn ),1,'objectClass=machine') :
res.append(machine(r, self._modifiable,self.conn) )
return res
except :
return []
else :
return []
@ -850,10 +856,7 @@ class base_proprietaire(base_classes_crans) :
return ''
def delete(self,comment='') :
"""
Destruction du proprietaire, retourne le liste des services à redémarrer
"""
"""Destruction du proprietaire"""
done = 0
for m in self.machines() :
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 """
idn = 'mid'
def __init__(self,parent_or_tuple,typ='fixe') :
def __init__(self,parent_or_tuple,typ='fixe',conn=None) :
"""
parent_or_tuple est :
*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
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._locks=[]
t = parent_or_tuple.__class__
@ -1736,9 +1740,9 @@ class machine(base_classes_crans) :
if len(res) != 1 : njoqmf
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'] :
self.__proprietaire = club(res[0],self._modifiable)
self.__proprietaire = club(res[0],self._modifiable,self.conn)
else :
self.__proprietaire = crans()
@ -1826,9 +1830,7 @@ class machine(base_classes_crans) :
return ret
def delete(self,comment='') :
"""
Destruction de la machines, retourne la liste de services à redémarrer
"""
""" Destruction de la machines """
if self.proprietaire() == crans and not isadm :
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) :
""" Classe définissant l'assoce (pour affichage de ses machines) """
idn = ''
def __init__(s):
def __init__(s,conn=None):
if not s.conn : s.conn = conn
s.dn = s.base_dn
def id(s) :
return ''
@ -1894,7 +1897,7 @@ class crans(crans_ldap) :
res = s.conn.search_s(s.dn,1,'objectClass=machine')
m = []
for r in res :
m.append(machine(r))
m.append(machine(r,'',s.conn))
return m
if __name__ == '__main__' :