sandbox/cisco/recursion_groups.py

254 lines
No EOL
6.8 KiB
Python

from tokenize import group
network_groups = {
"FQDN_GROUP": {
"name": "FQDN_GROUP",
"description": "123",
"members": [
{
"type": "object",
"net_object": "FQDN_OBJ"
}
]
},
"ds_group_1": {
"name": "ds_group_1",
"description": "some description",
"members": [
{
"net_object": "2001:db8:85a3::",
"prefix_length": "65"
},
{
"type": "172.31.142.0",
"host": "255.255.255.0"
},
{
"type": "object",
"net_object": "ds_object_fqdn_v4"
},
{
"type": "object",
"net_object": "ds_object_network_v4"
},
{
"type": "object",
"net_object": "tetetet"
},
{
"type": "group",
"grp_object": "FQDN_GROUP"
}
]
},
"net_group1": {
"name": "net_group1",
"description": "",
"members": [
{
"type": "group",
"grp_object": "FQDN_GROUP"
},
{
"type": "object",
"net_object": "ds_object_host_v6"
},
{
"type": "object",
"net_object": "ds_object_network_v4"
}
]
},
"net_group2": {
"name": "net_group2",
"description": "",
"members": [
{
"net_object": "2001:db8:85a3::",
"prefix_length": "65"
},
{
"type": "group",
"grp_object": "ds_group_1"
},
{
"type": "group",
"grp_object": "net_group1"
}
]
},
"net_group3": {
"name": "net_group3",
"description": "",
"members": [
{
"type": "object",
"net_object": "ds_object_range_v6"
},
{
"type": "object",
"net_object": "hostname"
},
{
"type": "group",
"grp_object": "net_group2"
},
{
"type": "object",
"net_object": "tetetet"
}
]
},
"net_group4": {
"name": "net_group4",
"description": "",
"members": [
{
"type": "172.31.142.0",
"host": "255.255.255.0"
},
{
"type": "group",
"grp_object": "net_group3"
},
{
"type": "object",
"net_object": "net_obj_ipv6"
}
]
}
}
network_objects = {
"FQDN_OBJ": {
"description": "descr",
"type": "fqdn",
"fqdn_ip_version": "v4",
"fqdn_address": "www.example.com"
},
"hostname": {
"type": "subnet",
"network": "192.168.116.0",
"netmask": "255.255.255.0"
},
"tetetet": {
"description": "123",
"type": "host",
"host": "1.2.3.4"
},
"range_test": {
"description": "range descr",
"type": "range",
"start_ip": "1.2.3.4",
"end_ip": "4.3.2.1"
},
"ds_object_host_v4": {
"description": "some_descr",
"type": "host",
"host": "1.2.3.4"
},
"ds_object_host_v6": {
"description": "some descr",
"type": "host",
"host": "d46:3dfb:8158:f9fe:132a:d956:f7c8:a69a"
},
"ds_object_range_v4": {
"type": "range",
"start_ip": "1.2.3.4",
"end_ip": "5.6.7.8"
},
"ds_object_range_v6": {
"description": "some descr",
"type": "range",
"start_ip": "d46:3dfb:8158:f9fe:132a:d956:f7c8:a69a",
"end_ip": "d46:3dfb:8158:f9fe:132a:d956:f7c8:a69b"
},
"ds_object_network_v4": {
"type": "subnet",
"network": "1.2.3.0",
"netmask": "255.255.255.0"
},
"ds_object_fqdn_v4": {
"type": "fqdn",
"fqdn_ip_version": "v4",
"fqdn_address": "www.ya.ru"
},
"ds_object_fqdn_v6": {
"description": "some descr",
"type": "fqdn",
"fqdn_ip_version": "v6",
"fqdn_address": "www.example.com"
},
"net_obj_ipv6": {
"type": "subnet",
"network": "2001:db8:85a3::",
"prefix_length": "48"
},
"172.31.142.54": {
"type": "host",
"host": "172.31.142.54"
},
"1.1.1.1": {
"type": "host",
"host": "1.1.1.1"
}
}
def parse_member(group_member, parsed_members):
member_type = group_member.get("type", None)
if not member_type:
parsed_members.append(group_member)
return parsed_members
if member_type == "object":
parsed_members.append(network_objects[group_member["net_object"]])
return parsed_members
if group_member["type"] == "group":
group_members = network_groups[group_member["grp_object"]]["members"]
for in_member in group_members:
parse_member(in_member, parsed_members)
else:
parsed_members.append(group_member)
return parsed_members
parsed_groups = {}
for group_name, group_inners in network_groups.items():
tmp_members = []
for member in group_inners["members"]:
parse_member(member, tmp_members)
del group_inners["members"]
parsed_groups[group_name] = group_inners
parsed_groups[group_name]["members"] = tmp_members
# GPT Code
# def parse_member(group_member, parsed_members, network_objects, network_groups):
# member_type = group_member.get("type")
# if not member_type:
# parsed_members.append(group_member)
# elif member_type == "object":
# parsed_members.append(network_objects.get(group_member["net_object"]))
# elif member_type == "group":
# group_members = network_groups.get(group_member["grp_object"], {}).get("members", [])
# for in_member in group_members:
# parse_member(in_member, parsed_members, network_objects, network_groups)
# def optimize_groups(network_objects, network_groups):
# parsed_groups = {}
# for group_name, group_inners in network_groups.items():
# tmp_members = []
# for member in group_inners.get("members", []):
# parse_member(member, tmp_members, network_objects, network_groups)
# parsed_groups[group_name] = group_inners.copy()
# parsed_groups[group_name]["members"] = tmp_members
# del parsed_groups[group_name]["members"] # Removing redundant members
# return parsed_groups
# # Example usage
# optimized_groups = optimize_groups(network_objects, network_groups)