Optimisations...

darcs-hash:20050715161011-d1718-18e5676a1d2cd44acce031f06114355539801e69.gz
This commit is contained in:
bernat 2005-07-15 18:10:11 +02:00
parent 10eda9a824
commit 996d55c8a4

View file

@ -49,8 +49,8 @@ def DecToQuad(ip_dec) :
return result
except :
raise ValueError('IP Invalide')
def param(net) :
def param(net, raw=False) :
"""
net est un résau fourni sous la forme xxx.xxx.xxx.xxx/yy
si donnée valide retourne un dictionnaire :
@ -58,6 +58,9 @@ def param(net) :
'netmask' : yyy.yyy.yyy.yyy ,
'broadcast' : zzz.zzz.zzz.zzz }
sinon retourne {}
Si raw = False, alors, on ne convertit pas les résultats sous forme pointée.
Ils restent sous forme d'un entier.
"""
reseau = {}
ip, mask = net.split('/')
@ -70,21 +73,15 @@ def param(net) :
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)
non_dec_netmask = (1L<<(32-mask)) - 1
dec_netmask = (1L<<32) - 1 - non_dec_netmask
# Calcul du network
reseau['network'] = DecToQuad( dec_ip & dec_netmask )
# Calcul du broadcast
reseau['broadcast'] = DecToQuad( dec_ip | non_dec_netmask )
reseau = { 'netmask' : dec_netmask,
'network' : dec_ip & dec_netmask,
'broadcast' : dec_ip | non_dec_netmask }
if not raw:
for i in reseau.keys():
reseau[i] = DecToQuad(reseau[i])
return reseau
def AddrInNet(ip,net) :
@ -98,11 +95,12 @@ def AddrInNet(ip,net) :
if type(net)==str : net = [ net ]
r = False
ip = QuadToDec(ip)
for ne in net :
n = param(ne)
if ip == n['broadcast'] or ip ==n['network'] :
n = param(ne, raw=True)
if ip == n['broadcast'] or ip == n['network'] :
return False
r = r or QuadToDec(n['netmask']) & QuadToDec(ip) == QuadToDec(n['network'])
r = r or n['netmask'] & ip == n['network']
return r