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:
@@ -1,10 +1,47 @@
|
||||
import https from "https";
|
||||
|
||||
export const name = "SpamTitan";
|
||||
export const url = "https://mailportal.nhsd.net";
|
||||
|
||||
const HOST = "mailportal.nhsd.net";
|
||||
const TIMEOUT_MS = 8000;
|
||||
|
||||
// TODO: TitanHQ has extensive API docs — investigate using the SpamTitan API
|
||||
// for richer status data (queue depth, filtering stats, etc.) rather than
|
||||
// a simple synthetic check.
|
||||
|
||||
// Synthetic check — hit the appliance directly and see if it responds.
|
||||
// Uses https.request so we can skip self-signed cert verification.
|
||||
function probe(host) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const req = https.request(
|
||||
{
|
||||
hostname: host,
|
||||
path: "/",
|
||||
method: "HEAD",
|
||||
rejectUnauthorized: false, // local appliance may have self-signed cert
|
||||
timeout: TIMEOUT_MS,
|
||||
},
|
||||
(res) => resolve(res.statusCode)
|
||||
);
|
||||
|
||||
req.on("timeout", () => {
|
||||
req.destroy();
|
||||
reject(new Error("Connection timed out"));
|
||||
});
|
||||
|
||||
req.on("error", reject);
|
||||
req.end();
|
||||
});
|
||||
}
|
||||
|
||||
export async function checkStatus() {
|
||||
const statusCode = await probe(HOST);
|
||||
|
||||
return {
|
||||
name,
|
||||
status: "operational",
|
||||
message: "Email filtering operational.",
|
||||
message: `Mail portal responding (HTTP ${statusCode}).`,
|
||||
lastUpdated: new Date().toISOString(),
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user