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)
|
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):
|
if isinstance(self, MachineWifi):
|
||||||
net = config.NETs['wifi-adh']
|
mach_type = u'wifi-adh'
|
||||||
pool_ip = lister_ip_dispo('wifi-adh')
|
plage_rid = config.rid_primaires['wifi-adh']
|
||||||
elif isinstance(self, BorneWifi):
|
elif isinstance(self, BorneWifi):
|
||||||
net = config.NETs['bornes']
|
mach_type = u'bornes'
|
||||||
pool_ip = lister_ip_dispo('bornes')
|
plage_rid = config.rid_primaires['bornes']
|
||||||
elif isinstance(self.proprietaire(), AssociationCrans):
|
elif isinstance(self.proprietaire(), AssociationCrans):
|
||||||
net = [ '0.0.0.0/0' ]
|
mach_type = u'crans'
|
||||||
pool_ip = lister_ip_dispo('all')
|
plage_rid = config.rid_primaires['serveurs']
|
||||||
else:
|
else:
|
||||||
proprio = self.proprietaire()
|
proprio = self.proprietaire()
|
||||||
|
|
||||||
if proprio.etudes(0) == 'Personnel ENS':
|
if proprio.etudes(0) == 'Personnel ENS':
|
||||||
net = config.NETs['personnel-ens']
|
mach_type = u'personnel-ens'
|
||||||
pool_ip = lister_ip_dispo('personnel-ens')
|
plage_rid = config.rid_primaires['personnel-ens']
|
||||||
elif not isinstance(proprio, Adherent) or proprio.adherentPayant():
|
elif not isinstance(proprio, Adherent) or proprio.adherentPayant():
|
||||||
proprio_subnet = 'adherents'
|
proprio_subnet = 'adherents'
|
||||||
|
mach_type = 'adherents'
|
||||||
try:
|
try:
|
||||||
net = config.NETs[proprio_subnet]
|
plage_rid = config.rid_primaires[proprio_subnet]
|
||||||
pool_ip = lister_ip_dispo(proprio_subnet)
|
|
||||||
except:
|
except:
|
||||||
raise RuntimeError(u'Impossible de trouver le réseau où placer la machine.')
|
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>':
|
if ip == '<automatique>':
|
||||||
# On va prendre choisir une IP au hasard dans le pool des IP dispo
|
for plage in plage_rid:
|
||||||
random.shuffle(pool_ip)
|
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]))]
|
||||||
while len(pool_ip) > 0:
|
#print sorted(rid_pris)
|
||||||
ip = pool_ip.pop() # On choisit une IP
|
# Par defaut la plage est pas v6 (cf bornes/bornes v6)
|
||||||
if not self.exist('ipHostNumber=%s' % ip):
|
v6 = False
|
||||||
# On a trouvé la première ip libre
|
for rid in range(plage[0],plage[1]):
|
||||||
pool_ip.append(ip)
|
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
|
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))
|
raise RuntimeError(u"Plus d'IP libres dans %s." % ' et '.join(net))
|
||||||
|
|
||||||
elif ip == '':
|
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 ?
|
# L'ip est elle dans le bon sous-réseau ?
|
||||||
# (accessoirement teste si l'IP est valide et ne correspond pas
|
# (accessoirement teste si l'IP est valide et ne correspond pas
|
||||||
# à l'adresse de broadcast ou de réseau)
|
# à 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)
|
raise ValueError(u'IP invalide ou en dehors du sous-réseau alloué.', 1)
|
||||||
# Reformatage
|
# Reformatage
|
||||||
ip = iptools.DecToQuad(iptools.QuadToDec(ip))
|
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):
|
if self.exist('ipHostNumber=%s' % ip):
|
||||||
raise ValueError(u'IP déjà prise.')
|
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)
|
rid = ridtools.Rid(ipv4=ip)
|
||||||
else:
|
elif ip != '<automatique>':
|
||||||
rid = self.rid()
|
rid = self.rid()
|
||||||
if rid == '':
|
if rid == '':
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Lock ip
|
# Lock ip
|
||||||
if lock and ip:
|
if lock and ip and ip != '<automatique>':
|
||||||
self.lock('ipHostNumber', ip)
|
self.lock('ipHostNumber', ip)
|
||||||
self._set('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:
|
if rid == None:
|
||||||
return self._data.get('rid', [''])[0]
|
return self._data.get('rid', [''])[0]
|
||||||
|
|
||||||
|
if self.ip() != '<automatique>':
|
||||||
rid_t = ridtools.Rid(ipv4=self.ip())
|
rid_t = ridtools.Rid(ipv4=self.ip())
|
||||||
|
|
||||||
if int(rid_t) != int(rid):
|
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))
|
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