def fetch():
    a = IPSet([])
    for blocklist in blocklists:
        syslog.syslog('generate-blacklist.py - fetching prefixes from: %s ' %
                      blocklist)
        #print blocklist
        r = requests.get(blocklist)
        for line in r.iter_lines():
            # Dont ask me why but like this it works.
            if line != "0.0.0.0/8" and line != "240.0.0.0/4" and line != "224.0.0.0/4":
                if linefilter(line):
                    myprefix = makeprefix(linefilter(line))
                    #a.add(makeprefix(linefilter(line)))
                    a.add(myprefix)
    for prefix in b:
        if b.len() > 0 and b.__contains__(
                prefix) and not a.__contains__(prefix):
            a.discard(prefix)
            stdout.write('withdraw route ' + str(prefix) + nexthop)
            stdout.flush()
    for prefix in a:
        if a.__contains__(prefix) and not b.__contains__(prefix):
            stdout.write('announce route ' + str(prefix) + nexthop)
            stdout.flush()
    b.add(a)
Beispiel #2
0
def fetch():
    a = IPSet([])
    totalnoofnewprefixes = 0
    for blocklist in blocklists:
        syslog.syslog('{0} fetching prefixes from: {1}'.format(syslogprefix, blocklist))
#	'{0} in {1}'.format(unicode(self.author,'utf-8'),  unicode(self.publication,'utf-8'))
        r = requests.get(blocklist)
        for line in r.iter_lines():
            # Dont ask me why but like this it works. 
            if line != "0.0.0.0/8" and line != "240.0.0.0/4" and line != "224.0.0.0/4":
                if linefilter(line):
                    myprefix = makeprefix(linefilter(line))
#                   if myprefix not in a                    
		    a.add(myprefix)
        noofprefixes = a.__len__
        syslog.syslog('{0} got {1} prefixes from: {2}'.format(syslogprefix, noofprefixes, blocklist))
        totalnoofnewprefixes = totalnoofnewprefixes + noofprefixes
    syslog.syslog('{0} got {1} prefixes in total from upstream'.format(syslogprefix, totalnoofprefixes))
    for prefix in b:
        if b.len() > 0 and b.__contains__(prefix) and not a.__contains__(prefix):
            a.discard(prefix)
            stdout.write('withdraw route ' + str(prefix) + nexthop)
            stdout.flush()

    for prefix in a:
        if a.__contains__(prefix) and not b.__contains__(prefix):
            stdout.write('announce route ' + str(prefix) + nexthop)
            stdout.flush()

    b.add(a)
Beispiel #3
0
 def not_in_use(self):
     "Show unused subnets in the CIDR range"
     if self.is_leaf() or self.net_type != "scope":
         return []
     base_set = IPSet([self.ip])
     for child in self.children:
         base_set.discard(child.ip)
     return base_set.prefixes
