110 lines
No EOL
3.8 KiB
Python
110 lines
No EOL
3.8 KiB
Python
import requests
|
|
import os
|
|
from datetime import datetime
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
from modules.parse import (
|
|
run_bgp_curl_command,
|
|
run_ipv4_route_summary_curl_command,
|
|
run_ipv6_route_summary_curl_command
|
|
)
|
|
from modules.bgp import parse_bgp_data, parse_route_summary
|
|
from modules.database import (
|
|
init_db, add_peer_stats, cleanup_old_data,
|
|
add_total_routes_stats
|
|
)
|
|
|
|
BGP_JSON_URL = "http://127.0.0.1:5000/bgp/json"
|
|
|
|
def fetch_bgp_data():
|
|
try:
|
|
response = requests.get(BGP_JSON_URL, timeout=15)
|
|
response.raise_for_status()
|
|
return response.json()
|
|
except requests.RequestException:
|
|
return None
|
|
|
|
def process_and_store_data(bgp_data, ipv4_summary_raw, ipv6_summary_raw):
|
|
now = datetime.utcnow().isoformat()
|
|
|
|
stats_to_add = []
|
|
if bgp_data:
|
|
for version, peers in [('ipv4', bgp_data.get('ipv4_peers', [])), ('ipv6', bgp_data.get('ipv6_peers', []))]:
|
|
for peer in peers:
|
|
try:
|
|
prefixes_received = int(peer.get('state_pfx_rcd', 0))
|
|
except (ValueError, TypeError):
|
|
prefixes_received = 0
|
|
try:
|
|
prefixes_sent = int(peer.get('prefix_sent', 0))
|
|
except (ValueError, TypeError):
|
|
prefixes_sent = 0
|
|
|
|
stats_to_add.append({
|
|
"timestamp": now,
|
|
"neighbor_address": peer['neighbor'],
|
|
"ip_version": version,
|
|
"asn": int(peer.get('as_number', 0)),
|
|
"description": peer.get('description', ''),
|
|
"prefixes_received": prefixes_received,
|
|
"prefixes_sent": prefixes_sent
|
|
})
|
|
|
|
if stats_to_add:
|
|
add_peer_stats(stats_to_add)
|
|
print(f" -> {len(stats_to_add)} peer records saved.")
|
|
else:
|
|
print(" -> No peer data found to save.")
|
|
|
|
ipv4_summary = parse_route_summary(ipv4_summary_raw)
|
|
ipv6_summary = parse_route_summary(ipv6_summary_raw)
|
|
|
|
total_routes_to_add = [
|
|
{"timestamp": now, "ip_version": "ipv4", "total_routes": ipv4_summary["routes"], "total_fib": ipv4_summary["fib"]},
|
|
{"timestamp": now, "ip_version": "ipv6", "total_routes": ipv6_summary["routes"], "total_fib": ipv6_summary["fib"]}
|
|
]
|
|
add_total_routes_stats(total_routes_to_add)
|
|
print(f" -> IPv4 Totaal: {ipv4_summary['routes']}, IPv6 Totaal: {ipv6_summary['routes']} saved.")
|
|
|
|
if __name__ == "__main__":
|
|
print(f"--- Collector Script Gestart: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} ---")
|
|
init_db()
|
|
|
|
all_ok = True
|
|
|
|
print("[TASK] BGP peer data ophalen...", end='', flush=True)
|
|
bgp_data = fetch_bgp_data()
|
|
if not bgp_data or not bgp_data.get('ipv4_peers'):
|
|
print("Error")
|
|
all_ok = False
|
|
else:
|
|
print("Success")
|
|
|
|
print("[TASK] IPv4 Route Summary ophalen...", end='', flush=True)
|
|
ipv4_summary_raw = run_ipv4_route_summary_curl_command()
|
|
if not ipv4_summary_raw or not ipv4_summary_raw.get('data') or 'Totals' not in ipv4_summary_raw.get('data', ''):
|
|
print("Error")
|
|
all_ok = False
|
|
else:
|
|
print("Success")
|
|
|
|
print("[TASK] IPv6 Route Summary ophalen...", end='', flush=True)
|
|
ipv6_summary_raw = run_ipv6_route_summary_curl_command()
|
|
if not ipv6_summary_raw or not ipv6_summary_raw.get('data') or 'Totals' not in ipv6_summary_raw.get('data', ''):
|
|
print("Error")
|
|
all_ok = False
|
|
else:
|
|
print("Success")
|
|
|
|
if all_ok:
|
|
print("[DB] Data verwerken en opslaan...")
|
|
process_and_store_data(bgp_data, ipv4_summary_raw, ipv6_summary_raw)
|
|
else:
|
|
print("[WARN] Verwerking overgeslagen vanwege eerdere fouten.")
|
|
|
|
print("[DB] Oude database records opschonen...")
|
|
cleanup_old_data()
|
|
|
|
print("--- Collector Script Complete ---") |