diff --git a/crans_utils.py b/crans_utils.py index 33c5620..a926e03 100644 --- a/crans_utils.py +++ b/crans_utils.py @@ -34,7 +34,7 @@ sys.path.append('/usr/scripts/gestion') import config from unicodedata import normalize -def ip_of_mid(mid): +def ip4_of_mid(mid): """Convertit un mid en son IP associée""" for net, plage in config.mid.items(): if mid >= plage[0] and mid <= plage[1]: @@ -50,6 +50,43 @@ def ip_of_mid(mid): return netaddr.IPAddress(netaddr.IPNetwork(config.NETs[net][0]).first + mid - plage[0]) +def prefixev6_of_mid(mid): + """ + L'ip de sous-réseau privé d'une machine. L'adhérent en fait ce qu'il veut, mais c'est la machine + associée au mid qui est responsable du traffic. + + Cette fonction retourne l'ip de début de ce sous-réseau. + """ + for net, plage in config.mid.items(): + if mid >= plage[0] and mid <= plage[1]: + break + else: + raise ValueError("Mid dans aucune plage: %d" % mid) + + # fil-v6 ou wifi-v6, we don't care + return netaddr.IPAddress(netaddr.IPNetwork(config.prefix['fil-v6'][0]).first + 2**64*mid) + +def ip6_of_mac(mac, mid): + """ + Retourne la bonne ipv6 de la machine en fonction de sa mac et de son mid. + """ + + for net, plage in config.mid.items(): + if mid >= plage[0] and mid <= plage[1]: + break + else: + raise ValueError("Mid dans aucune plage: %d" % mid) + + # En théorie, format_mac est inutile, car on ne devrait avoir + # que des mac formatées. + mac = format_mac(mac).replace(':', '') + + # hex retourne un str, donc on concatène, suivant la RFC + euid64v6 = hex(int(mac[:2], 16)^0b00000010) + mac[2:6] + 'fffe' + mac[6:12] + + # fil-v6 ou wifi-v6, we don't care + return netaddr.IPAddress(netaddr.IPNetwork(config.prefix[net][0]).first + int(euid64v6, 16)) + def strip_accents(a): """ Supression des accents de la chaîne fournie""" res = normalize('NFKD', a).encode('ASCII', 'ignore') diff --git a/lc_ldap.py b/lc_ldap.py index 7f35119..ba905a0 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -239,7 +239,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject): # On récupère le premier id libre dans la plages s'il n'est pas # déjà précisé dans le ldiff mid = uldif.setdefault('mid', [ unicode(self._find_id('mid', plage)) ]) - uldif['ipHostNumber'] = [ unicode(crans_utils.ip_of_mid(int (mid[0]))) ] + uldif['ipHostNumber'] = [ unicode(crans_utils.ip4_of_mid(int (mid[0]))) ] return self._create_entity('mid=%s,%s' % (mid[0], parent), uldif) def newAdherent(self, uldif):