Beispiel #4
0
def main():
    original_file_path = r'D:\xuexi\cheshiwenjian\哈尔滨CR全路由表.txt'
    print(f'城域网CR路由原表文件路径:{original_file_path}')

    format_file_path = r'D:\xuexi\cheshiwenjian\哈尔滨CR全路清理后文件.txt'
    print(f'城域网CR路由表清理后文件路径:{format_file_path}')

    # usable_ip_str_path = input('可用IP范围文件路径:')
    usable_ip_str_path = r'D:\xuexi\cheshiwenjian\哈尔滨城域网可用汇总路由.txt'
    print(f'城域网可用IP网段存放文件路径:{usable_ip_str_path}')

    used_ip_str_path = r'D:\xuexi\cheshiwenjian\哈尔滨城域网已使用IP网段.txt'
    print(f'城域网已使用IP网段存放文件路径:{used_ip_str_path}')

    # not_used_ip_str_path = input('未使用IP输出文件路径:')
    not_used_ip_str_path = r'D:\xuexi\cheshiwenjian\哈尔滨城域网未使用IP网段.txt'
    print(f'城域网未使用IP网段存放文件路径:{not_used_ip_str_path}')

    ip_net_mask = '22'
    not_used_ip_mask_str_path = r'D:\xuexi\cheshiwenjian\哈尔滨城域网未使用IP网段({}位以上).txt'.format(
        ip_net_mask)
    print(f'哈尔滨城域网未使用IP网段({ip_net_mask}位以上):{not_used_ip_mask_str_path}')

    usable_ip_str = read_file(usable_ip_str_path)
    usable_ip_list = data_format(usable_ip_str)
    usable_ip_list = col_data_format(usable_ip_list)
    usable_ip_set = ip_format(usable_ip_list).copy()

    conn_ip = IPSet(usable_ip_set)

    route_ip_list = format_routing_table(original_file_path, format_file_path)

    used_ip_list = extract_used_ip(route_ip_list, usable_ip_set)

    used_ip_str = produce_output_str(used_ip_list)
    output_file(used_ip_str_path, used_ip_str)

    used_ip_list = col_data_format(used_ip_list)
    used_ip_net_set = ip_format(used_ip_list).copy()

    for used_ip_net in used_ip_net_set:
        conn_ip.discard(IP(used_ip_net))

    not_used_ip_str = produce_output_str(conn_ip)
    output_file(not_used_ip_str_path, not_used_ip_str)

    not_used_ip_filter_list = ip_mask_filter(conn_ip, ip_net_mask)
    not_used_ip_filter_str = produce_output_str(not_used_ip_filter_list)
    output_file(not_used_ip_mask_str_path, not_used_ip_filter_str)
def fetch():
	a = IPSet([])
	for blocklist in blocklists:
		r = requests.get(blocklist)
		for line in r.iter_lines():
			if linefilter(line):
				a.add(makeprefix(linefilter(line)))

	for prefix in b:
		if b.len() > 0 and b.__contains__(prefix) and not a.__contains__(prefix):
			a.discard(prefix)
			stdout.write('withdraw route ' + str(prefix) + nexthop)
			stdout.flush()

	for prefix in a:
		if a.__contains__(prefix) and not b.__contains__(prefix):
			stdout.write('announce route ' + str(prefix) + nexthop)
			stdout.flush()

	b.add(a)
Beispiel #6
0
class RouteSet(collections.MutableSet):
    def __init__(self, routes=(), aggregate=True):
        if aggregate:
            self.ip4 = IPSet()
            self.ip6 = IPSet()
        else:
            self.ip4 = set()
            self.ip6 = set()

        if routes:
            for r in routes:
                self.add(r)

    def __len__(self):
        """
        IPy doesn't provide a len() for number of prefixes
        but that's really what we're interested in here, so override
        their semantics.
        """
        if isinstance(self.ip4, IPSet):
            return len(self.ip4.prefixes) + len(self.ip6.prefixes)
        else:
            return len(self.ip4) + len(self.ip6)

    def __iter__(self):
        return itertools.chain(self.ip4, self.ip6)

    def __contains__(self, item):
        return item in self.ip4 or item in self.ip6

    def add(self, item):
        ip = IP(item, make_net=True)
        if ip.version() == 4:
            self.ip4.add(ip)
        elif ip.version() == 6:
            self.ip6.add(ip)

    def discard(self, item):
        ip = IP(item, make_net=True)
        self.ip4.discard(ip)
        self.ip6.discard(ip)
