Calculating CIDR blocks

  • Thread starter =?iso-8859-15?q?Pekka_J=E4rvinen?=
  • Start date
?

=?iso-8859-15?q?Pekka_J=E4rvinen?=

# I have list of free IP addresses. One IP per line. Now I'm trying to
# share them to CIDR blocks /24 - /32. For example: if 1.1.1.0 -
1.1.1.255
# is free, it returns list['1.1.1.0/24'] but let's say that 1.1.1.1 is
# used, then function should return list['1.1.1.128/25',
# '1.1.1.127/26', '1.1.1.32/27', etc until free block doesn't fit].

import string
import network
# http://cheeseshop.python.org/pypi/Adytum-NetCIDR/0.0.1

ips = ['192.168.0.0', '192.168.0.1', '192.168.0.2', '192.168.0.3',
'192.168.0.4', '192.168.0.5', '192.168.0.6', '192.168.0.7',
'192.168.0.8', '192.168.0.9', '192.168.0.10', '192.168.0.11',
'192.168.0.12', '192.168.0.13', '192.168.0.14', '192.168.0.15',
'192.168.0.16', '192.168.0.17', '192.168.0.18', '192.168.0.19',
'192.168.0.20', '192.168.0.21', '192.168.0.22', '192.168.0.23',
'192.168.0.24', '192.168.0.25', '192.168.0.26', '192.168.0.27',
'192.168.0.28', '192.168.0.29', '192.168.0.30', '192.168.0.31',
'192.168.0.32', '192.168.0.33', '192.168.0.34', '192.168.0.35',
'192.168.0.36', '192.168.0.37', '192.168.0.38', '192.168.0.39',
'192.168.0.40', '192.168.0.41', '192.168.0.42', '192.168.0.43',
'192.168.0.44', '192.168.0.45', '192.168.0.46', '192.168.0.47',
'192.168.0.48', '192.168.0.49', '192.168.0.50', '192.168.0.51',
'192.168.0.52', '192.168.0.53', '192.168.0.54', '192.168.0.55',
'192.168.0.56', '192.168.0.57', '192.168.0.58', '192.168.0.59',
'192.168.0.60', '192.168.0.61', '192.168.0.62', '192.168.0.63',
'192.168.0.64', '192.168.0.65', '192.168.0.66', '192.168.0.67',
'192.168.0.68', '192.168.0.69', '192.168.0.70', '192.168.0.71',
'192.168.0.72', '192.168.0.73', '192.168.0.74', '192.168.0.75',
'192.168.0.76', '192.168.0.77', '192.168.0.78', '192.168.0.79',
'192.168.0.80', '192.168.0.81', '192.168.0.82', '192.168.0.83',
'192.168.0.84', '192.168.0.85', '192.168.0.86', '192.168.0.87',
'192.168.0.88', '192.168.0.89', '192.168.0.90', '192.168.0.91',
'192.168.0.92', '192.168.0.93', '192.168.0.94', '192.168.0.95',
'192.168.0.96', '192.168.0.97', '192.168.0.98','192.168.0.99',
'192.168.0.100', '192.168.0.101', '192.168.0.102', '192.168.0.103',
'192.168.0.104', '192.168.0.105', '192.168.0.106', '192.168.0.107',
'192.168.0.108', '192.168.0.109', '192.168.0.110', '192.168.0.112',
'192.168.0.113', '192.168.0.114', '192.168.0.115', '192.168.0.116',
'192.168.0.117', '192.168.0.118', '192.168.0.119', '192.168.0.120',
'192.168.0.121', '192.168.0.122', '192.168.0.123', '192.168.0.124',
'192.168.0.125', '192.168.0.126', '192.168.0.127', '192.168.0.128',
'192.168.0.129', '192.168.0.130', '192.168.0.131', '192.168.0.132',
'192.168.0.133', '192.168.0.134', '192.168.0.135', '192.168.0.136',
'192.168.0.137', '192.168.0.138', '192.168.0.139', '192.168.0.140',
'192.168.0.141', '192.168.0.142', '192.168.0.143', '192.168.0.144',
'192.168.0.145', '192.168.0.146', '192.168.0.147', '192.168.0.148',
'192.168.0.149', '192.168.0.150', '192.168.0.151', '192.168.0.152',
'192.168.0.153', '192.168.0.154', '192.168.0.155', '192.168.0.156',
'192.168.0.157', '192.168.0.158', '192.168.0.159', '192.168.0.160',
'192.168.0.161', '192.168.0.162', '192.168.0.163', '192.168.0.164',
'192.168.0.165', '192.168.0.166', '192.168.0.167', '192.168.0.168',
'192.168.0.169', '192.168.0.170', '192.168.0.171', '192.168.0.172',
'192.168.0.173', '192.168.0.174', '192.168.0.175', '192.168.0.176',
'192.168.0.177', '192.168.0.178', '192.168.0.179', '192.168.0.180',
'192.168.0.181', '192.168.0.182', '192.168.0.183', '192.168.0.184',
'192.168.0.185', '192.168.0.186', '192.168.0.187', '192.168.0.188',
'192.168.0.189', '192.168.0.190', '192.168.0.191', '192.168.0.192',
'192.168.0.193', '192.168.0.194', '192.168.0.195', '192.168.0.196',
'192.168.0.197', '192.168.0.198', '192.168.0.199', '192.168.0.200',
'192.168.0.201', '192.168.0.202', '192.168.0.203', '192.168.0.204',
'192.168.0.205', '192.168.0.206', '192.168.0.207', '192.168.0.208',
'192.168.0.209', '192.168.0.210', '192.168.0.211', '192.168.0.212',
'192.168.0.213', '192.168.0.214', '192.168.0.215', '192.168.0.216',
'192.168.0.217', '192.168.0.218', '192.168.0.219', '192.168.0.220',
'192.168.0.221', '192.168.0.222', '192.168.0.223', '192.168.0.224',
'192.168.0.225', '192.168.0.226', '192.168.0.227', '192.168.0.228',
'192.168.0.229', '192.168.0.230', '192.168.0.231', '192.168.0.232',
'192.168.0.233', '192.168.0.234', '192.168.0.235', '192.168.0.236',
'192.168.0.237', '192.168.0.238', '192.168.0.239', '192.168.0.240',
'192.168.0.241', '192.168.0.242', '192.168.0.243', '192.168.0.244',
'192.168.0.245', '192.168.0.246', '192.168.0.247', '192.168.0.248',
'192.168.0.249', '192.168.0.250', '192.168.0.251', '192.168.0.252',
'192.168.0.253', '192.168.0.254', '192.168.0.255']
# note: 192.168.0.111 is missing


