From 9857129b6f329a5c6653b41e55f040826b43b80b Mon Sep 17 00:00:00 2001 From: Blackwhitebear8 Date: Sun, 12 Jan 2025 17:14:56 +0100 Subject: [PATCH] Add bgp-summ.py --- bgp-summ.py | 241 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 bgp-summ.py diff --git a/bgp-summ.py b/bgp-summ.py new file mode 100644 index 0000000..768cb54 --- /dev/null +++ b/bgp-summ.py @@ -0,0 +1,241 @@ +import json +import subprocess +from jinja2 import Template +from flask import Flask, render_template_string, jsonify + +app = Flask(__name__) + +def run_curl_command(): + curl_command = [ + "curl", "-k", "--location", "--request", "POST", "https://ip:port/show", + "--form", "data={\"op\": \"show\", \"path\": [\"bgp\", \"summ\"]}", + "--form", "key=key" + ] + response = subprocess.check_output(curl_command, text=True) + return json.loads(response) + +def parse_bgp_data(data): + ipv4_section = "" + ipv6_section = "" + + if "data" in data: + raw_data = data["data"] + + if "IPv4 Unicast Summary" in raw_data: + ipv4_section = raw_data.split("IPv4 Unicast Summary (VRF default):")[1].split("IPv6 Unicast Summary (VRF default):")[0].strip() + + if "IPv6 Unicast Summary" in raw_data: + ipv6_section = raw_data.split("IPv6 Unicast Summary (VRF default):")[1].strip() + + def process_peers(peer_data): + peers = [] + for line in peer_data.split("\n"): + 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_peers, ipv6_peers + +def generate_html_table(ipv4_peers, ipv6_peers): + html_template = """ + + + + + + BGP Peer Summary + + + + + +
+

Core1.Doet.pixelHosting.nl BGP summary

+ +

IPv4 Unicast Summary

+ + + + + + + + + + + + + + + + + + + + {% for peer in ipv4_peers %} + + + + + + + + + + + + + + + {% endfor %} + +
NeighborVersion (V)AS NumberMessages ReceivedMessages SentTable VersionInbound Queue (InQ)Outbound Queue (OutQ)Up/DownState/PfxRcdPrefix Sent (PfxSnt)Description
{{ peer.neighbor }}{{ peer.version }}{{ peer.as_number }}{{ peer.msg_received }}{{ peer.msg_sent }}{{ peer.table_version }}{{ peer.in_queue }}{{ peer.out_queue }}{{ peer.up_down }}{{ peer.state_pfx_rcd }}{{ peer.prefix_sent }}{{ peer.description }}
+ +

IPv6 Unicast Summary

+ + + + + + + + + + + + + + + + + + + + {% for peer in ipv6_peers %} + + + + + + + + + + + + + + + {% endfor %} + +
NeighborVersion (V)AS NumberMessages ReceivedMessages SentTable VersionInbound Queue (InQ)Outbound Queue (OutQ)Up/DownState/PfxRcdPrefix Sent (PfxSnt)Description
{{ peer.neighbor }}{{ peer.version }}{{ peer.as_number }}{{ peer.msg_received }}{{ peer.msg_sent }}{{ peer.table_version }}{{ peer.in_queue }}{{ peer.out_queue }}{{ peer.up_down }}{{ peer.state_pfx_rcd }}{{ peer.prefix_sent }}{{ peer.description }}
+ +
+ + + + + + + + + + """ + + template = Template(html_template) + html_output = template.render(ipv4_peers=ipv4_peers, ipv6_peers=ipv6_peers) + + return html_output + +@app.route('/') +def bgp_peer_summary(): + data = run_curl_command() + + ipv4_peers, ipv6_peers = parse_bgp_data(data) + + html_output = generate_html_table(ipv4_peers, ipv6_peers) + + return render_template_string(html_output) + +@app.route('/json') +def bgp_peer_summary_json(): + data = run_curl_command() + + ipv4_peers, ipv6_peers = parse_bgp_data(data) + + json_data = { + "ipv4_peers": ipv4_peers, + "ipv6_peers": ipv6_peers + } + + return jsonify(json_data) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000, debug=True) \ No newline at end of file