Beispiel #7
0
def main():
    # used_ip_str_path = input('被使用IP统计文件路径:')
    used_ip_str_path = r'D:\xuexi\cheshiwenjian\哈尔滨CR全路由提取.txt'
    print(used_ip_str_path)

    # usable_ip_str_path = input('可用IP范围文件路径:')
    usable_ip_str_path = r'D:\xuexi\cheshiwenjian\哈尔滨总IP1.txt'
    print(usable_ip_str_path)

    # not_used_ip_str_path = input('未使用IP输出文件路径:')
    not_used_ip_str_path = r'D:\xuexi\cheshiwenjian\哈尔滨未用IP.txt'
    print(not_used_ip_str_path)

    with open(used_ip_str_path, 'r', encoding='utf-8-sig') as file_used_ip:
        used_ip_str = file_used_ip.read()

    with open(usable_ip_str_path, 'r', encoding='utf-8-sig') as file_usable_ip:
        usable_ip_str = file_usable_ip.read()

    used_ip_list = data_format(used_ip_str)
    used_ip_list = col_data_format(used_ip_list)
    used_ip_net_set = ip_format(used_ip_list).copy()

    usable_ip_list = data_format(usable_ip_str)
    usable_ip_list = col_data_format(usable_ip_list)
    usable_ip_set = ip_format(usable_ip_list).copy()

    conn_ip = IPSet(usable_ip_set)

    # conn_ip = IPSet([IP('112.100.107.0/24'), IP('112.100.14.0/24')])
    for used_ip_net in used_ip_net_set:
        conn_ip.discard(IP(used_ip_net))
    # for conn_ip_tmp in conn_ip:
    #     print(conn_ip_tmp)

    not_used_ip_str = ""
    for not_used_ip in conn_ip:
        not_used_ip_str = not_used_ip_str + str(not_used_ip) + "\n"

    with open(not_used_ip_str_path, 'w') as file_not_used_ip:
        file_not_used_ip.write(not_used_ip_str)
Beispiel #8
0
class RouteSet(collections.MutableSet):
    def __init__(self, routes=(), aggregate=True):
        if aggregate:
            self.ip4 = IPSet()
            self.ip6 = IPSet()
        else:
            self.ip4 = set()
            self.ip6 = set()

        if routes:
            for r in routes:
                self.add(r)

    def __len__(self):
        """
        IPy doesn't provide a len() for number of prefixes
        but that's really what we're interested in here, so override
        their semantics.
        """
        if isinstance(self.ip4, IPSet):
            return len(self.ip4.prefixes) + len(self.ip6.prefixes)
        else:
            return len(self.ip4) + len(self.ip6)

    def __iter__(self):
        return itertools.chain(self.ip4, self.ip6)

    def __contains__(self, item):
        return item in self.ip4 or item in self.ip6

    def add(self, item):
        ip = IP(item, make_net=True)
        if ip.version() == 4:
            self.ip4.add(ip)
        elif ip.version() == 6:
            self.ip6.add(ip)
    
    def discard(self, item):
        ip = IP(item, make_net=True)
        self.ip4.discard(ip)
        self.ip6.discard(ip)
def fetch():
    a = IPSet([])
    for blocklist in blocklists:
        r = requests.get(blocklist)
        for line in r.iter_lines():
            if linefilter(line):
                a.add(makeprefix(linefilter(line)))

    for prefix in b:
        if b.len() > 0 and b.__contains__(
                prefix) and not a.__contains__(prefix):
            a.discard(prefix)
            stdout.write('withdraw route ' + str(prefix) + nexthop)
            stdout.flush()

    for prefix in a:
        if a.__contains__(prefix) and not b.__contains__(prefix):
            stdout.write('announce route ' + str(prefix) + nexthop)
            stdout.flush()

    b.add(a)
Beispiel #10
0
def _get_available_subnets(prefix_or_prefixes, used_prefixes):
    """Get available prefixes within a list of CIDR addresses, based on what
    prefixes are in use. E.g. this is `get_available_subnets`, but with
    explicit dependency injection.

    Args:
        prefix_or_prefixes: a single or a list of prefixes ("10.0.0.0/8") or
                          IPy.IP objects
        used_prefixes: prefixes that are in use

    Returns:
           An iterable IPy.IPSet of available addresses within prefix_or_prefixes

    """
    if not isinstance(prefix_or_prefixes, list):
        prefix_or_prefixes = [prefix_or_prefixes]
    base_prefixes = [str(prefix) for prefix in prefix_or_prefixes]
    acc = IPSet([IP(prefix) for prefix in prefix_or_prefixes])
    used_prefixes = IPSet([IP(used) for used in used_prefixes])
    # remove used prefixes
    acc.discard(used_prefixes)
    # filter away original prefixes
    return sorted([ip for ip in acc if str(ip) not in base_prefixes])