cidrs = [24, 25, 26, 27, 28, 29, 30, 31, 32]

free = []

for cidr in cidrs:
c = 0
for ip in ips:
ip_addr = network.CIDR("%s/32" % ip)
my_network = "%s/%d" % (ip, cidr)
network_CIDR = network.CIDR(my_network)
myn = network.Networks([network_CIDR])

freelist = []

if len(free) > 0:
for i in free:
freelist.append(network.CIDR("%s" % i))

freeh = network.Networks(freelist)

net_len = network_CIDR.getHostCount()

if ip_addr in myn and ip_addr not in freeh:
c = c + 1
if c == net_len:
hr = network.CIDR(my_network).getHostRange()
free.append("%s/%s" % (hr[0], cidr))
c = 0

print free

# Outputs:
# ['192.168.0.128/25', '192.168.0.64/26', '192.168.0.32/27',
'192.168.0.16/28', '192.168.0.8/29', '192.168.0.4/30']
# That 192.168.0.64/26 cannot be there because it's 192.168.0.64 -
192.168.0.127 and 192.168.0.111 does not exist in ips list!
# Any ideas?
 
?

=?iso-8859-1?q?Pekka_J=E4rvinen?=

# I have list of free IP addresses. One IP per line. Now I'm trying to
# share them to CIDR blocks /24 - /32. For example: if 1.1.1.0 -
1.1.1.255
# is free, it returns list['1.1.1.0/24'] but let's say that 1.1.1.1 is
# used, then function should return list['1.1.1.128/25',
# '1.1.1.127/26', '1.1.1.32/27', etc until free block doesn't fit].

import string
import network
#http://cheeseshop.python.org/pypi/Adytum-NetCIDR/0.0.1

