#! /usr/bin/env python # -*- coding: iso-8859-15 -*- """ Manipulation d'IPv4 Copyright (C) Frédéric Pauget Licence : GPLv2 """ def QuadToDec(ip) : """ Retourne la représentation décimale d'une ip ip est de la forme xxx.xxx.xxx.xxx """ test = ip.split('.') if len(test)!=4 : raise ValueError('IP Invalide') ip_dec = 0 for z in range(0,4) : n = int(test[z]) if n<0 or n>255 : raise ValueError('IP Invalide') ip_dec += n * ( 256**(3-z) ) return ip_dec def DecToQuad(ip_dec) : """ Retourne la représentation habituelle d'une ip (xxx.xxx.xxx.xxx) ip_dec est l'IP en base 10 """ try : return "%d.%d.%d.%d" % ( \ ip_dec/(256**3) , (ip_dec%(256**3)) / (256**2) , ( (ip_dec%(256**3)) % (256**2) ) / 256 , ( (ip_dec%(256**3)) % (256**2) ) % 256 ) except : raise ValueError('IP Invalide') def param(net) : """ net est un résau fourni sous la forme xxx.xxx.xxx.xxx/yy si donnée valide retourne un dictionnaire : { 'network' : xxx.xxx.xxx.xxx , 'netmask' : yyy.yyy.yyy.yyy , 'broadcast' : zzz.zzz.zzz.zzz } sinon retourne {} """ reseau = {} ip, mask = net.split('/') try : mask = int(mask) dec_ip = QuadToDec(ip) if dec_ip == -1 : raise except : return {} # Calcul du netmask dec_netmask=0 non_dec_netmask=0 # On calcule aussi le complémentaire for i in range(0,32) : if i < mask : dec_netmask += 2**(31-i) else : non_dec_netmask += 2**(31-i) reseau['netmask'] = DecToQuad(dec_netmask) # Calcul du network reseau['network'] = DecToQuad( dec_ip & dec_netmask ) # Calcul du broadcast reseau['broadcast'] = DecToQuad( dec_ip | non_dec_netmask ) return reseau def AddrInNet(ip,net) : """ ip est de la forme xxx.xxx.xxx.xxx net est de la forme xxx.xxx.xxx.xxx/yy net peut être une liste de chaînes ci-dessus Retourne True si l'ip est dans un des réseaux. Note : retourne Fasle si l'IP est une adresse de réseau ou broadcast """ if type(net)==str : net = [ net ] r = False for ne in net : n = param(ne) if ip == n['broadcast'] or ip ==n['network'] : return False r = r or QuadToDec(n['netmask']) & QuadToDec(ip) == QuadToDec(n['network']) return r