How this dashboard works
Tickets (right side)
The ticket panel shows open + awaiting-reply tickets for one department at a time, pulled live from two systems at once and merged:
- CACloud / Hostbill — via its API (
api.php, API id + key). Pulls theopenandclient-replylists for the department. - Zammad (
cs.idig.net) — via its REST API with a Bearer token, querying new + open tickets for the department's group.
Pick the department from the Department Select dropdown (top-right). Each department maps to the right IDs in both systems:
| Department | CACloud dept | Zammad group |
|---|---|---|
| Support | 1 | 7 |
| Sales | 2 | 5 |
| Billing | 3 | 6 |
| Abuse | 4 | 1 |
Tickets auto-refresh every 60 seconds (with a 60 s server-side cache so we don't hammer the APIs). Each ticket card links straight to that ticket in its system. Code: sentinel/panels/tickets.py (+ hostbill.py / zammad.py).
Graphs (left side)
The 2×2 grid is live network bandwidth graphs from Cacti (bits/second on our core links). They're pulled straight from the Cacti server as images (graph_image.php?local_graph_id=…) and refresh every 60 seconds.
The Network Select dropdown (top-left) switches which set of 4 graphs you see — each network (eSecure, iDig United, iDig Peer1) has its own four Cacti graph IDs and Cacti server, defined in NETWORKS in sentinel/routes.py.
TopTalkers (under each graph)
Below each graph, the TopTalkers box shows the current highest-bandwidth source/destination IPs for that link. The page proxies these from the per-site traffic-analysis boxes (/ntop-proxy.php) so they load even though those boxes aren't public. If one can't be reached it quietly shows “unavailable” instead of breaking the page.
The rest
The top buttons open tools that each have their own “How it works” panel: Null Routes (blackholed IPs on the core routers) and Audit (hypervisor-vs-NetBox VM checks). Mail List and Systems are shortcuts for customer email lists and internal system links. The clock/timezone selector (top-right) and light/dark toggle (🌙) are per-viewer. Whole app runs as a Flask site on van.sentinel.idig.net (/opt/sentinel/); all credentials live in .env, never in code.