You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30 lines
772 B
Python
30 lines
772 B
Python
from netaddr import IPNetwork, IPSet
|
|
|
|
def ip_rev(orig, rev, net):
|
|
if orig.isdisjoint(IPSet(net)):
|
|
rev.add(net)
|
|
return
|
|
elif orig.issuperset(IPSet(net)):
|
|
return
|
|
else:
|
|
for net in net.subnet(net.prefixlen + 1):
|
|
ip_rev(orig, rev, net)
|
|
|
|
def ip_net_rev(addresses, version=None):
|
|
orig = IPSet(addresses)
|
|
rev = IPSet()
|
|
if version in [None, 4]:
|
|
ip_rev(orig, rev, IPNetwork('0.0.0.0/0'))
|
|
if version in [None, 6]:
|
|
ip_rev(orig, rev, IPNetwork('::/0'))
|
|
return [str(net) for net in rev.iter_cidrs()]
|
|
|
|
class FilterModule(object):
|
|
def filters(self):
|
|
return {'ip_net_rev': ip_net_rev}
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
for ip in ip_net_rev(sys.argv[1:]):
|
|
print(ip)
|