diff --git a/shortcuts.py b/shortcuts.py index fcc544b..5800243 100644 --- a/shortcuts.py +++ b/shortcuts.py @@ -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