From 31ef74981002cbc8555744286bca93bfd1f04c15 Mon Sep 17 00:00:00 2001 From: bernat Date: Tue, 31 Aug 2004 17:34:42 +0200 Subject: [PATCH] Evite d'ouvrir 1000 connexions la base LDAP darcs-hash:20040831153442-d1718-cb93c1c5da074b56a61db18e225e8ee9148bffd6.gz --- gestion/gen_confs/generate.py | 2 +- gestion/ldap_crans.py | 57 ++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/gestion/gen_confs/generate.py b/gestion/gen_confs/generate.py index 31bef6a9..86423df8 100755 --- a/gestion/gen_confs/generate.py +++ b/gestion/gen_confs/generate.py @@ -124,7 +124,7 @@ if inst : ##### Récolte des données cprint('Lecture base LDAP','gras') # Machines de l'assoce - machines = crans().machines() + machines = crans(db.conn).machines() # Machines des adhérents et clubs de l'année en cours if localtime()[1] == 9: # On est en septembre, on autorise ceux qui ont payé l'an dernier et cette année diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 76dc19c3..4c48fb2a 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -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__' :