2025-11-17 09:46:05 -06:00
|
|
|
import type { Client } from "ssh2";
|
|
|
|
|
import { execCommand, toFixedNum } from "./common-utils.js";
|
|
|
|
|
|
|
|
|
|
export async function collectDiskMetrics(client: Client): Promise<{
|
|
|
|
|
percent: number | null;
|
|
|
|
|
usedHuman: string | null;
|
|
|
|
|
totalHuman: string | null;
|
|
|
|
|
availableHuman: string | null;
|
|
|
|
|
}> {
|
|
|
|
|
let diskPercent: number | null = null;
|
|
|
|
|
let usedHuman: string | null = null;
|
|
|
|
|
let totalHuman: string | null = null;
|
|
|
|
|
let availableHuman: string | null = null;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const [diskOutHuman, diskOutBytes] = await Promise.all([
|
|
|
|
|
execCommand(client, "df -h -P / | tail -n +2"),
|
|
|
|
|
execCommand(client, "df -B1 -P / | tail -n +2"),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const humanLine =
|
|
|
|
|
diskOutHuman.stdout
|
|
|
|
|
.split("\n")
|
|
|
|
|
.map((l) => l.trim())
|
|
|
|
|
.filter(Boolean)[0] || "";
|
|
|
|
|
const bytesLine =
|
|
|
|
|
diskOutBytes.stdout
|
|
|
|
|
.split("\n")
|
|
|
|
|
.map((l) => l.trim())
|
|
|
|
|
.filter(Boolean)[0] || "";
|
|
|
|
|
|
|
|
|
|
const humanParts = humanLine.split(/\s+/);
|
|
|
|
|
const bytesParts = bytesLine.split(/\s+/);
|
|
|
|
|
|
|
|
|
|
if (humanParts.length >= 6 && bytesParts.length >= 6) {
|
|
|
|
|
totalHuman = humanParts[1] || null;
|
|
|
|
|
usedHuman = humanParts[2] || null;
|
|
|
|
|
availableHuman = humanParts[3] || null;
|
|
|
|
|
|
|
|
|
|
const totalBytes = Number(bytesParts[1]);
|
|
|
|
|
const usedBytes = Number(bytesParts[2]);
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
Number.isFinite(totalBytes) &&
|
|
|
|
|
Number.isFinite(usedBytes) &&
|
|
|
|
|
totalBytes > 0
|
|
|
|
|
) {
|
|
|
|
|
diskPercent = Math.max(
|
|
|
|
|
0,
|
|
|
|
|
Math.min(100, (usedBytes / totalBytes) * 100),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-03-08 18:02:14 -05:00
|
|
|
} catch {
|
2025-11-17 09:46:05 -06:00
|
|
|
diskPercent = null;
|
|
|
|
|
usedHuman = null;
|
|
|
|
|
totalHuman = null;
|
|
|
|
|
availableHuman = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
percent: toFixedNum(diskPercent, 0),
|
|
|
|
|
usedHuman,
|
|
|
|
|
totalHuman,
|
|
|
|
|
availableHuman,
|
|
|
|
|
};
|
|
|
|
|
}
|