From 971abfd950fd32e4eb5821487aa82af3c168cbb4 Mon Sep 17 00:00:00 2001 From: Daniel STAN Date: Tue, 30 Jun 2015 01:08:04 +0200 Subject: [PATCH] ldap_crans.py: rationalise ip() --- gestion/ldap_crans.py | 77 ++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index e29ffd9a..4c959cd6 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -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 == '' 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 et self.rid(), recalcule l'ip à partir du rid + if ip == '' 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 == '': 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 != '' or v6: + # Si on a une ip, on s'en va + if ip != '': break - # Si après tout ca, on a encore auto et que c'est pas une plage v6, ya plus d'ip - if ip == '' 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 == '': + 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 != '': + # 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 ') rid = int(self.rid()) - if rid == '': - pass - # Lock ip - if lock and ip and ip != '': - 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() != '': + if self.ip() not in ['', '']: 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): """