diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index cb99b272..9a8f0127 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -3246,44 +3246,53 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) 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): - net = config.NETs['wifi-adh'] - pool_ip = lister_ip_dispo('wifi-adh') + mach_type = u'wifi-adh' + plage_rid = config.rid_primaires['wifi-adh'] elif isinstance(self, BorneWifi): - net = config.NETs['bornes'] - pool_ip = lister_ip_dispo('bornes') + mach_type = u'bornes' + plage_rid = config.rid_primaires['bornes'] elif isinstance(self.proprietaire(), AssociationCrans): - net = [ '0.0.0.0/0' ] - pool_ip = lister_ip_dispo('all') + mach_type = u'crans' + plage_rid = config.rid_primaires['serveurs'] else: proprio = self.proprietaire() - if proprio.etudes(0) == 'Personnel ENS': - net = config.NETs['personnel-ens'] - pool_ip = lister_ip_dispo('personnel-ens') + mach_type = u'personnel-ens' + plage_rid = config.rid_primaires['personnel-ens'] elif not isinstance(proprio, Adherent) or proprio.adherentPayant(): proprio_subnet = 'adherents' + mach_type = 'adherents' try: - net = config.NETs[proprio_subnet] - pool_ip = lister_ip_dispo(proprio_subnet) + plage_rid = config.rid_primaires[proprio_subnet] except: 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 == '': - # On va prendre choisir une IP au hasard dans le pool des IP dispo - random.shuffle(pool_ip) - while len(pool_ip) > 0: - ip = pool_ip.pop() # On choisit une IP - if not self.exist('ipHostNumber=%s' % ip): - # On a trouvé la première ip libre - pool_ip.append(ip) + for plage in plage_rid: + 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]))] + #print sorted(rid_pris) + # Par defaut la plage est pas v6 (cf bornes/bornes v6) + v6 = False + for rid in range(plage[0],plage[1]): + 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 != '' or v6: 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 == '' and not v6: raise RuntimeError(u"Plus d'IP libres dans %s." % ' et '.join(net)) 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 ? # (accessoirement teste si l'IP est valide et ne correspond pas # à 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) # Reformatage 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): 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) - else: + elif ip != '': rid = self.rid() if rid == '': pass # Lock ip - if lock and ip: + if lock and ip and ip != '': self.lock('ipHostNumber', ip) self._set('ipHostNumber', [ip]) @@ -3323,10 +3334,10 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) if rid == None: return self._data.get('rid', [''])[0] - 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 self.ip() != '': + 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)