You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
py-mikrotik-rkn/subnets.py

59 lines
2.3 KiB

#!/bin/python
import ipaddress
import sys
3 years ago
import argparse
3 years ago
parser = argparse.ArgumentParser()
parser.add_argument('-t', '--test', action='store_const', const=True, help='Тестовый режим')
parser.add_argument('-s', '--summask', type=int, help='Суммаризация по маске')
3 years ago
args = parser.parse_args()
def read_ips():
ip_cnt,prefixes = 0, {}
for line in sys.stdin:
line, ip_cnt = line.strip('\n'), ip_cnt + 1
3 years ago
try:
if ipaddress.ip_network(line) or ipaddress.ip_address(line):
prefix = ipaddress.ip_network(line).network_address.compressed
prefixlen = ipaddress.ip_network(line).prefixlen
if args.summask and prefixlen > args.summask:
supernet = ipaddress.ip_network(prefix,prefixlen).supernet(new_prefix=args.summask)
prefix = supernet.network_address.compressed
prefixlen = supernet.prefixlen
3 years ago
prefixes[prefix] = prefixlen
except ValueError:
continue #bad subnet address
if args.test:
print('{} IP/Net -> stdin'.format(ip_cnt))
return prefixes
def subnets_join(prefixes, new_prefixlen):
new_prefixes = {}
for network_address, prefixlen in prefixes.items():
if prefixlen == new_prefixlen + 1:
supernet = ipaddress.ip_network(network_address, prefixlen).supernet(new_prefix=new_prefixlen)
new_network_address = supernet.network_address.compressed
subnets = list(supernet.subnets())
prefix_count = 0
for subnet in subnets:
if prefixes.get(subnet.network_address.compressed) == subnet.prefixlen:
prefix_count += 1
if prefix_count > 1:
new_prefixes[new_network_address] = new_prefixlen
else:
new_prefixes[network_address] = prefixlen
else:
new_prefixes[network_address] = prefixlen
return new_prefixes
prefixes = read_ips()
3 years ago
maxprefixlen,start_cnt = 32, len(prefixes)
for prefixlen in range(maxprefixlen, 0, -1):
prefixes = subnets_join(prefixes, prefixlen)
3 years ago
if args.test:
print('/{} - {} - {}%'.format(prefixlen, len(prefixes), int(100 / start_cnt * len(prefixes))))
if not args.test:
[print('{}/{}'.format(pref, preflen)) for pref, preflen in prefixes.items()]