feat: /api/fleet - live Pi node status API route
This commit is contained in:
34
app/(app)/api/fleet/route.ts
Normal file
34
app/(app)/api/fleet/route.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
const GATEWAY_URL = process.env.BLACKROAD_GATEWAY_URL || "http://127.0.0.1:8787";
|
||||
const PI_NODES = [
|
||||
{ id: "aria64", ip: "192.168.4.38", role: "Primary", capacity: 22500 },
|
||||
{ id: "blackroad-pi",ip: "192.168.4.64", role: "Tunnel", capacity: 7500 },
|
||||
{ id: "lucidia-alt", ip: "192.168.4.99", role: "Backup", capacity: 1000 },
|
||||
];
|
||||
|
||||
async function pingNode(ip: string): Promise<boolean> {
|
||||
try {
|
||||
const r = await fetch(`http://${ip}:11434/api/tags`, { signal: AbortSignal.timeout(2000) });
|
||||
return r.ok;
|
||||
} catch { return false; }
|
||||
}
|
||||
|
||||
export async function GET() {
|
||||
const [agentsResp, ...pings] = await Promise.allSettled([
|
||||
fetch(`${GATEWAY_URL}/agents`),
|
||||
...PI_NODES.map(n => pingNode(n.ip)),
|
||||
]);
|
||||
|
||||
const agents = agentsResp.status === "fulfilled" && agentsResp.value.ok
|
||||
? (await agentsResp.value.json()).agents ?? []
|
||||
: [];
|
||||
|
||||
const nodes = PI_NODES.map((node, i) => ({
|
||||
...node,
|
||||
online: pings[i].status === "fulfilled" ? (pings[i] as PromiseFulfilledResult<boolean>).value : false,
|
||||
agents: agents.filter((a: { node?: string }) => a.node === node.id).length,
|
||||
}));
|
||||
|
||||
return NextResponse.json({ nodes, total_agents: agents.length, timestamp: Date.now() });
|
||||
}
|
||||
Reference in New Issue
Block a user