ldap_crans.py: rationalise ip()
This commit is contained in:
parent
1df794db38
commit
971abfd950
1 changed files with 46 additions and 31 deletions
|
@ -3254,9 +3254,20 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
|
|||
except:
|
||||
raise RuntimeError(u'Impossible de trouver le réseau où placer la machine.')
|
||||
|
||||
#On essaye d'attribuer une ipv4, on cherche un rid dispo
|
||||
v6 = False
|
||||
if ip == '<automatique>' and not self.rid():
|
||||
# Le switch-bloc suivant modifie ip pour le faire correspondre à une
|
||||
# vraie ip et le rid correspondant. Si ip='', cela signifie que l'on ne
|
||||
# veut plus d'ipv4 (cela arrive si on a un rid ipv6 only par ex)
|
||||
|
||||
# Si <automatique> et self.rid(), recalcule l'ip à partir du rid
|
||||
if ip == '<automatique>' and self.rid():
|
||||
rid = int(self.rid())
|
||||
rid_obj = ridtools.Rid(rid)
|
||||
if rid_obj.ipv4_dispo:
|
||||
ip = rid_obj.ipv4()
|
||||
else:
|
||||
ip = ''
|
||||
#On essaye d'attribuer un rid si ip auto et pas encore de rid
|
||||
elif ip == '<automatique>':
|
||||
for plage in plage_rid:
|
||||
rid_pris = [
|
||||
int(elem[1]['rid'][0])
|
||||
|
@ -3269,27 +3280,23 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
|
|||
if not ridtools.Rid(rid=rid).ipv4_dispo:
|
||||
if not force:
|
||||
raise ValueError(u"La machine sera v6 only", 1)
|
||||
v6 = True
|
||||
ip = ''
|
||||
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:
|
||||
# Si on a une ip, on s'en va
|
||||
if ip != '<automatique>':
|
||||
break
|
||||
|
||||
# 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))
|
||||
# Si après tout ca, on a encore auto, c'est qu'il n'y a plus d'ip
|
||||
if ip == '<automatique>':
|
||||
raise RuntimeError(u"Plus d'IP (rid) libres dans %s." % ' et '.join(net))
|
||||
|
||||
elif ip == '':
|
||||
self._set('ipHostNumber', [])
|
||||
ip = None
|
||||
|
||||
|
||||
# Si il y a deja une ip, on controle qu'elle correspond bien à son rid
|
||||
elif ip != '<automatique>':
|
||||
# Sinon, ip fournie, contrôle qu'elle est compatible avec le type machine
|
||||
# et calcule le rid qui va bien avec
|
||||
elif ip != '':
|
||||
# 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)
|
||||
|
@ -3301,21 +3308,29 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
|
|||
# L'ip est-elle déja allouée ?
|
||||
if self.exist('ipHostNumber=%s' % ip):
|
||||
raise ValueError(u'IP déjà prise.')
|
||||
|
||||
# On recalcule le rid si il existe pas deja, ou que l'ip est pas v6 only
|
||||
if ip != None and not v6 and not self.rid():
|
||||
rid = ridtools.Rid(ipv4=ip)
|
||||
elif self.rid():
|
||||
else: # cas où ip == ''
|
||||
if not self.rid():
|
||||
raise ValueError(u'Vous devez indiquer une ip ou <automatique>')
|
||||
rid = int(self.rid())
|
||||
if rid == '':
|
||||
pass
|
||||
|
||||
# Après ce bloc, rid et ip ont été fixés
|
||||
# on calcule maintenant les modifs à lancer
|
||||
old_ip = (self._data.get('ipHostNumber', None) or [''])[0]
|
||||
|
||||
maj_ip = ip != old_ip
|
||||
maj_rid = self.rid() != str(rid)
|
||||
|
||||
# Et on fait les modifs, ip d'abord, car self.rid() pourrait
|
||||
# faire des tests supplémentaires
|
||||
if maj_ip:
|
||||
# Lock ip
|
||||
if lock and ip and ip != '<automatique>':
|
||||
if lock and ip:
|
||||
self.lock('ipHostNumber', ip)
|
||||
self._set('ipHostNumber', [ip])
|
||||
self._set('ipHostNumber', [ip] if ip else [])
|
||||
|
||||
if maj_rid:
|
||||
self.rid(str(rid), lock=lock)
|
||||
|
||||
self.rid("%d" % rid, lock=lock)
|
||||
return ip
|
||||
|
||||
def rid(self, rid=None, lock=True):
|
||||
|
@ -3325,14 +3340,14 @@ 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>':
|
||||
if self.ip() not in ['<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))
|
||||
|
||||
if lock:
|
||||
self.lock('rid', '%s' % rid)
|
||||
self._set('rid', ['%s' % rid])
|
||||
self.lock('rid', str(rid))
|
||||
self._set('rid', [str(rid)])
|
||||
|
||||
def exempt(self, new=None):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue