[ldap_locks, objets] Juste avant d'écrire dans la base ldap, on vérifie les locks
ils existent toujours et n'ont pas expiré, sinon, il ne faut pas faire l'enregistrement.
This commit is contained in:
parent
3a3d51e408
commit
494cd42d83
2 changed files with 20 additions and 3 deletions
|
@ -47,6 +47,12 @@ class LockError(exceptions.StandardError):
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class LockExpired(LockError):
|
||||||
|
"""
|
||||||
|
Classe d'erreur pour les locks non libéré avant
|
||||||
|
la durée d'expiration du lock
|
||||||
|
"""
|
||||||
|
pass
|
||||||
class LdapLockedByYou(LockError):
|
class LdapLockedByYou(LockError):
|
||||||
"""
|
"""
|
||||||
Classe d'erreur pour les locks par le process courant
|
Classe d'erreur pour les locks par le process courant
|
||||||
|
@ -164,6 +170,14 @@ class LdapLockHolder:
|
||||||
# S'il a été libéré, banzai, sinon, ça lèvera une exception
|
# S'il a été libéré, banzai, sinon, ça lèvera une exception
|
||||||
return self.addlock(item, value, Id)
|
return self.addlock(item, value, Id)
|
||||||
|
|
||||||
|
def check(self, Id='default', delai=0):
|
||||||
|
"""Vérifie que l'on a toujours tous nos locks"""
|
||||||
|
for item, value in self.locks[Id]:
|
||||||
|
host, pid, begin = self.getlock(item, value)
|
||||||
|
time_left = self.timeout - (time.time() - begin)
|
||||||
|
if time_left <= delai:
|
||||||
|
raise LockExpired("Le lock sur la donnée %r=%r à expiré" % (item, value, time_left))
|
||||||
|
|
||||||
def removelock(self, item, value, Id='default', force=False):
|
def removelock(self, item, value, Id='default', force=False):
|
||||||
"""
|
"""
|
||||||
Libère le lock "$item=$value,$LOCKS_DN".
|
Libère le lock "$item=$value,$LOCKS_DN".
|
||||||
|
|
|
@ -369,6 +369,7 @@ class CransLdapObject(object):
|
||||||
modlist = addModlist(ldif)
|
modlist = addModlist(ldif)
|
||||||
# Requête LDAP de création de l'objet
|
# Requête LDAP de création de l'objet
|
||||||
try:
|
try:
|
||||||
|
self.conn.lockholder.check(self.lockId, delai=10)
|
||||||
self.conn.add_s(self.dn, modlist)
|
self.conn.add_s(self.dn, modlist)
|
||||||
except Exception:
|
except Exception:
|
||||||
print traceback.format_exc()
|
print traceback.format_exc()
|
||||||
|
@ -414,6 +415,7 @@ class CransLdapObject(object):
|
||||||
if not self.in_context:
|
if not self.in_context:
|
||||||
# forcer l'utilisation d'un context manager permet d'être certain que les locks seront libéré quoi qu'il arrive
|
# forcer l'utilisation d'un context manager permet d'être certain que les locks seront libéré quoi qu'il arrive
|
||||||
cranslib.deprecated.usage("La suppression d'un objet ne devrait être faite qu'avec des contexts managers (with func() as variable)", level=2)
|
cranslib.deprecated.usage("La suppression d'un objet ne devrait être faite qu'avec des contexts managers (with func() as variable)", level=2)
|
||||||
|
self.conn.lockholder.check(self.lockId, delai=10)
|
||||||
self.bury(comm, login)
|
self.bury(comm, login)
|
||||||
self.conn.delete_s(self.dn)
|
self.conn.delete_s(self.dn)
|
||||||
self.conn.lockholder.purge(self.lockId)
|
self.conn.lockholder.purge(self.lockId)
|
||||||
|
@ -435,13 +437,12 @@ class CransLdapObject(object):
|
||||||
# On récupère la liste des modifications
|
# On récupère la liste des modifications
|
||||||
modlist = self.get_modlist()
|
modlist = self.get_modlist()
|
||||||
try:
|
try:
|
||||||
|
self.conn.lockholder.check(self.lockId, delai=10)
|
||||||
self.conn.modify_s(self.dn, modlist)
|
self.conn.modify_s(self.dn, modlist)
|
||||||
self.conn.lockholder.purge(self.lockId)
|
self.conn.lockholder.purge(self.lockId)
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
# On nettoie les locks
|
|
||||||
self.conn.lockholder.purge(self.lockId)
|
|
||||||
self.cancel()
|
self.cancel()
|
||||||
raise EnvironmentError("Impossible de modifier l'objet, peut-être n'existe-t-il pas ? %r" % error)
|
raise EnvironmentError("Impossible de modifier l'objet: %r" % error)
|
||||||
|
|
||||||
# On programme le redémarrage des services
|
# On programme le redémarrage des services
|
||||||
services.services_to_restart(self.conn, self.attrs, self._modifs)
|
services.services_to_restart(self.conn, self.attrs, self._modifs)
|
||||||
|
@ -455,6 +456,8 @@ class CransLdapObject(object):
|
||||||
"""
|
"""
|
||||||
old_uldif = lc_ldap.ldif_to_uldif(self.conn.search_s(self.dn, ldap.SCOPE_BASE)[0][1])
|
old_uldif = lc_ldap.ldif_to_uldif(self.conn.search_s(self.dn, ldap.SCOPE_BASE)[0][1])
|
||||||
self._modifs = attributs.AttrsDict(self.conn, old_uldif, Parent=self)
|
self._modifs = attributs.AttrsDict(self.conn, old_uldif, Parent=self)
|
||||||
|
# On nettoie les locks
|
||||||
|
self.conn.lockholder.purge(self.lockId)
|
||||||
|
|
||||||
def check_modifs(self):
|
def check_modifs(self):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue