diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 460b41a0..14e6dad0 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -15,8 +15,11 @@ date_format='%d/%m/%Y %H:%M' hostname = gethostname().split(".")[0] if hostname == "zamok": uri = 'ldapi://%2fvar%2frun%2fldapi/' + rw_uri = uri else: - uri = 'ldaps://zamok.crans.org:636/' + uri = 'ldaps://sila.crans.org:636/' + rw_uri = 'ldaps://zamok.crans.org:636/' + smtpserv = "localhost" # TODO : @@ -30,7 +33,13 @@ from chgpass import chgpass from affich_tools import coul, prompt from time import sleep,localtime -from secrets import ldap_password, ldap_auth_dn +try : + from secrets import ldap_password, ldap_auth_dn +except : + print coul('Warning : impossible de lire le fichier de secret !','jaune') + sleep(2) + ldap_password = '' + ldap_auth_dn = '' random.seed() # On initialise le générateur aléatoire @@ -192,25 +201,61 @@ class crans_ldap : def __init__(self) : self.connect() - + def connect(self): - # Ouverture de la connexion - nbessais = 0 - ok = False - while not ok: - try: - self.conn = ldap.initialize(uri) - self.conn.bind_s(ldap_auth_dn,ldap_password,ldap.AUTH_SIMPLE) - ok = True - except ldap.SERVER_DOWN : - nbessais += 1 - if nbessais > 2: - sys.stderr.write("ERREUR : serveur LDAP injoignable\n") - sys.exit(1) - else: - sleep(0.3) + """ Initialisation des connexion vers le serveur LDAP """ + + def bind(conn) : + """ Authentification auprès du serveur ldap """ + nbessais = 0 + ok = False + while not ok: + try: + conn.bind_s(ldap_auth_dn,ldap_password,ldap.AUTH_SIMPLE) + ok = True + + except ldap.SERVER_DOWN : + nbessais += 1 + if nbessais > 2: + sys.stderr.write("ERREUR : serveur LDAP injoignable\n") + sys.exit(1) + else: + sleep(0.3) + + def select_conn(methode_base, methode_alternative) : + """ Retoune une fonction qui : + 1) bind sur la connection self.conn si necessaire + 2) fait ce que ferai methode_base + 3) si échoue bind sur la connexion self.rw_conn + 4) fait ce que ferai methode_alternative """ - #self.conn.start_tls_s() + def new_methode(*args) : + try : + if not self.__conn_binded : + bind(self.conn) + self.__conn_binded = True + return methode_base(*args) + except ldap.STRONG_AUTH_REQUIRED : + # On a pas les droits necessaires ici + if not self.__rw_conn_binded : + bind(self.__rw_conn) + self.__rw_conn_binded = True + return methode_alternative(*args) + + return new_methode + + # Les objets ldap necessaires + self.conn = ldap.initialize(uri) + self.__conn_binded = False + + self.rw_conn = ldap.initialize(rw_uri) + self.__rw_conn_binded = False + + # Modification des méthodes utilisées + self.conn.search_s = select_conn(self.conn.search_s,self.rw_conn.search_s) + self.conn.add_s = select_conn(self.conn.add_s,self.rw_conn.add_s) + self.conn.modify_s = select_conn(self.conn.modify_s,self.rw_conn.modify_s) + self.conn.delete_s = select_conn(self.conn.delete_s,self.rw_conn.delete_s) def exist(self,arg) : """ @@ -221,7 +266,6 @@ class crans_ldap : Sinon retourne une liste vide Exemple : exist('chbre=Z345') vérifie si il y a un adhérent en Z345 """ - if not self.conn : self.connect() r=[] # Premier test : dans les objets déja inscrits @@ -261,7 +305,6 @@ class crans_ldap : mid $ macAddress $ host $ hostAlias $ ipHostNumber retourne le dn du lock """ - if not self.conn : self.connect() valeur = valeur.encode('utf-8') @@ -296,7 +339,6 @@ class crans_ldap : def remove_lock(self,lockdn) : """ Destruction d'un lock Destruction de tous les locks si lockdn=*""" - if not self.conn : self.connect() # Mettre des verifs ? if lockdn!='*' : self.conn.delete_s(lockdn) @@ -307,7 +349,6 @@ class crans_ldap : def list_locks(self) : """ Liste les locks """ - if not self.conn : self.connect() return self.conn.search_s(self.base_lock,1,'objectClass=lock') def services_to_restart(self,new=None,args=[]) : @@ -316,7 +357,6 @@ class crans_ldap : avec les arguments args (args doit être une liste). Si new est founi et ne comence par - supprime le service de la liste """ - if not self.conn : self.connect() if new and new[0] == '-' : serv_dn = 'cn=%s,%s' % ( new[1:], self.base_services ) @@ -370,7 +410,6 @@ class crans_ldap : soit un seul terme, dans ce cas cherche sur les champs de auto_search_champs Si mode ='w' les instances crées seront en mode d'écriture """ - if not self.conn : self.connect() if type(expression)==str : # Transformation de l'expression en utf-8 @@ -694,8 +733,6 @@ class base_classes_crans(crans_ldap) : if not self.modifs : # Rien à faire return [] - - if not self.conn : self.connect() if not self.dn : # Enregistrement à placer en tête de base @@ -800,7 +837,6 @@ class base_classes_crans(crans_ldap) : index = "%s, %s : %s %s # %s\n" % (time.strftime(date_format), script_utilisateur, t, self.Nom() , comment) # Destruction - self.connect() data = self.conn.search_s(dn,2) data.reverse() # Necessaire pour détruire d'abord les sous-dn @@ -838,7 +874,9 @@ class base_proprietaire(base_classes_crans) : conn est une instance de la classe de connexion à la base LDAP """ - if not self.conn : self.conn = conn + self.conn = conn + if not self.conn : self.connect() + if type(data) != tuple : raise TypeError @@ -867,8 +905,6 @@ class base_proprietaire(base_classes_crans) : def machines(self) : """ Retourne les machines (instances) appartenant à la classe """ - if not self.conn : - self.connect() if self.id() : res = [] try : @@ -1550,7 +1586,8 @@ class machine(base_classes_crans) : conn est une instance de la classe de connexion à la base LDAP """ - if not self.conn : self.conn = conn + self.conn = conn + if not self.conn : self.connect() self.modifs=[] self._locks=[] t = parent_or_tuple.__class__ @@ -1804,8 +1841,6 @@ class machine(base_classes_crans) : retroune le propriétaire de la machine (classe adherent, club ou crans) """ if not self.__proprietaire : - if not self.conn : self.connect() - 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) @@ -1955,7 +1990,8 @@ class crans(crans_ldap) : """ Classe définissant l'assoce (pour affichage de ses machines) """ idn = '' def __init__(s,conn=None): - if not s.conn : s.conn = conn + self.conn = conn + if not self.conn : self.connect() s.dn = s.base_dn def id(s) : return '' @@ -1972,7 +2008,6 @@ class crans(crans_ldap) : def blacklist_actif(s) : return [] def machines(s) : - if not s.conn : s.connect() res = s.conn.search_s(s.dn,1,'objectClass=machine') m = [] for r in res :