diff --git a/gestion/iptools.py b/gestion/iptools.py index c8f1581c..75ecfc0c 100755 --- a/gestion/iptools.py +++ b/gestion/iptools.py @@ -79,8 +79,8 @@ def param(net, raw=False) : return {} # Calcul du netmask - non_dec_netmask = (1L<<(32-mask)) - 1 - dec_netmask = (1L<<32) - 1 - non_dec_netmask + non_dec_netmask = netmask(mask, dec=False) + dec_netmask = netmask(mask) reseau = { 'netmask' : dec_netmask, 'network' : dec_ip & dec_netmask, @@ -131,4 +131,45 @@ if __name__ == '__main__' : import sys print param(sys.argv[1]) +def netmask(mask, dec=True) : + """ On génère le sous réseau /bits + """ + non_dec_netmask = (1L<<(32-mask)) - 1 + dec_netmask = (1L<<32) - 1 - non_dec_netmask + if dec : + return dec_netmask + else : + return non_dec_netmask +def IpSubnet(ip, mask) : + dec_mask = netmask(mask) + dec_ip = QuadToDec(ip) + start_ip = DecToQuad(dec_ip & dec_mask) + subnet = start_ip + "/%s" % mask + return subnet + +def subnets(net, subnet_mask) : + """ On construit une liste des sous réseaux /subnet_mask + compris dans le sous réseau /mask comprenant l'ip ip + """ + subnets = [] + # On récupère une ip du réseau indiqué + ip = net.split('/')[0] + # On récupère la valeur du masque + mask = int(net.split('/')[1]) + # On transforme les valeurs d'entrées en valeurs décimales + # On définit la valeur du sous réseau initial + dec_netmask = netmask(mask) + dec_ip = QuadToDec(ip) + dec_subnet_netmask = netmask(subnet_mask) + # On calcule la première ip du sous réseau indiqué + start_ip = dec_ip & dec_netmask + seq_ip = start_ip + # On fait une itération sur toutes les ip du sous réseau + while (seq_ip & dec_netmask) == start_ip: + # On récupère le sous réseau de la taille demandée + subnet = DecToQuad(seq_ip & dec_subnet_netmask) + "/%s" % subnet_mask + if not subnets.count(subnet) : + subnets.append(subnet) + seq_ip += 1 + return subnets