scripts/gestion/iptools.py
pauget c6b6075c93 Petite fonction utile.
darcs-hash:20041017142401-41617-87f87bfd7105a789979341cd69bc2f90ad92e2b6.gz
2004-10-17 16:24:01 +02:00

97 lines
2.3 KiB
Python
Executable file

#! /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
if __name__ == '__main__' :
import sys
print param(sys.argv[1])