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: 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.')
#On essaye d'attribuer une ipv4, on cherche un rid dispo # Le switch-bloc suivant modifie ip pour le faire correspondre à une
v6 = False # vraie ip et le rid correspondant. Si ip='', cela signifie que l'on ne
if ip == '<automatique>' and not self.rid(): # 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: for plage in plage_rid:
rid_pris = [ rid_pris = [
int(elem[1]['rid'][0]) 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 ridtools.Rid(rid=rid).ipv4_dispo:
if not force: if not force:
raise ValueError(u"La machine sera v6 only", 1) raise ValueError(u"La machine sera v6 only", 1)
v6 = True ip = ''
break break
# On vire les ip qui se terminent par 0 ou 255 (toutes, thanks windows) # On vire les ip qui se terminent par 0 ou 255 (toutes, thanks windows)
if rid % 256 != 0 and rid % 256 != 255: if rid % 256 != 0 and rid % 256 != 255:
ip = unicode(ridtools.Rid(rid=rid).ipv4()) ip = unicode(ridtools.Rid(rid=rid).ipv4())
break break
# Si on a une ip, ou que la plage est v6, on s'en va # Si on a une ip, on s'en va
if ip != '<automatique>' or v6: if ip != '<automatique>':
break break
# Si après tout ca, on a encore auto et que c'est pas une plage v6, ya plus d'ip # Si après tout ca, on a encore auto, c'est qu'il n'y a plus d'ip
if ip == '<automatique>' and not v6: if ip == '<automatique>':
raise RuntimeError(u"Plus d'IP libres dans %s." % ' et '.join(net)) raise RuntimeError(u"Plus d'IP (rid) libres dans %s." % ' et '.join(net))
elif ip == '': # Sinon, ip fournie, contrôle qu'elle est compatible avec le type machine
self._set('ipHostNumber', []) # et calcule le rid qui va bien avec
ip = None elif ip != '':
# Si il y a deja une ip, on controle qu'elle correspond bien à son rid
elif ip != '<automatique>':
# 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)
@ -3301,21 +3308,29 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
# L'ip est-elle déja allouée ? # L'ip est-elle déja allouée ?
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.')
else: # cas où ip == ''
# On recalcule le rid si il existe pas deja, ou que l'ip est pas v6 only if not self.rid():
if ip != None and not v6 and not self.rid(): raise ValueError(u'Vous devez indiquer une ip ou <automatique>')
rid = ridtools.Rid(ipv4=ip)
elif self.rid():
rid = int(self.rid()) rid = int(self.rid())
if rid == '':
pass
# Lock ip # Après ce bloc, rid et ip ont été fixés
if lock and ip and ip != '<automatique>': # on calcule maintenant les modifs à lancer
self.lock('ipHostNumber', ip) old_ip = (self._data.get('ipHostNumber', None) or [''])[0]
self._set('ipHostNumber', [ip])
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 return ip
def rid(self, rid=None, lock=True): 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: if rid == None:
return self._data.get('rid', [''])[0] return self._data.get('rid', [''])[0]
if self.ip() != '<automatique>': if self.ip() not in ['<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))
if lock: if lock:
self.lock('rid', '%s' % rid) self.lock('rid', str(rid))
self._set('rid', ['%s' % rid]) self._set('rid', [str(rid)])
def exempt(self, new=None): def exempt(self, new=None):
""" """