ipaddress.collapse_addresses() 可能会崩溃超过 1 位的掩码?
may ipaddress.collapse_addresses() collapse for more than 1 bit of the mask?
为什么:
>>> 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 位的掩码。
这个函数returns包含列表中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]
import ipaddr
ips = [ipaddr.IPv4Address(ip) for ip in ['10.10.10.0','10.10.11.0']]
ips = sorted(ips)
lowest_ip = ips[0] #first
highest_ip = ips[-1] #last
mask_length = ipaddr._get_prefix_length(int(lowest_ip), int(highest_ip),
lowest_ip.max_prefixlen)
network_ip = ipaddr.IPNetwork("{}/{}".format(lowest_ip, mask_length)).network
network = ipaddr.IPNetwork("{}/{}".format(network_ip, mask_length), strict = True)
print (network)
$> 10.10.10.0/23
为什么:
>>> 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 位的掩码。
这个函数returns包含列表中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]
import ipaddr
ips = [ipaddr.IPv4Address(ip) for ip in ['10.10.10.0','10.10.11.0']]
ips = sorted(ips)
lowest_ip = ips[0] #first
highest_ip = ips[-1] #last
mask_length = ipaddr._get_prefix_length(int(lowest_ip), int(highest_ip),
lowest_ip.max_prefixlen)
network_ip = ipaddr.IPNetwork("{}/{}".format(lowest_ip, mask_length)).network
network = ipaddr.IPNetwork("{}/{}".format(network_ip, mask_length), strict = True)
print (network)
$> 10.10.10.0/23