ldap_crans.py: rationalise ip()

This commit is contained in:
Daniel STAN 2015-06-30 01:08:04 +02:00
parent 1df794db38
commit 971abfd950

View file

@ -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
# Lock ip
if lock and ip and ip != '<automatique>':
self.lock('ipHostNumber', ip)
self._set('ipHostNumber', [ip])
# 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:
self.lock('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):
"""