如何解决将这些主机和网络范围处理成网络层次结构字典的更好方法是什么? 1.生成所有网络的字典,尚未考虑网络关系:2.使用 .subnet_of:3.然后返回并递归 copy.deepcopy() / 替换层次结构中没有 supernets 键的所有网络引用,并删除 supernets 字典中具有任何键的所有网络有什么更好的方法可以做到这一点?
请忽略无意义的 CIDR/IP 范围,今晚我无法忍受子网划分。
假设我有一个主机 IP 及其网络范围的列表,如下所示:
ip_sets = [{
"host": "4.4.4.254","ipLow": "4.4.4.0","ipHigh": "4.4.4.255"
},...]
我想将它们组织成这样的网络层次结构,最大的网络包含所有较小的网络,没有圆形结构:
{
"4.4.4.0/8": {
"network": <network obj>,"hosts": { "4.4.4.254": <ip obj> }
"subnets" : { "4.4.4.0/32": { ... and so on ... } }
}
}
主机应放置在最低层的网络中。
我正在使用 native ip address utility in python。我的游戏计划是:
1.生成所有网络的字典,尚未考虑网络关系:
network_dict = {}
for index,ip_set in ip_sets:
start_ip_str = ip_set["ipLow"]
end_ip_str = ip_set["ipHigh"]
host_ip_str = ip_set["host"]
start_ip = ipaddress.IPv4Address(start_ip_str)
end_ip = ipaddress.IPv4Address(end_ip_str)
host_ip = ipaddress.IPv4Address(host_ip_str)
networks = [ipaddr for ipaddr in ipaddress.summarize_address_range(start_ip,end_ip)]
for network in networks:
network_str = format(network)
if network_str in network_dict:
network_dict[network_str]["hosts"][host_ip_str] = host_ip
else:
network_dict[network_str] = {
"network": network,"hosts": { host_ip_str: host_ip },"subnets": {},"supernets": {},}
2.使用 .subnet_of
:
递归检查字典中的每个网络是否是任何其他网络的子网
network_dict_keys = network_dict.keys()
for network1_key in network_dict_keys:
for network2_key in network_dict_keys:
network1 = network_dict[network1_key]
network2 = network_dict[network2_key]
if network1["network"].subnet_of(network2["network"]):
network2["subnets"][network1_key] = network_dict[network1_key]
network1["supernets"][network2_key] = network_dict[network2_key]
3.然后返回并递归 copy.deepcopy()
/ 替换层次结构中没有 supernets
键的所有网络引用,并删除 supernets
字典中具有任何键的所有网络。
首先以循环方式复制引用,然后返回并克隆/删除,我觉得这个过程比我想到的一些替代方法要简单一些。
但是这个方法感觉多余而且丑陋。我什至不确定它是否正常工作。
有什么更好的方法可以做到这一点?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。