def getSubnetMask(ip):
return int(ip[len(ip)-2:])
def subnet_calculator(ip_list):
ip_ranges = []
addresses = []
for ip in ip_list:
# find subnet mask
subnet = getSubnetMask(ip)
# calculate subnet 2**(8-(subnet % 8)
free_addresses = 2**(8-(int(subnet) % 8))
# remove dots in IP-Address so i have a number
split_ip = ip[:len(ip)-3].split('.')
block = getBlock(subnet)
start_ip = list(split_ip)
end_ip = list(split_ip)
if free_addresses != 256:
start_range = 0
# find start and end of the IP-Range
while True:
end_range = start_range + free_addresses
if start_range <= int(split_ip[block]) and end_range >= int(split_ip[block]):
break
start_range = end_range
# create two copy's of the split_ip list and change their start and end adress
start_ip[block] = str(start_range)
end_ip[block] = str(end_range-1)
elif subnet != 32:
start_ip[block] = '0'
end_ip[block] = '255'
#create 2d list and add start and end ip
ip_ranges.append([])
# save start and end in a 2D-list
ip_ranges[-1].append(ip[:len(ip)-3])
ip_ranges[-1].append(subnet)
ip_ranges[-1].append('.'.join(start_ip))
ip_ranges[-1].append('.'.join(end_ip))
addresses.append(ip[:len(ip)-3])
for address, subnet, start, end in ip_ranges:
ip_blocks = address.split('.')
# ip_block = getBlock(subnet)
for a, s, st, e in ip_ranges:
if address != a and subnet >= s:
start_block = st.split('.')
end_block = e.split('.')
even = True
compare_block = getBlock(s)
for i in reversed(range(compare_block)):
if ip_blocks[i] != start_block[i]:
even = False
break
# if ip in range -> remove from list
if int(start_block[compare_block]) <= int(ip_blocks[compare_block]) and int(end_block[compare_block]) >= int(ip_blocks[compare_block]) and even:
addresses.remove(address)
break
for ip in addresses:
print(ip)
print('--------------')
def getBlock(subnet):
if subnet >= 0 and subnet <= 7:
return 0
elif subnet >= 8 and subnet <= 15:
return 1
elif subnet >= 16 and subnet <= 23:
return 2
else:
return 3
subnet_calculator(['172.26.32.162/32', '172.26.32.0/24', '172.26.0.0/16', '172.26.32.199/25'])
subnet_calculator(['192.168.0.0/16', '172.24.96.17/32', '172.50.137.225/32', '202.139.219.192/32', '172.24.68.0/24',
'192.183.125.71/32', '201.45.111.138/32', '192.168.59.211/32', '192.168.26.13/32', '172.24.0.0/17',
'172.24.5.1/32', '172.24.68.37/32', '172.24.168.32/32'])
subnet_calculator(['172.24.68.0/24', '172.24.0.0/17', '192.168.59.211/32', '192.168.0.0/16'])
subnet_calculator(['172.24.96.17/32', '172.24.0.0/17'])