[Scripts] On rajoute un champ rid qui fait le lien avec les plages d'ip, et on rend le mid strictement croissant.
Ignore-this: 199e9ff5f09e1fe600c1066179f4e47b Ce patch est un test, il ne restera en prod que si ça fonctionne. L'idée est qu'on souhaiterait conserver les vieilles machines comme les vieux adhérents, sauf demande explicite de suppression, par ailleurs, l'association mid <=> ip est très utile pour pas mal de choses. Pour la conserver, on crée un identifiant rid, qui supplante le mid, qui est lui choisi comme l'aid ou le fid, en incrémentant. Ce patch vise à implémenter cela. S'il génère des bugs, il subira un rollback. darcs-hash:20130123021650-b6762-347428d75f066f7f4821ca067d8c9bb6a4396bf5.gz
This commit is contained in:
parent
70f5ff906a
commit
2a7dd72069
9 changed files with 150 additions and 138 deletions
|
@ -22,7 +22,7 @@ from email_tools import send_email
|
|||
from syslog import openlog, closelog, syslog
|
||||
from numeros_disponibles import lister_ip_dispo
|
||||
from unicodedata import normalize
|
||||
import midtools
|
||||
import ridtools
|
||||
|
||||
date_format = '%d/%m/%Y %H:%M'
|
||||
hostname = gethostname().split(".")[0]
|
||||
|
@ -366,7 +366,7 @@ class CransLdap:
|
|||
non_auto_search_machines_champs = \
|
||||
['mid', 'historique', 'blacklist', 'info', 'exempt', 'mblacklist',
|
||||
'portTCPin', 'portTCPout', 'portUDPin', 'portUDPout', 'dnsIpv6', 'machineAlias',
|
||||
'sshFingerprint']
|
||||
'sshFingerprint', 'rid']
|
||||
|
||||
non_auto_search_champs = { \
|
||||
'adherent': \
|
||||
|
@ -481,7 +481,7 @@ class CransLdap:
|
|||
peuvent être :
|
||||
|
||||
aid $ chbre $ mail $ mailAlias $ canonicalAlias $
|
||||
mid $ macAddress $ host $ hostAlias $ ipHostNumber $
|
||||
mid $ rid $ macAddress $ host $ hostAlias $ ipHostNumber $
|
||||
gpgFingerprint
|
||||
|
||||
Retourne le dn du lock
|
||||
|
@ -1275,49 +1275,41 @@ class BaseClasseCrans(CransLdap):
|
|||
|
||||
if not self._init_data:
|
||||
### Nouvel enregistrement
|
||||
# Forcage de mid correspondant à l'ip.
|
||||
if self.idn == 'mid':
|
||||
my_mid = midtools.Mid(ipv4=self._data["ipHostNumber"][0])
|
||||
self.dn = '%s=%d,%s' % (self.idn, my_mid, self.dn)
|
||||
self._data[self.idn] = [ '%d' % my_mid ]
|
||||
modlist = ldap.modlist.addModlist(self._data)
|
||||
self.conn.add_s(self.dn, modlist)
|
||||
else:
|
||||
# L'enregistrement peut échouer en cas de choix de dn concurrents
|
||||
# (il n'y a pas de lock sur les dn)
|
||||
for i in range(0, 5): # 5 tentatives
|
||||
# Génération du dn
|
||||
res = self.conn.search_s(self.base_dn, ldap.SCOPE_SUBTREE, self.filtre_idn)
|
||||
vidn = 1
|
||||
vidns = []
|
||||
# Liste des dn pris
|
||||
for r in res:
|
||||
# r = ( dn, {} )
|
||||
r = r[0].split(',')[0]
|
||||
if r[:4] != '%s=' % self.idn: continue
|
||||
vidns.append(int(r[4:]))
|
||||
if self.idn == 'fid' or self.idn == 'aid':
|
||||
# Pour une facture on prend un nouveau numéro
|
||||
vidn = max([0] + vidns) + 1
|
||||
else:
|
||||
# Sinon on prend le premier libre
|
||||
while vidn in vidns:
|
||||
vidn += 1
|
||||
# L'enregistrement peut échouer en cas de choix de dn concurrents
|
||||
# (il n'y a pas de lock sur les dn)
|
||||
for i in range(0, 5): # 5 tentatives
|
||||
# Génération du dn
|
||||
res = self.conn.search_s(self.base_dn, ldap.SCOPE_SUBTREE, self.filtre_idn)
|
||||
vidn = 1
|
||||
vidns = []
|
||||
# Liste des dn pris
|
||||
for r in res:
|
||||
# r = ( dn, {} )
|
||||
r = r[0].split(',')[0]
|
||||
if r[:4] != '%s=' % self.idn: continue
|
||||
vidns.append(int(r[4:]))
|
||||
if self.idn == 'fid' or self.idn == 'aid' or self.idn == 'mid':
|
||||
# Pour une facture on prend un nouveau numéro
|
||||
vidn = max([0] + vidns) + 1
|
||||
else:
|
||||
# Sinon on prend le premier libre
|
||||
while vidn in vidns:
|
||||
vidn += 1
|
||||
|
||||
self.dn = '%s=%s,%s' % (self.idn, vidn, self.dn)
|
||||
self._data[self.idn] = [ '%d' % vidn ]
|
||||
self.dn = '%s=%s,%s' % (self.idn, vidn, self.dn)
|
||||
self._data[self.idn] = [ '%d' % vidn ]
|
||||
|
||||
try:
|
||||
# Ecriture
|
||||
modlist = ldap.modlist.addModlist(self._data)
|
||||
self.conn.add_s(self.dn, modlist)
|
||||
break
|
||||
except Exception, e:
|
||||
# On logge
|
||||
syslog("ldap_crans: exception: %s" % e)
|
||||
try:
|
||||
# Ecriture
|
||||
modlist = ldap.modlist.addModlist(self._data)
|
||||
self.conn.add_s(self.dn, modlist)
|
||||
break
|
||||
except Exception, e:
|
||||
# On logge
|
||||
syslog("ldap_crans: exception: %s" % e)
|
||||
raise
|
||||
if i == 4:
|
||||
raise
|
||||
if i == 4:
|
||||
raise
|
||||
|
||||
else:
|
||||
### Modification entrée
|
||||
|
@ -1330,16 +1322,14 @@ class BaseClasseCrans(CransLdap):
|
|||
champ = c.args[0]['info'].split(':')[0]
|
||||
raise RuntimeError(u'Entrée en double dans le champ %s' % champ)
|
||||
|
||||
# l'ip change, le mid aussi...
|
||||
# l'ip change, le rid aussi...
|
||||
if 'ipHostNumber' in self.modifs:
|
||||
try:
|
||||
mid = midtools.Mid(ipv4 = self._data["ipHostNumber"][0])
|
||||
rid = ridtools.Rid(ipv4 = self._data["ipHostNumber"][0])
|
||||
except ValueError:
|
||||
pass
|
||||
else:
|
||||
self.conn.rename_s(self.dn, "%s=%d" % (self.idn, mid))
|
||||
self.dn = "%s=%d,%s" % (self.idn, mid, self.dn.split(',', 1)[1])
|
||||
self._data[self.idn] = [ '%d' % mid ]
|
||||
self.rid('%d' % rid)
|
||||
|
||||
|
||||
### Génération de la liste de services à redémarrer
|
||||
|
@ -3106,12 +3096,30 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
|
|||
if self.exist('ipHostNumber=%s' % ip):
|
||||
raise ValueError(u'IP déjà prise.')
|
||||
|
||||
my_rid = ridtools.Rid(ipv4=self._data["ipHostNumber"][0])
|
||||
|
||||
# Lock ip
|
||||
self.lock('ipHostNumber', ip)
|
||||
|
||||
self._set('ipHostNumber', [ip])
|
||||
|
||||
self.rid("%d" % my_rid)
|
||||
return ip
|
||||
|
||||
def rid(self, rid=None):
|
||||
"""
|
||||
Retourne le rid si rid == None, l'affecte sinon.
|
||||
"""
|
||||
if rid == None:
|
||||
return self._data.get('rid', [''])[0]
|
||||
|
||||
rid_t = ridtools.Rid(ipv4=self.ip())
|
||||
|
||||
if int(rid_t) != int(rid):
|
||||
raise ValueError('L\'ip et le rid doivent correspondre.')
|
||||
|
||||
self.lock('rid', '%s' % rid)
|
||||
self._set('rid', ['%s' % rid])
|
||||
|
||||
def exempt(self, new=None):
|
||||
"""
|
||||
Liste des réseaux vers lesquels on ne compte pas l'upload
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue