Implement all vendor integrations, WAN graphs, and FortiGate health panel

- Wire up 26 vendor providers: Atlassian Statuspage API, Status.io, Instatus,
  AWS RSS feeds, Apple/Google JSON feeds, M365 Graph API, and synthetic checks
- Add 11 new providers: AWS, Cloudflare, SmartPass, School Dismissal Manager,
  SherpaDesk, Classkick, ClassDojo, Savvas, Study Island, Promethean, RAZ-Kids
- Rename Local Infrastructure → Internet (TCP check to 8.8.8.8:53)
- Add WAN throughput graph section: dual-link canvas graphs (Crown Castle +
  Comcast) polling FortiGate REST API every 30s with 30-min rolling history
- Add FortiGate health card: uptime, CPU %, memory % from FortiOS API
- Add /api/throughput and /api/fortigate-health endpoints
- Add README with setup instructions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Klein
2026-02-20 13:46:13 -05:00
parent 7d8cde8f92
commit 51eb3bf7c8
39 changed files with 1776 additions and 59 deletions
+42 -2
View File
@@ -1,10 +1,50 @@
export const name = "Raptor";
export const url = "https://status.raptortech.com/";
const API_URL =
"https://status.raptortech.com/1.0/status/6501d5abfab4ce052d52e315";
// Status.io status_code → dashboard status
function mapStatusCode(code) {
if (code === 100) return "operational";
if (code === 200) return "degraded"; // planned maintenance
if (code >= 300 && code < 500) return "degraded"; // degraded / partial disruption
if (code >= 500) return "outage"; // service disruption / security event
return "unknown";
}
export async function checkStatus() {
const res = await fetch(API_URL);
if (!res.ok) {
throw new Error(`Raptor status request failed (${res.status})`);
}
const data = await res.json();
const result = data.result ?? {};
const overall = result.status_overall ?? {};
const status = mapStatusCode(overall.status_code);
const incidents = result.incidents ?? [];
let message;
if (incidents.length > 0) {
message = incidents
.map((i) => {
const components = (i.containers_affected ?? [])
.map((c) => c.name)
.join(", ");
return components ? `${i.name} (${components})` : i.name;
})
.join(" | ");
} else {
message = overall.status ?? "All services operational.";
}
return {
name,
status: "operational",
message: "Visitor management online.",
status,
message,
lastUpdated: new Date().toISOString(),
};
}