Modification de l'attribution des ip, on n'utilise plus numerodisp, on cherche par rid dispo
This commit is contained in:
parent
1d82e0c95c
commit
8745a89176
1 changed files with 42 additions and 31 deletions
|
@ -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))
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue