diff --git a/app.py b/app.py index 83c17f1..be9e0dd 100644 --- a/app.py +++ b/app.py @@ -5,6 +5,7 @@ import requests import re from jinja2 import Template from flask import Flask, render_template_string, jsonify, url_for, redirect, render_template, request, abort +from datetime import datetime, timedelta app = Flask(__name__) @@ -20,6 +21,7 @@ from modules.bfd import parse_bfd_peers_data from modules.bgp_dampening import parse_dampened_data, generate_dampened_json from modules.firewall import parse_firewall_data from modules.visual_route import generate_visual_route_graph +from modules.database import get_peer_history, get_total_routes_history, get_unique_peers @app.context_processor def inject_hostname(): @@ -310,4 +312,72 @@ def firewall_json(): return jsonify({"ipv4": ipv4_rulesets, "ipv6": ipv6_rulesets}) except Exception as e: - return jsonify({"error": "Failed to retrieve firewall data.", "details": str(e)}), 500 \ No newline at end of file + return jsonify({"error": "Failed to retrieve firewall data.", "details": str(e)}), 500 + +@app.route('/bgp/peer///graph') +def bgp_peer_graph_page(ip_version, neighbor_ip): + if ip_version not in ['ipv4', 'ipv6']: + abort(404) + return render_template('bgp_peer_graph.html', + neighbor_ip=neighbor_ip, + ip_version=ip_version) + +@app.route('/bgp/peer//history') +def bgp_peer_history_data(neighbor_ip): + time_range = request.args.get('range', '24h') + end_date = datetime.utcnow() + + if time_range == '7d': + start_date = end_date - timedelta(days=7) + elif time_range == '30d': + start_date = end_date - timedelta(days=30) + elif time_range == '90d': + start_date = end_date - timedelta(days=90) + else: + start_date = end_date - timedelta(hours=24) + + history_data = get_peer_history(neighbor_ip, start_date.isoformat(), end_date.isoformat()) + + labels = [item['timestamp'] for item in history_data] + received_data = [item['prefixes_received'] for item in history_data] + sent_data = [item['prefixes_sent'] for item in history_data] + + return jsonify({ + "labels": labels, + "received": received_data, + "sent": sent_data + }) + +@app.route('/bgp/history') +def history_page(): + peers = get_unique_peers() + return render_template('history.html', peers=peers) + +@app.route('/history/api/total-routes') +def total_routes_history_data(): + time_range = request.args.get('range', '24h') + end_date = datetime.utcnow() + + if time_range == '7d': + start_date = end_date - timedelta(days=7) + elif time_range == '30d': + start_date = end_date - timedelta(days=30) + else: + start_date = end_date - timedelta(hours=24) + + history_data = get_total_routes_history(start_date.isoformat(), end_date.isoformat()) + + response_data = { + "labels": sorted(list(set([item['timestamp'] for item in history_data]))), + "ipv4_routes": [], + "ipv6_routes": [] + } + + ipv4_map = {item['timestamp']: item['total_routes'] for item in history_data if item['ip_version'] == 'ipv4'} + ipv6_map = {item['timestamp']: item['total_routes'] for item in history_data if item['ip_version'] == 'ipv6'} + + for label in response_data["labels"]: + response_data["ipv4_routes"].append(ipv4_map.get(label, None)) + response_data["ipv6_routes"].append(ipv6_map.get(label, None)) + + return jsonify(response_data) \ No newline at end of file