254 lines
No EOL
6.8 KiB
Python
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) |