[Oops] J'ai oublié de commiter un de mes débugs.

This commit is contained in:
Pierre-Elliott Bécue 2013-06-13 20:34:59 +02:00
parent 80929daddd
commit e18e5222b7
5 changed files with 53 additions and 29 deletions

View file

@ -556,8 +556,7 @@ class chbre(Attr):
ldap_name = "chbre" ldap_name = "chbre"
def parse_value(self, chambre): def parse_value(self, chambre):
if self.parent != None: if self.parent != None and u'club' in [str(o) for o in self.parent['objectClass']]:
if u'club' in [str(o) for o in self.parent['objectClass']]:
if chambre in annuaires_pg.locaux_clubs(): if chambre in annuaires_pg.locaux_clubs():
self.value = chambre self.value = chambre
else: else:

View file

@ -51,7 +51,7 @@ def find_rid_plage(rid):
if isinstance(plages, list): if isinstance(plages, list):
for begin, end in plages: for begin, end in plages:
if begin <= rid <= end: if begin <= rid <= end:
return tp, (begin, end) return tp, config.rid_primaires[tp][0]
else: else:
(begin, end) = plages (begin, end) = plages
if begin <= rid <= end: if begin <= rid <= end:

View file

@ -172,7 +172,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
:py:class:`CransLdapObject`. On utilise la feature de ``sizelimit`` de :py:class:`CransLdapObject`. On utilise la feature de ``sizelimit`` de
``python-ldap``""" ``python-ldap``"""
if not isinstance(filterstr, unicode): if not isinstance(filterstr, unicode):
cranslib.deprecated.usage("search ne devrait utiliser que des unicode comme filtre(%r)" % filterstr, level=3) cranslib.deprecated.usage("search ne devrait utiliser que des unicode comme filtre(%r)" % filterstr, level=2)
filterstr = filterstr.decode('utf-8') filterstr = filterstr.decode('utf-8')
ldap_res = self.search_ext_s(dn, scope, filterstr.encode('utf-8'), sizelimit=sizelimit) ldap_res = self.search_ext_s(dn, scope, filterstr.encode('utf-8'), sizelimit=sizelimit)
ret = [] ret = []
@ -314,7 +314,14 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
for attribut in attribs: for attribut in attribs:
if attribut.unique: if attribut.unique:
self.lockholder.addlock(key, str(attribut)) self.lockholder.addlock(key, str(attribut))
try:
return objets.new_cransldapobject(self, dn, 'rw', uldif) return objets.new_cransldapobject(self, dn, 'rw', uldif)
except ldap_locks.LockError:
for key, values in uldif.iteritems():
attribs = [attributs.attrify(val, key, self) for val in values]
for attribut in attribs:
self.lockholder.removelock(key, str(attribut))
raise
def _find_id(self, attr, plage=None): def _find_id(self, attr, plage=None):
'''Trouve un id libre. Si une plage est fournie, cherche '''Trouve un id libre. Si une plage est fournie, cherche
@ -343,7 +350,14 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
(attr, plage[0], i)) (attr, plage[0], i))
else: else:
i = nonfree[-1] + 1 i = nonfree[-1] + 1
while True:
try:
self.lockholder.addlock(attr, str(i)) self.lockholder.addlock(attr, str(i))
break
except ldap_locks.LockError:
i += 1
except Exception:
raise
return i return i
def _check_parent(self, objdn): def _check_parent(self, objdn):

View file

