fromttpimportttp
template="""
asa# sh object-group id aws_criticalprd_us_west_2_app
object-group network aws_criticalprd_us_west_2_app
network-object 10.159.160.0 255.255.248.0
network-object 10.159.161.0 255.255.248.0
asa# sh object-group id aws_criticalprd_us_west_2_db
object-group network aws_criticalprd_us_west_2_db
network-object 10.159.168.0 255.255.248.0
asa# sh object-group id aws_criticalprd_us_west_2_app_db
object-group network aws_criticalprd_us_west_2_app_db
group-object aws_criticalprd_us_west_2_app
group-object aws_criticalprd_us_west_2_db
asa# sh object-group id aws_all_critical_vpcs
object-group network aws_all_critical_vpcs
group-object aws_criticalprd_us_west_2_app_db
group-object aws_critical_us_west_2_app_db
group-object aws_criticalprd_us_east_1_app_db
group-object aws_critical_us_east_1_app_db
group-object aws_criticalprd_eu_west_1_app_db
group-object aws_critical_eu_west_1_app_db
group-object aws_criticalprd_eu_central_1_app_db
group-object aws_critical_eu_central_1_app_db
object-group network {{ network_obj }}
group-object {{ group_obj | to_list | joinmatches }}
network-object {{ subnet | PHRASE | to_list | joinmatches }}
def lookup_objects(data, name=""):
# kick recursion off
if name == "":
return {key: lookup_objects(data, name=key) for key in data[0].keys()}
# if name in data, check if it contains subnet or run recursion for group_obj:
elif name in data[0]:
if "subnet" in data[0][name]:
return data[0][name]["subnet"]
return {
group_obj: lookup_objects(data, name=group_obj)
for group_obj in data[0][name].get("group_obj", [])
}
else:
return {}
"""parser=ttp(template=template)parser.parse()print(parser.result(format="json")[0])