[global] On diminue le risque de lock résiduel, et on corrige une faille des fonctions new[A-Z]*

* En cas d'erreur au create ou au save, on supprime les locks malgré tout
    * Les fonctions new* modifiaient directement le dico qu'on leur passait en
    argument, on fait désormais une copie de celui-ci, de façon à ce que test.py
    n'instancie pas toujours le même objet en croyant instancier des objets
    différents à chaque fois
    * Cela permet de trouver une typo dans services.py
    * crans_utils a été un peu corrigé.
This commit is contained in:
Pierre-Elliott Bécue 2013-05-30 18:44:15 +02:00
parent e0bce3f7d3
commit 616acdbb7a
6 changed files with 52 additions and 21 deletions

View file

@ -44,6 +44,7 @@ import re
import datetime
import time
import ldap
import traceback
from ldap.modlist import addModlist, modifyModlist
## import locaux
@ -189,24 +190,36 @@ class CransLdapObject(object):
faite"""
pass
def create(self):
def create(self, login=None):
"""Crée l'objet dans la base ldap, cette méthode vise à faire en sorte que
l'objet se crée lui-même, si celui qui essaye de le modifier a les droits
de le faire."""
if login is None:
login = self.conn.current_login
self._check_optionnal(comment="créez")
self.history_add(login, u"Inscription")
# Création de la requête LDAP
modlist = addModlist(self._modifs.to_ldif())
# Requête LDAP de création de l'objet
self.conn.add_s(self.dn, modlist)
try:
self.conn.add_s(self.dn, modlist)
except Exception:
print traceback.format_exc()
return
# On nettoie les locks
for key, values in self._modifs.to_ldif().iteritems():
for value in values:
self.conn.lockholder.removelock(key, value)
self.conn.lockholder.purge(id(self))
# Services à relancer
services.services_to_restart(self.conn, {}, self._modifs)
self._post_creation()
# Vérifications après insertion.
self.check_modifs()
def bury(self, comm, login):
"""Sauvegarde l'objet dans un fichier dans le cimetière."""
@ -251,25 +264,33 @@ class CransLdapObject(object):
try:
self.conn.modify_s(self.dn, modlist)
except:
# On nettoie les locks
self.conn.lockholder.purge(id(self))
self._modifs = self.attrs
raise EnvironmentError("Impossible de modifier l'objet, peut-être n'existe-t-il pas ?")
# On programme le redémarrage des services
services.services_to_restart(self.conn, self.attrs, self._modifs)
# On nettoie les locks
self.conn.lockholder.purge(id(self))
# Vérification des modifications.
self.check_modifs()
def check_modifs(self):
"""
Fonction qui vérifie que les modifications se sont bien
passées.
"""
# Vérification des modifications
old_ldif = self.conn.search_s(self.dn, ldap.SCOPE_BASE)[0][1]
old_uldif = lc_ldap.ldif_to_uldif(old_ldif)
old_uldif = lc_ldap.ldif_to_uldif(self.conn.search_s(self.dn, ldap.SCOPE_BASE)[0][1])
self.attrs = attributs.AttrsDict(self.conn, old_uldif, Parent=self)
differences = []
# On fait les différences entre les deux dicos
for attr in set(self.attrs.keys()).union(set(self._modifs.keys())):
exp_vals = set([unicode(i) for i in self.attrs.get(attr, [])])
new_vals = set([unicode(i) for i in self._modifs.get(attr, [])])
exp_vals = set([str(i) for i in self.attrs.get(attr, [])])
new_vals = set([str(i) for i in self._modifs.get(attr, [])])
if exp_vals != new_vals:
differences.append({"missing": exp_vals - new_vals, "having": new_vals - exp_vals})
print differences[-1]
if differences:
raise EnvironmentError("Les modifications apportées à l'objet %s n'ont pas été correctement sauvegardées\n%s" % (self.dn, differences))