70 lines
No EOL
2.4 KiB
Python
70 lines
No EOL
2.4 KiB
Python
import collections.abc
|
|
import re
|
|
|
|
def parse_dampened_data(raw_json_data, ip_version):
|
|
dampened_paths = []
|
|
summary_string = ""
|
|
|
|
if not raw_json_data or not raw_json_data.get("success") or "data" not in raw_json_data:
|
|
return {"paths": [], "summary": "Displayed 0 routes and 0 total paths"}
|
|
|
|
text_data = raw_json_data["data"]
|
|
|
|
if not isinstance(text_data, str) or not text_data.strip():
|
|
return {"paths": [], "summary": "Displayed 0 routes and 0 total paths"}
|
|
|
|
current_prefix = None
|
|
lines = text_data.split('\n')
|
|
|
|
for line in lines:
|
|
stripped_line = line.strip()
|
|
|
|
if stripped_line.startswith("Displayed"):
|
|
summary_string = stripped_line
|
|
continue
|
|
|
|
if not stripped_line or stripped_line.startswith("BGP table") or stripped_line.startswith("Default") or \
|
|
stripped_line.startswith("Status codes") or stripped_line.startswith("Nexthop codes") or \
|
|
stripped_line.startswith("Origin codes") or stripped_line.startswith("RPKI") or \
|
|
"Network" in stripped_line:
|
|
continue
|
|
|
|
parts = line.split()
|
|
if len(parts) < 4:
|
|
continue
|
|
|
|
path_info = {
|
|
"metric": "N/A",
|
|
"local_pref": "N/A",
|
|
"weight": "N/A",
|
|
"ip_version": ip_version
|
|
}
|
|
|
|
is_new_prefix = '/' in parts[1]
|
|
|
|
try:
|
|
if is_new_prefix:
|
|
current_prefix = parts[1]
|
|
path_info["status"] = parts[0]
|
|
path_info["prefix"] = current_prefix
|
|
path_info["from"] = parts[2]
|
|
path_info["suppress_remain"] = parts[3]
|
|
path_info["path"] = ' '.join(parts[4:])
|
|
dampened_paths.append(path_info)
|
|
elif current_prefix:
|
|
path_info["status"] = parts[0]
|
|
path_info["prefix"] = current_prefix
|
|
path_info["from"] = parts[1]
|
|
path_info["suppress_remain"] = parts[2]
|
|
path_info["path"] = ' '.join(parts[3:])
|
|
dampened_paths.append(path_info)
|
|
except IndexError:
|
|
continue
|
|
|
|
if not summary_string and not dampened_paths:
|
|
summary_string = "Displayed 0 routes and 0 total paths"
|
|
|
|
return {"paths": dampened_paths, "summary": summary_string}
|
|
|
|
def generate_dampened_json(ipv4_data, ipv6_data):
|
|
return {"ipv4": ipv4_data, "ipv6": ipv6_data} |