@ -40,20 +40,27 @@ import socket
import crans_utils import crans_utils
import collections import collections
import subprocess import subprocess
import time
class LdapLockedByYou(exceptions.StandardError): class LockError(exceptions.StandardError):
"""
Erreur standard de lock
"""
pass
class LdapLockedByYou(LockError):
""" """
Classe d'erreur pour les locks par le process courant Classe d'erreur pour les locks par le process courant
""" """
pass pass
class LdapLockedByOther(exceptions.StandardError): class LdapLockedByOther(LockError):
""" """
Erreur car le lock est occupé par un autre process. Erreur car le lock est occupé par un autre process.
""" """
pass pass
class LockFormatError(exceptions.StandardError): class LockFormatError(LockError):
""" """
L'objet lock qu'on a récupéré n'est pas tel qu'on le voudrait L'objet lock qu'on a récupéré n'est pas tel qu'on le voudrait
""" """
@ -110,26 +117,29 @@ class LdapLockHolder:
Sinon, on ne peut pas override le lock, et on laisse Sinon, on ne peut pas override le lock, et on laisse
tomber. tomber.
""" """
try: try:
host, pid = self.getlock(item, value, Id) host, pid, begin = self.getlock(item, value)
if host == self.host and pid == self.pid: if time.time() - begin >= 600.0:
self.removelock(item, value, Id, True)
elif host == self.host and pid == self.pid:
raise LdapLockedByYou("La donnée %r=%r est lockée par vous-même." % (item, value)) raise LdapLockedByYou("La donnée %r=%r est lockée par vous-même." % (item, value))
elif host == self.host: elif host == self.host:
status = crans_utils.process_status(pid) status = crans_utils.process_status(pid)
if status: if status:
raise LdapLockedByOther("La donnée %r=%r est lockée par quelqu'un d'autre ou un processus." % (item, value)) raise LdapLockedByOther("La donnée %r=%r est lockée par un processus actif." % (item, value))
else: else:
self.removelock(item, value, Id, True) self.removelock(item, value, Id, True)
else: else:
raise LdapLockedByOther("La donnée %r=%r est lockée par quelqu'un d'autre ou un processus." % (item, value)) raise LdapLockedByOther("La donnée %r=%r est lockée depuis une autre machine." % (item, value))
except ldap.NO_SUCH_OBJECT: except ldap.NO_SUCH_OBJECT:
pass pass
except LockFormatError: except LockFormatError:
self.removelock(item, value, Id) self.removelock(item, value, Id)
except Exception:
raise
dn = "%s=%s,%s" % (item, value, LOCKS_DN) dn = "%s=%s,%s" % (item, value, LOCKS_DN)
lockid = "%s-%s" % (self.host, self.pid) lockid = "%s-%s-%s" % (self.host, self.pid, time.time())
modlist = ldap.modlist.addModlist({'objectClass' : 'lock', modlist = ldap.modlist.addModlist({'objectClass' : 'lock',
'lockid' : lockid, 'lockid' : lockid,
item : value}) item : value})
@ -140,7 +150,7 @@ class LdapLockHolder:
except ldap.ALREADY_EXISTS: except ldap.ALREADY_EXISTS:
status = crans_utils.process_status(pid) status = crans_utils.process_status(pid)
if status: if status:
raise LdapLockedByOther("La donnée %r=%r est lockée par quelqu'un d'autre ou un processus." % (item, value)) raise LdapLockedByOther("La donnée %r=%r est lockée par un processus actif." % (item, value))
else: else:
self.removelock(item, value, Id) self.removelock(item, value, Id)
try: try:
@ -167,18 +177,19 @@ class LdapLockHolder:
except: except:
pass pass
def getlock(self, item, value, Id): def getlock(self, item, value):
""" """
Trouve le lock item=value, et renvoie le contenu de lockinfo Trouve le lock item=value, et renvoie le contenu de lockinfo
via un couple host, pid via un triplet host, pid, begin
""" """
result = self.conn.search_s('%s=%s,%s' % (item, value, LOCKS_DN), 0) result = self.conn.search_s('%s=%s,%s' % (item, value, LOCKS_DN), 0)
if not result:
_ = self.locks[Id].pop(item)
return None, 0
try: try:
try:
host, pid, begin = result[0][1]['lockid'][0].split('-')
except:
host, pid = result[0][1]['lockid'][0].split('-') host, pid = result[0][1]['lockid'][0].split('-')
return host, int(pid) begin = time.time()
return host, int(pid), float(begin)
except: except:
raise LockFormatError raise LockFormatError

View file

@ -565,7 +565,7 @@ class proprio(CransLdapObject):
def machines(self): def machines(self):
"""Renvoie la liste des machines""" """Renvoie la liste des machines"""
if self._machines is None: if self._machines is None:
self._machines = self.conn.search('mid=*', dn = self.dn, scope = 1, mode=self.mode) self._machines = self.conn.search(u'mid=*', dn = self.dn, scope = 1, mode=self.mode)
for m in self._machines: for m in self._machines:
m._proprio = self m._proprio = self
return self._machines return self._machines
@ -622,14 +622,14 @@ class machine(CransLdapObject):
def _post_creation(self): def _post_creation(self):
"""Fonction qui effectue quelques tâches lorsque la création est """Fonction qui effectue quelques tâches lorsque la création est
faite""" faite"""
if self._proprio: if self._proprio is not None:
if self._proprio._machines: if self._proprio._machines is not None:
self._proprio._machines.append(self) self._proprio._machines.append(self)
def _post_deletion(self): def _post_deletion(self):
"""Fonction qui effectue quelques tâches lorsque l'on veut effacer""" """Fonction qui effectue quelques tâches lorsque l'on veut effacer"""
if self._proprio: if self._proprio is not None:
if self._proprio._machines: if self._proprio._machines is not None:
self._proprio._machines.remove(self) self._proprio._machines.remove(self)
class AssociationCrans(proprio): class AssociationCrans(proprio):