[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 lc_ldap as module_qui_a_le_meme_nom_que_sa_classe_principale
|
||||||
import variables
|
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
|
#: 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)
|
#: 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)
|
#: est plus pertinente que USER (qui sera root)
|
||||||
|
@ -93,3 +97,49 @@ def lc_ldap_local(*args, **kwargs):
|
||||||
kwargs["cred"] = auth_pw
|
kwargs["cred"] = auth_pw
|
||||||
kwargs.setdefault("user", current_user)
|
kwargs.setdefault("user", current_user)
|
||||||
return module_qui_a_le_meme_nom_que_sa_classe_principale.lc_ldap(*args, **kwargs)
|
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