Faster mapping of CIDRs to IPs

This commit is contained in:
James Hebden
2020-09-21 22:47:54 +10:00
parent 7ccee77970
commit 99cfed1214

View File

@@ -1,18 +1,15 @@
import functools
import itertools
import os.path
import socket
import struct
import sys
from io import TextIOWrapper
from argparse import ArgumentParser
from io import TextIOWrapper
from random import choice
from netaddr import (
IPRange,
IPSet,
glob_to_iprange,
)
from Interlace.lib.threader import Task
from netaddr import IPGlob, IPRange, IPSet, glob_to_iprange
class InputHelper(object):
@@ -34,7 +31,7 @@ class InputHelper(object):
ivalue = int(arg)
if ivalue <= 0:
raise parser.ArgumentTypeError("%s is not a valid positive integer!" % arg)
except ValueError as e:
except ValueError:
raise parser.ArgumentValueError("%s is not a a number!" % arg)
return arg
@@ -50,6 +47,42 @@ class InputHelper(object):
return files
@staticmethod
def _get_ips_from_range(ip_range):
ips = set()
ip_range = ip_range.split("-")
# parsing the above structure into an array and then making into an IP address with the end value
end_ip = ".".join(ip_range[0].split(".")[0:-1]) + "." + ip_range[1]
# creating an IPRange object to get all IPs in between
range_obj = IPRange(ip_range[0], end_ip)
for ip in range_obj:
ips.add(str(ip))
return ips
@staticmethod
def _get_ips_from_glob(glob_ips):
ip_glob = IPGlob(glob_ips)
ips = set()
for ip in ip_glob:
ips.add(str(ip))
return ips
@staticmethod
def _get_cidr_to_ips(cidr_range):
(ip, cidr) = cidr_range.split("/")
mask = 32 - int(cidr)
first_ip = struct.unpack(">I", socket.inet_aton(ip))[0]
last_ip = first_ip | ((1 << mask) - 1)
ips = frozenset([socket.inet_ntoa(struct.pack('>I', x)) for x in range(first_ip, last_ip)])
return ips
@staticmethod
def _process_port(port_type):
if "," in port_type: