import os
import argparse
import json
def load_json_file(filepath):
with open(filepath, 'r') as f:
return json.load(f)
def find_json_by_id(ref_value, folder):
for root, _, files in os.walk(folder):
for fname in files:
if fname.endswith(".json"):
path = os.path.join(root, fname)
try:
with open(path, "r") as f:
content = json.load(f)
if isinstance(content, dict) and content.get("listId") == ref_value:
return content
except Exception:
continue
return {}
def find_app_template_by_id(appref, folder):
for root, _, files in os.walk(folder):
for fname in files:
if fname.endswith(".json"):
path = os.path.join(root, fname)
try:
with open(path, "r") as f:
content = json.load(f)
if content.get("appId") == appref or content.get("id") == appref:
return content.get("serverNames", [])
except Exception:
continue
return []
def process_policy(input_json, base_dir):
output = []
lines = json.dumps(input_json, indent=2).splitlines()
i = 0
while i < len(lines):
line = lines[i]
output.append(line)
if '"ref"' in line:
ref_value = line.split(":")[1].strip().strip('",')
prev_line = lines[i - 1] if i > 0 else ""
if "DataPrefixList" in prev_line:
data = find_json_by_id(ref_value, os.path.join(base_dir, "policy_lists", "DataPrefix"))
name = data.get("name")
if name:
output.append(' ' * 10 + f'"name": "{name}",')
for entry in data.get("entries", []):
if "ipPrefix" in entry:
output.append(' ' * 10 + f'"ipPrefix": "{entry["ipPrefix"]}",')
elif "appList" in prev_line:
data = find_json_by_id(ref_value, os.path.join(base_dir, "policy_lists", "App"))
name = data.get("name")
if name:
output.append(' ' * 10 + f'"name": "{name}",')
for entry in data.get("entries", []):
if "app" in entry:
output.append(' ' * 10 + f'"app": "{entry["app"]}",')
if "appRef" in entry:
#output.append(' ' * 10 + f'"appRef": "{entry["appRef"]}",')
servers = find_app_template_by_id(entry["appRef"], os.path.join(base_dir, "policy_templates", "CustomApp"))
for server in servers:
output.append(' ' * 10 + f'"serverName": "{server}",')
i += 1
return output
def main():
parser = argparse.ArgumentParser(description="Expand Cisco SD-WAN policy file with inlined entries.")
parser.add_argument("base_dir", help="Base directory (extracted from policy.tar)")
parser.add_argument("input_file", help="Filename of the input policy (e.g. CHINA-DATA-POLICY-S1.json)")
args = parser.parse_args()
input_path = os.path.join(args.base_dir, "policy_definitions", "Data", args.input_file)
input_data = load_json_file(input_path)
output_lines = process_policy(input_data, args.base_dir)
output_path = os.path.splitext(args.input_file)[0] + "_expanded.json"
with open(output_path, "w") as f:
f.write("\n".join(output_lines))
print(f"✅ Expanded file written to: {output_path}")
if __name__ == "__main__":
main()