Router-tools/modules/bgp.py

88 lines
No EOL
3.2 KiB
Python

def parse_bgp_data(data):
ipv4_section = ""
ipv6_section = ""
ipv4_info = {}
ipv6_info = {}
if "data" in data:
raw_data = data["data"]
ipv4_marker = "IPv4 Unicast Summary (VRF bgp):"
ipv6_marker = "IPv6 Unicast Summary (VRF bgp):"
ipv4_start = raw_data.find(ipv4_marker)
ipv6_start = raw_data.find(ipv6_marker)
if ipv4_start != -1:
if ipv6_start != -1:
ipv4_section = raw_data[ipv4_start + len(ipv4_marker):ipv6_start].strip()
else:
ipv4_section = raw_data[ipv4_start + len(ipv4_marker):].strip()
ipv4_info = extract_bgp_info(ipv4_section)
if ipv6_start != -1:
ipv6_section = raw_data[ipv6_start + len(ipv6_marker):].strip()
ipv6_info = extract_bgp_info(ipv6_section)
def process_peers(peer_data):
peers = []
for line in peer_data.split("\n"):
if line.strip().startswith("Neighbor"):
continue
if line.strip():
peer_info = line.split()
if len(peer_info) >= 12:
peers.append({
"neighbor": peer_info[0],
"version": peer_info[1],
"as_number": peer_info[2],
"msg_received": peer_info[3],
"msg_sent": peer_info[4],
"table_version": peer_info[5],
"in_queue": peer_info[6],
"out_queue": peer_info[7],
"up_down": peer_info[8],
"state_pfx_rcd": peer_info[9],
"prefix_sent": peer_info[10],
"description": " ".join(peer_info[11:])
})
return peers
ipv4_peers = process_peers(ipv4_section)
ipv6_peers = process_peers(ipv6_section)
return ipv4_info, ipv4_peers, ipv6_info, ipv6_peers
def extract_bgp_info(raw_data):
lines = raw_data.split("\n")
info = {}
for line in lines:
if "BGP router identifier" in line:
parts = line.split(",")
info["router_id"] = parts[0].split("identifier")[1].strip()
info["local_as"] = parts[1].split("number")[1].strip().split(" ")[0]
if "vrf-id" in parts[-1]:
info["vrf_id"] = parts[-1].split("vrf-id")[1].strip()
if "BGP table version" in line:
info["table_version"] = line.split("version")[1].strip()
if "RIB entries" in line:
parts = line.split(",")
info["rib_entries"] = parts[0].split("entries")[1].strip()
info["rib_memory"] = parts[1].split("using")[1].strip()
if "Peers" in line:
parts = line.split(",")
info["peers"] = parts[0].split("Peers")[1].strip()
info["peers_memory"] = parts[1].split("using")[1].strip()
return info
def generate_bgp_json(ipv4_info, ipv4_peers, ipv6_info, ipv6_peers, bfd_peers=None):
if bfd_peers is None:
bfd_peers = []
return {
"ipv4_info": ipv4_info,
"ipv4_peers": ipv4_peers,
"ipv6_info": ipv6_info,
"ipv6_peers": ipv6_peers,
"bfd_peers": list(bfd_peers)
}