Beispiel #11
0
print IP('127.0.0.1').make_net('255.0.0.0')

print '============================================='

print u'IP地址转字符串的几种方式:'
ip5 = IP('10.0.0.0/32')
ip6 = IP('10.0.0.0/24')
ip7 = IP('10.0.0.0')
print ip5.strNormal()
print ip6.strNormal()
print ip6.strNormal(0)
print ip6.strNormal(1)
print ip6.strNormal(2)
print ip6.strNormal(3)
print ip7
ip7.NoPrefixForSingleIp = None
print(ip7)
ip7.WantPrefixLen = 3
print ip7

print '============================================='

print IP('10.0.0.0/22') - IP('10.0.2.0/24')
print IPSet([IP('10.0.0.0/23'), IP('10.0.3.0/24'), IP('10.0.2.0/24')])

s = IPSet([IP('10.0.0.0/22')])
s.add(IP('192.168.1.2'))
print s
s.discard(IP('192.168.1.2'))
print s
Beispiel #12
0
        row_data = re.split(r'[ /]', row_data)
        if ip_true(row_data[0]):
            col_data_list.append(row_data)
    return col_data_list


used_ip_list = col_data_format(used_ip_list)
used_ip_net_set = []
for used_ip in used_ip_list:
    if ip_true(used_ip[0]):
        used_ip_net_set.append(IP(used_ip[0]).make_net(used_ip[1]))
# print(used_ip_net_set)

usable_ip_list = data_format(usable_ip_str)
usable_ip_set = []
for usable_ip in usable_ip_list:
    usable_ip_set.append(IP(usable_ip))
conn_ip = IPSet(usable_ip_set)
# conn_ip = IPSet([IP('112.100.107.0/24'), IP('112.100.14.0/24')])
for used_ip_net in used_ip_net_set:
    conn_ip.discard(IP(used_ip_net))
# for conn_ip_tmp in conn_ip:
#     print(conn_ip_tmp)

not_used_ip_str = ""
for not_used_ip in conn_ip:
    not_used_ip_str = not_used_ip_str + str(not_used_ip) + "\n"

with open(not_used_ip_str_path, 'w') as file_not_used_ip:
    file_not_used_ip.write(not_used_ip_str)
Beispiel #13
0
10.0.0.0-10.0.0.0

Work with multiple networks

Simple addition of neighboring netblocks that can be aggregated will yield a parent network of both, but more complex range mapping and aggregation requires is available with the IPSet class which will hold any number of unique address ranges and will aggregate overlapping ranges.

>>> from IPy import IP, IPSet
>>> IP('10.0.0.0/22') - IP('10.0.2.0/24')
IPSet([IP('10.0.0.0/23'), IP('10.0.3.0/24')])
>>> IPSet([IP('10.0.0.0/23'), IP('10.0.3.0/24'), IP('10.0.2.0/24')])
IPSet([IP('10.0.0.0/22')])
>>> s = IPSet([IP('10.0.0.0/22')])
>>> s.add(IP('192.168.1.0/29'))
>>> s
IPSet([IP('10.0.0.0/22'), IP('192.168.1.0/29')])
>>> s.discard(IP('192.168.1.2'))
>>> s
IPSet([IP('10.0.0.0/22'), IP('192.168.1.0/31'), IP('192.168.1.3'), IP('192.168.1.4/30')])

IPSet supports the set method isdisjoint:

>>> s.isdisjoint(IPSet([IP('192.168.0.0/16')]))
False
>>> s.isdisjoint(IPSet([IP('172.16.0.0/12')]))
True

IPSet supports intersection:

>>> s & IPSet([IP('10.0.0.0/8')])
IPSet([IP('10.0.0.0/22')])