network/diagnose_verona_radius.py
2026-05-08 17:47:42 -05:00

83 lines
2.4 KiB
Python

#!/usr/bin/env python3
"""Diagnose RADIUS auth failure on Verona router after RouterOS upgrade."""
import sys
from mikrotik_connect import MikrotikAPI
def section(title):
print(f"\n{'=' * 70}\n=== {title}\n{'=' * 70}")
def dump(results):
if not results:
print("(no results)")
return
for r in results:
for k, v in r.items():
print(f" {k}: {v}")
print("---")
def main():
api = MikrotikAPI("10.254.254.101", "grahamro",
"cFKhz8q5gPLoucMbcT1Iy58r3IXgc3")
if not api.connect():
sys.exit(1)
if not api.login():
sys.exit(1)
try:
section("RouterOS version / identity")
dump(api.command("/system/resource/print"))
dump(api.command("/system/routerboard/print"))
dump(api.command("/system/identity/print"))
section("RADIUS clients (/radius print detail)")
dump(api.command("/radius/print"))
section("RADIUS incoming settings")
dump(api.command("/radius/incoming/print"))
section("AAA settings for user logins (/user aaa print)")
dump(api.command("/user/aaa/print"))
section("PPP AAA settings (/ppp aaa print)")
dump(api.command("/ppp/aaa/print"))
section("PPP profiles (may reference radius)")
dump(api.command("/ppp/profile/print"))
section("PPP secrets count")
secrets = api.command("/ppp/secret/print", ["=count-only="])
print(secrets)
section("Active PPP sessions")
dump(api.command("/ppp/active/print"))
section("Hotspot servers (if any)")
dump(api.command("/ip/hotspot/print"))
section("Recent log messages (last 200)")
logs = api.command("/log/print")
# Show only most recent 200 and filter those with radius / auth / ppp
for entry in logs[-200:]:
msg = entry.get("message", "")
topics = entry.get("topics", "")
time = entry.get("time", "")
if any(k in (msg + topics).lower() for k in
["radius", "auth", "ppp", "login", "fail", "reject"]):
print(f"[{time}] {topics}: {msg}")
section("Certificates (RADIUS over TLS / EAP may need these)")
dump(api.command("/certificate/print"))
section("IP services (enabled management services)")
dump(api.command("/ip/service/print"))
finally:
api.disconnect()
if __name__ == "__main__":
main()