2017-04-12 42 views
0

爲什麼:可能ipaddress.collapse_addresses()崩潰超過1位的掩碼?

>>> import ipaddress 
>>> print [ip for ip in ipaddress.collapse_addresses([ipaddress.IPv4Network(u'192.0.128.0/24'), ipaddress.IPv4Network(u'192.0.129.0/24')])] 
[IPv4Network(u'192.0.128.0/23')] 

但:

>>> print [ip for ip in ipaddress.collapse_addresses([ipaddress.IPv4Network(u'192.0.129.0/24'), ipaddress.IPv4Network(u'192.0.130.0/24')])] 
[IPv4Network(u'192.0.129.0/24'), IPv4Network(u'192.0.130.0/24')] 

我想實現:

>>> print [ip for ip in ipaddress.collapse_addresses([ipaddress.IPv4Network(u'192.0.129.0/24'), ipaddress.IPv4Network(u'192.0.130.0/24')])] 
[IPv4Network(u'192.0.128.0/22')] 

好像collapse_addresses不能垮超過1位的面具。

回答

0

該函數返回包含列表的IPv4網絡的最小網:

ADDRESS_ANY = ip_address(u'0.0.0.0') 
def one_net(subnets): 
    """ 
    Get the one IP network that covers all subnets in input, 
    or None is subnets are disjoint. 
    """ 
    if len(subnets) == 0: 
     return None 

    minlen = min([net.prefixlen for net in subnets]) 
    while subnets.count(subnets[0]) < len(subnets) and minlen > 0: 
     # all subnets are not (yet) equal 
     subnets = [net.supernet(new_prefix=minlen) for net in subnets] 
     minlen -= 1 

    # 0.0.0.0/? -> no common subnet 
    if subnets[0].network_address == ADDRESS_ANY: 
     return None 
    return subnets[0]