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)
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)
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
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)
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 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)
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)
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])
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
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)
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')])