ips = ['192.168.0.0', '192.168.0.1', '192.168.0.2', '192.168.0.3',
'192.168.0.4', '192.168.0.5', '192.168.0.6', '192.168.0.7',
'192.168.0.8', '192.168.0.9', '192.168.0.10', '192.168.0.11',
'192.168.0.12', '192.168.0.13', '192.168.0.14', '192.168.0.15',
'192.168.0.16', '192.168.0.17', '192.168.0.18', '192.168.0.19',
'192.168.0.20', '192.168.0.21', '192.168.0.22', '192.168.0.23',
'192.168.0.24', '192.168.0.25', '192.168.0.26', '192.168.0.27',
'192.168.0.28', '192.168.0.29', '192.168.0.30', '192.168.0.31',
'192.168.0.32', '192.168.0.33', '192.168.0.34', '192.168.0.35',
'192.168.0.36', '192.168.0.37', '192.168.0.38', '192.168.0.39',
'192.168.0.40', '192.168.0.41', '192.168.0.42', '192.168.0.43',
'192.168.0.44', '192.168.0.45', '192.168.0.46', '192.168.0.47',
'192.168.0.48', '192.168.0.49', '192.168.0.50', '192.168.0.51',
'192.168.0.52', '192.168.0.53', '192.168.0.54', '192.168.0.55',
'192.168.0.56', '192.168.0.57', '192.168.0.58', '192.168.0.59',
'192.168.0.60', '192.168.0.61', '192.168.0.62', '192.168.0.63',
'192.168.0.64', '192.168.0.65', '192.168.0.66', '192.168.0.67',
'192.168.0.68', '192.168.0.69', '192.168.0.70', '192.168.0.71',
'192.168.0.72', '192.168.0.73', '192.168.0.74', '192.168.0.75',
'192.168.0.76', '192.168.0.77', '192.168.0.78', '192.168.0.79',
'192.168.0.80', '192.168.0.81', '192.168.0.82', '192.168.0.83',
'192.168.0.84', '192.168.0.85', '192.168.0.86', '192.168.0.87',
'192.168.0.88', '192.168.0.89', '192.168.0.90', '192.168.0.91',
'192.168.0.92', '192.168.0.93', '192.168.0.94', '192.168.0.95',
'192.168.0.96', '192.168.0.97', '192.168.0.98','192.168.0.99',
'192.168.0.100', '192.168.0.101', '192.168.0.102', '192.168.0.103',
'192.168.0.104', '192.168.0.105', '192.168.0.106', '192.168.0.107',
'192.168.0.108', '192.168.0.109', '192.168.0.110', '192.168.0.112',
'192.168.0.113', '192.168.0.114', '192.168.0.115', '192.168.0.116',
'192.168.0.117', '192.168.0.118', '192.168.0.119', '192.168.0.120',
'192.168.0.121', '192.168.0.122', '192.168.0.123', '192.168.0.124',
'192.168.0.125', '192.168.0.126', '192.168.0.127', '192.168.0.128',
'192.168.0.129', '192.168.0.130', '192.168.0.131', '192.168.0.132',
'192.168.0.133', '192.168.0.134', '192.168.0.135', '192.168.0.136',
'192.168.0.137', '192.168.0.138', '192.168.0.139', '192.168.0.140',
'192.168.0.141', '192.168.0.142', '192.168.0.143', '192.168.0.144',
'192.168.0.145', '192.168.0.146', '192.168.0.147', '192.168.0.148',
'192.168.0.149', '192.168.0.150', '192.168.0.151', '192.168.0.152',
'192.168.0.153', '192.168.0.154', '192.168.0.155', '192.168.0.156',
'192.168.0.157', '192.168.0.158', '192.168.0.159', '192.168.0.160',
'192.168.0.161', '192.168.0.162', '192.168.0.163', '192.168.0.164',
'192.168.0.165', '192.168.0.166', '192.168.0.167', '192.168.0.168',
'192.168.0.169', '192.168.0.170', '192.168.0.171', '192.168.0.172',
'192.168.0.173', '192.168.0.174', '192.168.0.175', '192.168.0.176',
'192.168.0.177', '192.168.0.178', '192.168.0.179', '192.168.0.180',
'192.168.0.181', '192.168.0.182', '192.168.0.183', '192.168.0.184',
'192.168.0.185', '192.168.0.186', '192.168.0.187', '192.168.0.188',
'192.168.0.189', '192.168.0.190', '192.168.0.191', '192.168.0.192',
'192.168.0.193', '192.168.0.194', '192.168.0.195', '192.168.0.196',
'192.168.0.197', '192.168.0.198', '192.168.0.199', '192.168.0.200',
'192.168.0.201', '192.168.0.202', '192.168.0.203', '192.168.0.204',
'192.168.0.205', '192.168.0.206', '192.168.0.207', '192.168.0.208',
'192.168.0.209', '192.168.0.210', '192.168.0.211', '192.168.0.212',
'192.168.0.213', '192.168.0.214', '192.168.0.215', '192.168.0.216',
'192.168.0.217', '192.168.0.218', '192.168.0.219', '192.168.0.220',
'192.168.0.221', '192.168.0.222', '192.168.0.223', '192.168.0.224',
'192.168.0.225', '192.168.0.226', '192.168.0.227', '192.168.0.228',
'192.168.0.229', '192.168.0.230', '192.168.0.231', '192.168.0.232',
'192.168.0.233', '192.168.0.234', '192.168.0.235', '192.168.0.236',
'192.168.0.237', '192.168.0.238', '192.168.0.239', '192.168.0.240',
'192.168.0.241', '192.168.0.242', '192.168.0.243', '192.168.0.244',
'192.168.0.245', '192.168.0.246', '192.168.0.247', '192.168.0.248',
'192.168.0.249', '192.168.0.250', '192.168.0.251', '192.168.0.252',
'192.168.0.253', '192.168.0.254', '192.168.0.255']
# note: 192.168.0.111 is missing

