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 %}
Neighbor Version (V) AS Number Messages Received Messages Sent Table Version Inbound Queue (InQ) Outbound Queue (OutQ) Up/Down State/PfxRcd Prefix 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 %}
Neighbor Version (V) AS Number Messages Received Messages Sent Table Version Inbound Queue (InQ) Outbound Queue (OutQ) Up/Down State/PfxRcd Prefix 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)