我想知道是否有一个很好的方法来找到下一个可用的缺口,从而在给定现有清单的情况下创建一个网络区块?
例如,我的列表中有以下网络:
[
'10.0.0.0/24',
'10.0.0.0/20',
'10.10.0.0/20',
]
然后有人来问:“您有足够的空间容纳我1/22吗?”
我希望能够提出一些建议: “这里是一个空格:x.x.x.x / 22”(x.x.x.x早于10.0.0.0)
或
“这里是一个空格:x.x.x.x / 22”(x.x.x.x介于10.0.0.255和10.10.0.0之间)
或
“这里是一个空格:x.x.x.x / 22”(x.x.x.x出现在10.10.15.255之后)
我真的很感谢任何建议。
答案 0 :(得分:2)
ipaddress
库非常适合此类用例。您可以使用IPv4Network
类定义子网范围,并且可以将其返回的IPv4Address
对象转换为整数以进行比较。
我在下面做什么:
IPv4Network
的列表您也可以返回内置了子网的IPv4Network
而不是IPv4Address
,但我将其留给读者练习。
from ipaddress import IPv4Network, IPv4Address
networks = [
IPv4Network('10.0.0.0/24')
IPv4Network('10.0.0.0/20')
IPv4Network('10.0.10.0/20')
]
wanted = 22
wanted_size = 2 ** (32 - wanted) # number of addresses in a /22
space_found = None
for i in range(1, len(networks):
previous_network_end = int(networks[i-1].network_address + int(networks[i-1].hostmask))
next_network_start = int(networks[i].network_address)
free_space_size = next_network_start - previous_network_end
if free_space_size >= wanted_size:
return IPv4Address(networks[i-1] + 1) # first available address