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
+32 -2
View File
@@ -1,10 +1,40 @@
export const name = "FinalSite";
export const url = "https://status.finalsite.com/";
const STATUS_URL = "https://status.finalsite.com/api/v2/summary.json";
const STATUS_MAP = {
none: "operational",
minor: "degraded",
major: "degraded",
critical: "outage",
};
export async function checkStatus() {
const res = await fetch(STATUS_URL);
if (!res.ok) {
throw new Error(`FinalSite status request failed (${res.status})`);
}
const data = await res.json();
const indicator = data.status?.indicator ?? "unknown";
const status = STATUS_MAP[indicator] ?? "unknown";
const incidents = data.incidents ?? [];
const activeIncidents = incidents.filter((i) => i.status !== "resolved");
let message;
if (activeIncidents.length > 0) {
message = activeIncidents.map((i) => i.name).join("; ");
} else {
message = data.status?.description ?? "Status unavailable.";
}
return {
name,
status: "operational",
message: "All services running normally.",
status,
message,
lastUpdated: new Date().toISOString(),
};
}