Si pas sur zamok ouverture d'une connexion pour lecture sur sila et une pour

criture sur zamok.

darcs-hash:20041003151936-41617-699e21bd1ab937fd1e9ea54041fe04a2bfa6d0ac.gz
This commit is contained in:
pauget 2004-10-03 17:19:36 +02:00
parent 6c454d6b2b
commit 43deffd0e2

View file

@ -15,8 +15,11 @@ date_format='%d/%m/%Y %H:%M'
hostname = gethostname().split(".")[0] hostname = gethostname().split(".")[0]
if hostname == "zamok": if hostname == "zamok":
uri = 'ldapi://%2fvar%2frun%2fldapi/' uri = 'ldapi://%2fvar%2frun%2fldapi/'
rw_uri = uri
else: else:
uri = 'ldaps://zamok.crans.org:636/' uri = 'ldaps://sila.crans.org:636/'
rw_uri = 'ldaps://zamok.crans.org:636/'
smtpserv = "localhost" smtpserv = "localhost"
# TODO : # TODO :
@ -30,7 +33,13 @@ from chgpass import chgpass
from affich_tools import coul, prompt from affich_tools import coul, prompt
from time import sleep,localtime 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 random.seed() # On initialise le générateur aléatoire
@ -192,25 +201,61 @@ class crans_ldap :
def __init__(self) : def __init__(self) :
self.connect() self.connect()
def connect(self): def connect(self):
# Ouverture de la connexion """ Initialisation des connexion vers le serveur LDAP """
nbessais = 0
ok = False def bind(conn) :
while not ok: """ Authentification auprès du serveur ldap """
try: nbessais = 0
self.conn = ldap.initialize(uri) ok = False
self.conn.bind_s(ldap_auth_dn,ldap_password,ldap.AUTH_SIMPLE) while not ok:
ok = True try:
except ldap.SERVER_DOWN : conn.bind_s(ldap_auth_dn,ldap_password,ldap.AUTH_SIMPLE)
nbessais += 1 ok = True
if nbessais > 2:
sys.stderr.write("ERREUR : serveur LDAP injoignable\n") except ldap.SERVER_DOWN :
sys.exit(1) nbessais += 1
else: if nbessais > 2:
sleep(0.3) 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) : def exist(self,arg) :
""" """
@ -221,7 +266,6 @@ class crans_ldap :
Sinon retourne une liste vide Sinon retourne une liste vide
Exemple : exist('chbre=Z345') vérifie si il y a un adhérent en Z345 Exemple : exist('chbre=Z345') vérifie si il y a un adhérent en Z345
""" """
if not self.conn : self.connect()
r=[] r=[]
# Premier test : dans les objets déja inscrits # Premier test : dans les objets déja inscrits
@ -261,7 +305,6 @@ class crans_ldap :
mid $ macAddress $ host $ hostAlias $ ipHostNumber mid $ macAddress $ host $ hostAlias $ ipHostNumber
retourne le dn du lock retourne le dn du lock
""" """
if not self.conn : self.connect()
valeur = valeur.encode('utf-8') valeur = valeur.encode('utf-8')
@ -296,7 +339,6 @@ class crans_ldap :
def remove_lock(self,lockdn) : def remove_lock(self,lockdn) :
""" Destruction d'un lock """ Destruction d'un lock
Destruction de tous les locks si lockdn=*""" Destruction de tous les locks si lockdn=*"""
if not self.conn : self.connect()
# Mettre des verifs ? # Mettre des verifs ?
if lockdn!='*' : if lockdn!='*' :
self.conn.delete_s(lockdn) self.conn.delete_s(lockdn)
@ -307,7 +349,6 @@ class crans_ldap :
def list_locks(self) : def list_locks(self) :
""" Liste les locks """ """ Liste les locks """
if not self.conn : self.connect()
return self.conn.search_s(self.base_lock,1,'objectClass=lock') return self.conn.search_s(self.base_lock,1,'objectClass=lock')
def services_to_restart(self,new=None,args=[]) : def services_to_restart(self,new=None,args=[]) :
@ -316,7 +357,6 @@ class crans_ldap :
avec les arguments args (args doit être une liste). avec les arguments args (args doit être une liste).
Si new est founi et ne comence par - supprime le service de la 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] == '-' : if new and new[0] == '-' :
serv_dn = 'cn=%s,%s' % ( new[1:], self.base_services ) 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 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 Si mode ='w' les instances crées seront en mode d'écriture
""" """
if not self.conn : self.connect()
if type(expression)==str : if type(expression)==str :
# Transformation de l'expression en utf-8 # Transformation de l'expression en utf-8
@ -694,8 +733,6 @@ class base_classes_crans(crans_ldap) :
if not self.modifs : if not self.modifs :
# Rien à faire # Rien à faire
return [] return []
if not self.conn : self.connect()
if not self.dn : if not self.dn :
# Enregistrement à placer en tête de base # 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) index = "%s, %s : %s %s # %s\n" % (time.strftime(date_format), script_utilisateur, t, self.Nom() , comment)
# Destruction # Destruction
self.connect()
data = self.conn.search_s(dn,2) data = self.conn.search_s(dn,2)
data.reverse() # Necessaire pour détruire d'abord les sous-dn 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 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 : if type(data) != tuple :
raise TypeError raise TypeError
@ -867,8 +905,6 @@ class base_proprietaire(base_classes_crans) :
def machines(self) : def machines(self) :
""" Retourne les machines (instances) appartenant à la classe """ """ Retourne les machines (instances) appartenant à la classe """
if not self.conn :
self.connect()
if self.id() : if self.id() :
res = [] res = []
try : try :
@ -1550,7 +1586,8 @@ class machine(base_classes_crans) :
conn est une instance de la classe de connexion à la base LDAP 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.modifs=[]
self._locks=[] self._locks=[]
t = parent_or_tuple.__class__ 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) retroune le propriétaire de la machine (classe adherent, club ou crans)
""" """
if not self.__proprietaire : if not self.__proprietaire :
if not self.conn : self.connect()
res = self.conn.search_s(','.join(self.dn.split(',')[1:]),0) res = self.conn.search_s(','.join(self.dn.split(',')[1:]),0)
if 'adherent' in res[0][1]['objectClass'] : if 'adherent' in res[0][1]['objectClass'] :
self.__proprietaire = adherent(res[0],self._modifiable,self.conn) 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) """ """ Classe définissant l'assoce (pour affichage de ses machines) """
idn = '' idn = ''
def __init__(s,conn=None): 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 s.dn = s.base_dn
def id(s) : def id(s) :
return '' return ''
@ -1972,7 +2008,6 @@ class crans(crans_ldap) :
def blacklist_actif(s) : def blacklist_actif(s) :
return [] return []
def machines(s) : def machines(s) :
if not s.conn : s.connect()
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 :