[Oops] J'ai oublié de commiter un de mes débugs.
This commit is contained in:
parent
80929daddd
commit
e18e5222b7
5 changed files with 53 additions and 29 deletions
|
@ -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:
|
||||||
|
|
|
@ -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:
|
||||||
|
|
18
lc_ldap.py
18
lc_ldap.py
|
@ -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
|
||||||
|
@ -342,8 +349,15 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
|
||||||
raise EnvironmentError('Aucun %s libre dans la plage [%d, %d]' %
|
raise EnvironmentError('Aucun %s libre dans la plage [%d, %d]' %
|
||||||
(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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
10
objets.py
10
objets.py
|
@ -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):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue