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
"""
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)