Files
homelab-monitor/apps/api/src/routes/hosts.ts
T
jhodgkin 5329136bad
CI / web (pull_request) Successful in 24s
CI / api (pull_request) Successful in 31s
Show memory and disk capacity (used/total) on dashboard tiles
Previously the Mem/Disk bars only showed a percentage. Plumbed the
underlying byte totals through the whole stack -- collectors, DB
(with a migration for the already-deployed CT122 instance), API, and
the web tile -- so each card also shows e.g. "19.6/32.0 GB".

Verified end-to-end with a throwaway local instance (seeded snapshot,
logged in, screenshotted the rendered tile).

Note: the SSH-collected hosts (omv, ripper) assume the remote
monitor-readonly.sh script emits raw bytes for MEMLINE/DISK_, matching
Proxmox's convention -- unverified since that script only lives on
those two hosts, not in this repo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-22 23:36:09 +00:00

45 lines
1.6 KiB
TypeScript

import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import type Database from "better-sqlite3";
import { getLatestSnapshots, getRecentHistory } from "../db/index.js";
async function requireAuth(req: FastifyRequest, reply: FastifyReply) {
if (!req.session.username) {
reply.code(401).send({ error: "not authenticated" });
}
}
export function registerHostRoutes(app: FastifyInstance, db: Database.Database): void {
app.get("/api/hosts", { preHandler: requireAuth }, async () => {
const rows = getLatestSnapshots(db);
const history = new Map<string, { ts: string; cpuPct: number | null; memPct: number | null; diskPct: number | null }[]>();
for (const h of getRecentHistory(db)) {
if (!history.has(h.host_id)) history.set(h.host_id, []);
history.get(h.host_id)!.push({ ts: h.ts, cpuPct: h.cpu_pct, memPct: h.mem_pct, diskPct: h.disk_pct });
}
return {
hosts: rows.map((r) => ({
hostId: r.host_id,
displayName: r.display_name,
group: r.group_name,
status: r.status,
cpuPct: r.cpu_pct,
memPct: r.mem_pct,
diskPct: r.disk_pct,
memTotalBytes: r.mem_total_bytes,
memUsedBytes: r.mem_used_bytes,
diskTotalBytes: r.disk_total_bytes,
diskUsedBytes: r.disk_used_bytes,
memPressurePct: r.mem_pressure_pct,
cpuPressurePct: r.cpu_pressure_pct,
uptimeSec: r.uptime_sec,
lastSeen: r.ts,
history: history.get(r.host_id) ?? [],
})),
};
});
app.get("/api/health", async () => ({ ok: true }));
}