cidrs = [24, 25, 26, 27, 28, 29, 30, 31, 32]

free = []

for cidr in cidrs:
c = 0
for ip in ips:
ip_addr = network.CIDR("%s/32" % ip)
my_network = "%s/%d" % (ip, cidr)
network_CIDR = network.CIDR(my_network)
myn = network.Networks([network_CIDR])

freelist = []

if len(free) > 0:
for i in free:
freelist.append(network.CIDR("%s" % i))

freeh = network.Networks(freelist)

net_len = network_CIDR.getHostCount()

if ip_addr in myn and ip_addr not in freeh:
c = c + 1
if c == net_len:
hr = network.CIDR(my_network).getHostRange()
free.append("%s/%s" % (hr[0], cidr))
c = 0

print free

# Outputs:
# ['192.168.0.128/25', '192.168.0.64/26', '192.168.0.32/27',
'192.168.0.16/28', '192.168.0.8/29', '192.168.0.4/30']
# That 192.168.0.64/26 cannot be there because it's 192.168.0.64 -
192.168.0.127 and 192.168.0.111 does not exist in ips list!
# Any ideas?

Little changes:

for cidr in cidrs:
c = 0
for ip in ips:
ip_addr = network.CIDR("%s/32" % ip)
my_network = "%s/%d" % (ip, cidr)
network_CIDR = network.CIDR(my_network)
myn = network.Networks([network_CIDR])

freelist = []

if len(free) > 0:
for i in free:
freelist.append(network.CIDR("%s" % i))

freeh = network.Networks(freelist)

net_len = network_CIDR.getHostCount()

if ((network_CIDR in myn) and (network_CIDR not in freeh)):
c = c + 1
if ((c + 2) == net_len):
hr = network.CIDR(my_network).getHostRange()
free.append("%s/%s" % (hr[0], cidr))
c = 0

print free

now outputs:
['192.168.0.128/25', '192.168.0.0/26', '192.168.0.64/27',
'192.168.0.96/28', '192.168.0.112/28']

Which is much better, but now 192.168.0.96/28 includes that
192.168.0.111, so no go. 192.168.0.96/28 must be split into smaller
pieces still.
 
E

Eddie Corns

I'm getting error:
Traceback (most recent call last):
File "ipr.py", line 5, in <module>
x = ipv4.IP4Range(ips)
File "IP4Range.py", line 119, in __init__
raise TypeError("Invalid argument.")
TypeError: Invalid argument.

I haven't used this module for some time but if I recall your requirements
properly you need something like:
.... R=R|IP4.IP4Range(i)
.... .... print m
....
192.168.0.0/26
192.168.0.64/27
192.168.0.96/29
192.168.0.104/30
192.168.0.108/31
192.168.0.110/32
192.168.0.128/25
192.168.0.112/28
There may be an easier way my memory is hazy.

Eddie
 
?

=?iso-8859-1?q?Pekka_J=E4rvinen?=

I haven't used this module for some time but if I recall your requirements
properly you need something like:


... R=R|IP4.IP4Range(i)
...>>> for m in R.itermasks():

... print m
...
192.168.0.0/26
192.168.0.64/27
192.168.0.96/29
192.168.0.104/30
192.168.0.108/31
192.168.0.110/32
192.168.0.128/25
192.168.0.112/28



There may be an easier way my memory is hazy.

Eddie

It does exactly what I'm after! Thanks a lot! :)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,733
Messages
2,569,439
Members
44,829
Latest member
PIXThurman

Latest Threads

Top