[shortcuts] decorateur contre les déco serveur

This commit is contained in:
Daniel STAN 2013-10-11 23:32:32 +02:00
parent ba3898f26d
commit 8431e2d19a

View file

@ -9,6 +9,10 @@ import os.path
import lc_ldap as module_qui_a_le_meme_nom_que_sa_classe_principale
import variables
import functools
from ldap import SERVER_DOWN
from time import sleep
#: Pour enregistrer dans l'historique, on a besoin de savoir qui exécute le script
#: Si le script a été exécuté via un sudo, la variable SUDO_USER (l'utilisateur qui a effectué le sudo)
#: est plus pertinente que USER (qui sera root)
@ -93,3 +97,49 @@ def lc_ldap_local(*args, **kwargs):
kwargs["cred"] = auth_pw
kwargs.setdefault("user", current_user)
return module_qui_a_le_meme_nom_que_sa_classe_principale.lc_ldap(*args, **kwargs)
class with_ldap_conn(object):
"""Décorateur (instance = decorator) pour les fonctions nécessitant une
connexion ldap. Rajoute un argument à la fonction (à la fin) pour passer
la connexion"""
#: fonction à appeler (sans argument) pour créer une connexion
constructor = None
#: nombre d'essais de rattrage de serveurs down, avant échec
retries = 0
#: délai entre deux essais (en secondes)
delay = 1
#: la connexion ldap
conn = None
def __init__(self, constructor=lc_ldap_local, retries=2, delay=1):
self.constructor = constructor
self.retries = retries
self.delay = delay
def apply(self, f, nargs, kargs):
attempt = 0
while True:
attempt += 1
try:
if not self.conn:
self.conn = self.constructor()
return f(*(nargs + (self.conn, )), **kargs)
except SERVER_DOWN:
if attempt >= self.retries:
raise
else:
print "one caught !"
self.conn = None
sleep(self.delay)
def __call__(self, f):
@functools.wraps(f)
def new_f(*nargs, **kargs):
return self.apply(f, nargs, kargs)
return new_f