[shortcuts] decorateur contre les déco serveur
This commit is contained in:
parent
ba3898f26d
commit
8431e2d19a
1 changed files with 50 additions and 0 deletions
50
shortcuts.py
50
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue