58 lines
1.5 KiB
Python
Executable File
58 lines
1.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import argparse
|
|
import csv
|
|
import ipaddress
|
|
import json
|
|
from pathlib import Path
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
p = argparse.ArgumentParser(
|
|
description="Convert rpki report.json VRPs into Routinator-compatible CSV"
|
|
)
|
|
p.add_argument("--report", required=True, help="path to rpki report.json")
|
|
p.add_argument("--out", required=True, help="output CSV path")
|
|
p.add_argument(
|
|
"--trust-anchor",
|
|
default="unknown",
|
|
help="Trust Anchor column value (default: unknown)",
|
|
)
|
|
return p.parse_args()
|
|
|
|
|
|
def sort_key(vrp: dict):
|
|
network = ipaddress.ip_network(vrp["prefix"], strict=False)
|
|
return (
|
|
int(vrp["asn"]),
|
|
network.version,
|
|
int(network.network_address),
|
|
network.prefixlen,
|
|
int(vrp["max_length"]),
|
|
)
|
|
|
|
|
|
def main() -> int:
|
|
args = parse_args()
|
|
report = json.loads(Path(args.report).read_text(encoding="utf-8"))
|
|
vrps = list(report.get("vrps") or [])
|
|
vrps.sort(key=sort_key)
|
|
|
|
out_path = Path(args.out)
|
|
out_path.parent.mkdir(parents=True, exist_ok=True)
|
|
with out_path.open("w", encoding="utf-8", newline="") as f:
|
|
w = csv.writer(f)
|
|
w.writerow(["ASN", "IP Prefix", "Max Length", "Trust Anchor"])
|
|
for vrp in vrps:
|
|
w.writerow([
|
|
f"AS{vrp['asn']}",
|
|
vrp["prefix"],
|
|
vrp["max_length"],
|
|
args.trust_anchor,
|
|
])
|
|
print(out_path)
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|