Modification de l'attribution des ip, on n'utilise plus numerodisp, on cherche par rid dispo

This commit is contained in:
Gabriel Detraz 2015-05-25 12:51:27 +02:00
parent 1d82e0c95c
commit 8745a89176

View file

@ -3246,44 +3246,53 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
l, ip = preattr(ip)
# Dans quel réseau la machine doit-elle être placée ?
# Dans quel sous réseau se trouve le rid?
if isinstance(self, MachineWifi):
net = config.NETs['wifi-adh']
pool_ip = lister_ip_dispo('wifi-adh')
mach_type = u'wifi-adh'
plage_rid = config.rid_primaires['wifi-adh']
elif isinstance(self, BorneWifi):
net = config.NETs['bornes']
pool_ip = lister_ip_dispo('bornes')
mach_type = u'bornes'
plage_rid = config.rid_primaires['bornes']
elif isinstance(self.proprietaire(), AssociationCrans):
net = [ '0.0.0.0/0' ]
pool_ip = lister_ip_dispo('all')
mach_type = u'crans'
plage_rid = config.rid_primaires['serveurs']
else:
proprio = self.proprietaire()
if proprio.etudes(0) == 'Personnel ENS':
net = config.NETs['personnel-ens']
pool_ip = lister_ip_dispo('personnel-ens')
mach_type = u'personnel-ens'
plage_rid = config.rid_primaires['personnel-ens']
elif not isinstance(proprio, Adherent) or proprio.adherentPayant():
proprio_subnet = 'adherents'
mach_type = 'adherents'
try:
net = config.NETs[proprio_subnet]
pool_ip = lister_ip_dispo(proprio_subnet)
plage_rid = config.rid_primaires[proprio_subnet]
except:
raise RuntimeError(u'Impossible de trouver le réseau où placer la machine.')
else:
net = config.NETs["gratuit"]
pool_ip = lister_ip_dispo("gratuit")
#On essaye d'attribuer une ipv4, on cherche un rid dispo
if ip == '<automatique>':
# On va prendre choisir une IP au hasard dans le pool des IP dispo
random.shuffle(pool_ip)
while len(pool_ip) > 0:
ip = pool_ip.pop() # On choisit une IP
if not self.exist('ipHostNumber=%s' % ip):
# On a trouvé la première ip libre
pool_ip.append(ip)
for plage in plage_rid:
rid_pris = [int(elem[1]['rid'][0]) for elem in self.conn.search_ext_s(self.base_dn, ldap.SCOPE_SUBTREE, "(&(rid>=%s)(rid<=%s))" % (plage[0], plage[1]))]
#print sorted(rid_pris)
# Par defaut la plage est pas v6 (cf bornes/bornes v6)
v6 = False
for rid in range(plage[0],plage[1]):
if rid not in rid_pris:
# On verifie que l'ip se termine pas par 0 ou 255 et que il y a une ipv4 dispo (on sort si on est dans une plage v6)
if not ridtools.Rid(rid=rid).ipv4_dispo:
v6 = True
break
# On vire les ip qui se terminent par 0 ou 255 (toutes, thanks windows)
if rid % 256 != 0 and rid % 256 != 255:
ip = unicode(ridtools.Rid(rid=rid).ipv4())
break
# Si on a une ip, ou que la plage est v6, on s'en va
if ip != '<automatique>' or v6:
break
if not len(pool_ip):
# Si après tout ca, on a encore auto et que c'est pas une plage v6, ya plus d'ip
if ip == '<automatique>' and not v6:
raise RuntimeError(u"Plus d'IP libres dans %s." % ' et '.join(net))
elif ip == '':
@ -3293,7 +3302,8 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
# L'ip est elle dans le bon sous-réseau ?
# (accessoirement teste si l'IP est valide et ne correspond pas
# à l'adresse de broadcast ou de réseau)
if not iptools.AddrInNet(ip, net):
rid = ridtools.Rid(ipv4=ip).rid
if not mach_type==u'crans' and not unicode(ridtools.find_rid_plage(rid)[0])==mach_type :
raise ValueError(u'IP invalide ou en dehors du sous-réseau alloué.', 1)
# Reformatage
ip = iptools.DecToQuad(iptools.QuadToDec(ip))
@ -3301,15 +3311,16 @@ 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.')
if ip != None:
# On recalcule le rid si il existe pas deja, ou que l'ip est pas v6 only
if ip != None and not v6:
rid = ridtools.Rid(ipv4=ip)
else:
elif ip != '<automatique>':
rid = self.rid()
if rid == '':
pass
# Lock ip
if lock and ip:
if lock and ip and ip != '<automatique>':
self.lock('ipHostNumber', ip)
self._set('ipHostNumber', [ip])
@ -3323,8 +3334,8 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
if rid == None:
return self._data.get('rid', [''])[0]
if self.ip() != '<automatique>':
rid_t = ridtools.Rid(ipv4=self.ip())
if int(rid_t) != int(rid):
raise ValueError('L\'ip et le rid doivent correspondre. rid : %s, ip : %s, rid_t : %s' % (int(rid), self.ip(), rid_t))