@glassmkr/crucible 0.13.5 → 0.13.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/alerts/state.d.ts +0 -1
- package/dist/alerts/state.js +0 -3
- package/dist/alerts/state.js.map +1 -1
- package/dist/collect/__tests__/cve.test.d.ts +1 -0
- package/dist/collect/__tests__/cve.test.js +29 -0
- package/dist/collect/__tests__/cve.test.js.map +1 -0
- package/dist/collect/__tests__/security.test.js +62 -0
- package/dist/collect/__tests__/security.test.js.map +1 -1
- package/dist/collect/cve.d.ts +9 -0
- package/dist/collect/cve.js +33 -23
- package/dist/collect/cve.js.map +1 -1
- package/dist/collect/dmesg-events.d.ts +6 -8
- package/dist/collect/dmesg-events.js +8 -26
- package/dist/collect/dmesg-events.js.map +1 -1
- package/dist/collect/dmi.js +7 -16
- package/dist/collect/dmi.js.map +1 -1
- package/dist/collect/edac.js +14 -43
- package/dist/collect/edac.js.map +1 -1
- package/dist/collect/fd.js +4 -12
- package/dist/collect/fd.js.map +1 -1
- package/dist/collect/gpu.d.ts +2 -3
- package/dist/collect/gpu.js +13 -19
- package/dist/collect/gpu.js.map +1 -1
- package/dist/collect/hardware-raid.js +5 -9
- package/dist/collect/hardware-raid.js.map +1 -1
- package/dist/collect/ntp.js +1 -6
- package/dist/collect/ntp.js.map +1 -1
- package/dist/collect/reboot-evidence.js +2 -7
- package/dist/collect/reboot-evidence.js.map +1 -1
- package/dist/collect/security.js +18 -4
- package/dist/collect/security.js.map +1 -1
- package/dist/collect/thermal.js +9 -14
- package/dist/collect/thermal.js.map +1 -1
- package/dist/collect/zfs.js +2 -3
- package/dist/collect/zfs.js.map +1 -1
- package/dist/lib/__tests__/dmesg.test.d.ts +1 -0
- package/dist/lib/__tests__/dmesg.test.js +87 -0
- package/dist/lib/__tests__/dmesg.test.js.map +1 -0
- package/dist/lib/__tests__/exec.test.js +16 -1
- package/dist/lib/__tests__/exec.test.js.map +1 -1
- package/dist/lib/__tests__/parse.test.js +50 -2
- package/dist/lib/__tests__/parse.test.js.map +1 -1
- package/dist/lib/dmesg.d.ts +29 -0
- package/dist/lib/dmesg.js +56 -0
- package/dist/lib/dmesg.js.map +1 -0
- package/dist/lib/exec.d.ts +2 -0
- package/dist/lib/exec.js +14 -0
- package/dist/lib/exec.js.map +1 -1
- package/dist/lib/parse.d.ts +3 -0
- package/dist/lib/parse.js +34 -1
- package/dist/lib/parse.js.map +1 -1
- package/dist/lib/version-check.d.ts +0 -6
- package/dist/lib/version-check.js +0 -11
- package/dist/lib/version-check.js.map +1 -1
- package/dist/metrics-server.js +0 -1
- package/dist/metrics-server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ Lightweight bare-metal server monitoring agent. Collects hardware and OS health
|
|
|
8
8
|
|
|
9
9
|
Open source. MIT licensed. Built by [Glassmkr](https://glassmkr.com). Crucible is the open-source product; the optional [Glassmkr Dashboard](https://app.glassmkr.com) is a hosted SaaS that consumes Crucible's snapshots.
|
|
10
10
|
|
|
11
|
-
**Resource usage:**
|
|
11
|
+
**Resource usage:** under 1% of host RAM on every host we tested. Crucible 0.13.6 measured across all 10 validation hosts at steady state shows a median 108 MB RSS (range 81 to 116 MB; varies primarily with the bundled Node version). Effectively 0% CPU at the default 60-second snapshot interval. Random-read I/O throughput delta under 1.5% under fio saturation (no measurable impact on customer workloads).
|
|
12
12
|
|
|
13
13
|
**Security:** See [glassmkr.com/trust](https://glassmkr.com/trust) for the full list of what Crucible does and does not collect.
|
|
14
14
|
|
package/dist/alerts/state.d.ts
CHANGED
package/dist/alerts/state.js
CHANGED
package/dist/alerts/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/alerts/state.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/alerts/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Tests for cve.ts distro detection after the F7 refactor that routes
|
|
2
|
+
// /etc/os-release ID extraction through the shared system.ts
|
|
3
|
+
// readOsReleaseField (which lowercases + strips quotes). The
|
|
4
|
+
// CVE-specific family mapping stays in cve.ts; these lock that mapping.
|
|
5
|
+
import { describe, it, expect } from "vitest";
|
|
6
|
+
import { __test_only as cveTest } from "../cve.js";
|
|
7
|
+
const { distroFromOsRelease } = cveTest;
|
|
8
|
+
describe("cve distroFromOsRelease", () => {
|
|
9
|
+
it("maps common os-release ID values to the CveDistro family", () => {
|
|
10
|
+
expect(distroFromOsRelease('ID=ubuntu\nVERSION_ID="24.04"')).toBe("ubuntu");
|
|
11
|
+
expect(distroFromOsRelease("ID=debian")).toBe("debian");
|
|
12
|
+
expect(distroFromOsRelease('ID="rocky"')).toBe("rocky");
|
|
13
|
+
expect(distroFromOsRelease("ID=almalinux")).toBe("alma");
|
|
14
|
+
expect(distroFromOsRelease("ID=alma")).toBe("alma");
|
|
15
|
+
expect(distroFromOsRelease("ID=rhel")).toBe("rhel");
|
|
16
|
+
expect(distroFromOsRelease("ID=fedora")).toBe("fedora");
|
|
17
|
+
expect(distroFromOsRelease("ID=centos")).toBe("centos");
|
|
18
|
+
expect(distroFromOsRelease("ID=sles")).toBe("sles");
|
|
19
|
+
expect(distroFromOsRelease('ID="opensuse-leap"')).toBe("opensuse");
|
|
20
|
+
});
|
|
21
|
+
it("lowercases the ID via the shared reader (quoted, capitalized)", () => {
|
|
22
|
+
expect(distroFromOsRelease('ID="Ubuntu"')).toBe("ubuntu");
|
|
23
|
+
});
|
|
24
|
+
it("returns unknown for a missing or unrecognized ID", () => {
|
|
25
|
+
expect(distroFromOsRelease('PRETTY_NAME="Something"')).toBe("unknown");
|
|
26
|
+
expect(distroFromOsRelease("ID=plan9")).toBe("unknown");
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=cve.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cve.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/cve.test.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,6DAA6D;AAC7D,6DAA6D;AAC7D,wEAAwE;AAExE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC;AAExC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,mBAAmB,CAAC,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvE,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -83,4 +83,66 @@ describe("collectSecurity cache shape (0.9.3 fix)", () => {
|
|
|
83
83
|
expect(callsAfter).toBeGreaterThan(callsBefore);
|
|
84
84
|
});
|
|
85
85
|
});
|
|
86
|
+
// R-P2-RHEL-1 (val-fleet campaign 2026-05-22): the RHEL dnf-automatic
|
|
87
|
+
// path used to treat ANY enabled timer as "configured: true", which
|
|
88
|
+
// included the download-only timers (dnf-automatic.timer /
|
|
89
|
+
// dnf-automatic-download.timer with apply_updates != yes). A
|
|
90
|
+
// download-only host then suppressed pending_security_updates while
|
|
91
|
+
// Critical patches sat unapplied (observed on h12sst: 26 pending,
|
|
92
|
+
// some Critical). The fix requires either dnf-automatic-install.timer
|
|
93
|
+
// (applies unconditionally) OR a legacy/download timer WITH
|
|
94
|
+
// apply_updates = yes in /etc/dnf/automatic.conf.
|
|
95
|
+
describe("checkAutoUpdates dnf-automatic apply-vs-download (R-P2-RHEL-1)", () => {
|
|
96
|
+
// Helper: route the shell mock so the Debian path is absent (no
|
|
97
|
+
// unattended-upgrades) and dnf-automatic is installed, then let the
|
|
98
|
+
// caller decide which timers/config to report.
|
|
99
|
+
function dnfHost(opts) {
|
|
100
|
+
return (...args) => {
|
|
101
|
+
const cmd = String(args[1]?.join(" ") ?? "");
|
|
102
|
+
// Debian path: not installed
|
|
103
|
+
if (cmd.includes("dpkg -l unattended-upgrades"))
|
|
104
|
+
return Promise.resolve(null);
|
|
105
|
+
// dnf-automatic installed
|
|
106
|
+
if (cmd.includes("rpm -q dnf-automatic"))
|
|
107
|
+
return Promise.resolve("dnf-automatic-1.0.0-1.el9.noarch");
|
|
108
|
+
// install timer
|
|
109
|
+
if (cmd.includes("is-enabled dnf-automatic-install.timer")) {
|
|
110
|
+
return Promise.resolve(opts.installTimer ? "enabled" : "disabled");
|
|
111
|
+
}
|
|
112
|
+
// legacy/download timer (single is-enabled call with both unit names)
|
|
113
|
+
if (cmd.includes("is-enabled dnf-automatic.timer dnf-automatic-download.timer")) {
|
|
114
|
+
return Promise.resolve(opts.legacyTimer ? "enabled\ndisabled" : "disabled\ndisabled");
|
|
115
|
+
}
|
|
116
|
+
// apply_updates grep
|
|
117
|
+
if (cmd.includes("apply_updates")) {
|
|
118
|
+
return Promise.resolve(opts.applyYes ? "apply_updates = yes" : "");
|
|
119
|
+
}
|
|
120
|
+
return Promise.resolve(null);
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
it("install.timer enabled => configured: true regardless of apply_updates", async () => {
|
|
124
|
+
runMock.mockImplementation(dnfHost({ installTimer: true, legacyTimer: false, applyYes: false }));
|
|
125
|
+
const r = await collectSecurity();
|
|
126
|
+
expect(r.auto_updates.mechanism).toBe("dnf-automatic");
|
|
127
|
+
expect(r.auto_updates.configured).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
it("legacy/download timer enabled but apply_updates != yes => configured: false (download-only)", async () => {
|
|
130
|
+
runMock.mockImplementation(dnfHost({ installTimer: false, legacyTimer: true, applyYes: false }));
|
|
131
|
+
const r = await collectSecurity();
|
|
132
|
+
expect(r.auto_updates.mechanism).toBe("dnf-automatic");
|
|
133
|
+
expect(r.auto_updates.configured).toBe(false);
|
|
134
|
+
expect(r.auto_updates.details).toMatch(/download-only/i);
|
|
135
|
+
});
|
|
136
|
+
it("legacy timer enabled WITH apply_updates = yes => configured: true", async () => {
|
|
137
|
+
runMock.mockImplementation(dnfHost({ installTimer: false, legacyTimer: true, applyYes: true }));
|
|
138
|
+
const r = await collectSecurity();
|
|
139
|
+
expect(r.auto_updates.configured).toBe(true);
|
|
140
|
+
});
|
|
141
|
+
it("dnf-automatic installed but no timer enabled => configured: false", async () => {
|
|
142
|
+
runMock.mockImplementation(dnfHost({ installTimer: false, legacyTimer: false, applyYes: false }));
|
|
143
|
+
const r = await collectSecurity();
|
|
144
|
+
expect(r.auto_updates.configured).toBe(false);
|
|
145
|
+
expect(r.auto_updates.details).toMatch(/no installing timer/i);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
86
148
|
//# sourceMappingURL=security.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/security.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"security.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/security.test.ts"],"names":[],"mappings":"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"}
|
package/dist/collect/cve.d.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import type { CveDistro, CveSeverity, CveSnapshot, KernelCve } from "../lib/types.js";
|
|
2
2
|
export declare function collectCve(): Promise<CveSnapshot>;
|
|
3
3
|
declare function detectDistro(): CveDistro;
|
|
4
|
+
/**
|
|
5
|
+
* Map an /etc/os-release ID field to a CveDistro. ID extraction is
|
|
6
|
+
* delegated to system.ts's readOsReleaseField (the canonical reader,
|
|
7
|
+
* already lowercases) so all three Crucible distro consumers parse the
|
|
8
|
+
* ID line the same way; the family-mapping switch stays here because it
|
|
9
|
+
* is CVE-collection-specific.
|
|
10
|
+
*/
|
|
11
|
+
declare function distroFromOsRelease(raw: string): CveDistro;
|
|
4
12
|
/**
|
|
5
13
|
* Parse the relevant kernel-CVE subset of `pro security-status --format=json`.
|
|
6
14
|
* The full shape is large; we only need pending CVEs against the
|
|
@@ -46,6 +54,7 @@ export declare function parseZypperListPatchesText(raw: string): {
|
|
|
46
54
|
declare function normaliseSeverity(raw: string): CveSeverity;
|
|
47
55
|
export declare const __test_only: {
|
|
48
56
|
detectDistro: typeof detectDistro;
|
|
57
|
+
distroFromOsRelease: typeof distroFromOsRelease;
|
|
49
58
|
normaliseSeverity: typeof normaliseSeverity;
|
|
50
59
|
};
|
|
51
60
|
export {};
|
package/dist/collect/cve.js
CHANGED
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
// Per CC_SPEC_CRUCIBLE_C11_C18_FULL_BUNDLE_2026-05-19.md §3.
|
|
34
34
|
import { readProcFile } from "../lib/parse.js";
|
|
35
35
|
import { run } from "../lib/exec.js";
|
|
36
|
+
import { readOsReleaseField } from "./system.js";
|
|
36
37
|
export async function collectCve() {
|
|
37
38
|
const distro = detectDistro();
|
|
38
39
|
switch (distro) {
|
|
@@ -64,29 +65,37 @@ function detectDistro() {
|
|
|
64
65
|
const raw = readProcFile("/etc/os-release");
|
|
65
66
|
if (!raw)
|
|
66
67
|
return "unknown";
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
68
|
+
return distroFromOsRelease(raw);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Map an /etc/os-release ID field to a CveDistro. ID extraction is
|
|
72
|
+
* delegated to system.ts's readOsReleaseField (the canonical reader,
|
|
73
|
+
* already lowercases) so all three Crucible distro consumers parse the
|
|
74
|
+
* ID line the same way; the family-mapping switch stays here because it
|
|
75
|
+
* is CVE-collection-specific.
|
|
76
|
+
*/
|
|
77
|
+
function distroFromOsRelease(raw) {
|
|
78
|
+
const id = readOsReleaseField(raw, "ID");
|
|
79
|
+
if (id === undefined)
|
|
80
|
+
return "unknown";
|
|
81
|
+
if (id === "ubuntu")
|
|
82
|
+
return "ubuntu";
|
|
83
|
+
if (id === "debian")
|
|
84
|
+
return "debian";
|
|
85
|
+
if (id === "rhel")
|
|
86
|
+
return "rhel";
|
|
87
|
+
if (id === "fedora")
|
|
88
|
+
return "fedora";
|
|
89
|
+
if (id === "rocky")
|
|
90
|
+
return "rocky";
|
|
91
|
+
if (id === "almalinux" || id === "alma")
|
|
92
|
+
return "alma";
|
|
93
|
+
if (id === "centos")
|
|
94
|
+
return "centos";
|
|
95
|
+
if (id === "sles")
|
|
96
|
+
return "sles";
|
|
97
|
+
if (id === "opensuse" || id === "opensuse-leap" || id === "opensuse-tumbleweed") {
|
|
98
|
+
return "opensuse";
|
|
90
99
|
}
|
|
91
100
|
return "unknown";
|
|
92
101
|
}
|
|
@@ -322,6 +331,7 @@ function normaliseSeverity(raw) {
|
|
|
322
331
|
}
|
|
323
332
|
export const __test_only = {
|
|
324
333
|
detectDistro,
|
|
334
|
+
distroFromOsRelease,
|
|
325
335
|
normaliseSeverity,
|
|
326
336
|
};
|
|
327
337
|
//# sourceMappingURL=cve.js.map
|
package/dist/collect/cve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cve.js","sourceRoot":"","sources":["../../src/collect/cve.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,sEAAsE;AACtE,qEAAqE;AACrE,qEAAqE;AACrE,sEAAsE;AACtE,oEAAoE;AACpE,uCAAuC;AACvC,EAAE;AACF,sBAAsB;AACtB,EAAE;AACF,2BAA2B;AAC3B,sEAAsE;AACtE,qEAAqE;AACrE,gEAAgE;AAChE,6CAA6C;AAC7C,EAAE;AACF,6CAA6C;AAC7C,oEAAoE;AACpE,qEAAqE;AACrE,sEAAsE;AACtE,EAAE;AACF,uBAAuB;AACvB,sEAAsE;AACtE,0DAA0D;AAC1D,EAAE;AACF,kEAAkE;AAClE,qEAAqE;AACrE,mEAAmE;AACnE,gEAAgE;AAChE,eAAe;AACf,EAAE;AACF,6DAA6D;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cve.js","sourceRoot":"","sources":["../../src/collect/cve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseKernelLogTimestamp } from "../lib/dmesg.js";
|
|
1
2
|
import type { DmesgEventType, DmesgEventsSnapshot, DmesgStructuredEvent } from "../lib/types.js";
|
|
2
3
|
interface DmesgHandler {
|
|
3
4
|
event_type: DmesgEventType;
|
|
@@ -15,17 +16,14 @@ export declare function collectDmesgEvents(): Promise<DmesgEventsSnapshot>;
|
|
|
15
16
|
*/
|
|
16
17
|
export declare function parseDmesgOutput(raw: string, cutoffMs: number): DmesgStructuredEvent[];
|
|
17
18
|
/**
|
|
18
|
-
* Extract a unix-ms timestamp from a dmesg line.
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* Relative-time format ("[12345.678]") returns null (no absolute
|
|
23
|
-
* anchor available without `uptime`).
|
|
19
|
+
* Extract a unix-ms timestamp from a dmesg line. Thin re-export of the
|
|
20
|
+
* shared lib/dmesg parser, kept under the original name for callers and
|
|
21
|
+
* tests that import `parseDmesgTimestamp` directly.
|
|
24
22
|
*/
|
|
25
|
-
export declare
|
|
23
|
+
export declare const parseDmesgTimestamp: typeof parseKernelLogTimestamp;
|
|
26
24
|
export declare const __test_only: {
|
|
27
25
|
parseDmesgOutput: typeof parseDmesgOutput;
|
|
28
|
-
parseDmesgTimestamp: typeof
|
|
26
|
+
parseDmesgTimestamp: typeof parseKernelLogTimestamp;
|
|
29
27
|
HANDLERS: DmesgHandler[];
|
|
30
28
|
WINDOW_SECONDS: number;
|
|
31
29
|
};
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
// tuple within 60 seconds collapses to one entry; not implemented in
|
|
27
27
|
// v1 (each occurrence ships as a separate event for now). Dashboard's
|
|
28
28
|
// side can collapse if needed via cross-snapshot library primitives.
|
|
29
|
-
import {
|
|
29
|
+
import { readDmesg, parseKernelLogTimestamp } from "../lib/dmesg.js";
|
|
30
30
|
const WINDOW_SECONDS = 3600;
|
|
31
31
|
/**
|
|
32
32
|
* SCSI sense codes. Format observed across kernel 5.x and 6.x:
|
|
@@ -109,10 +109,9 @@ export async function collectDmesgEvents() {
|
|
|
109
109
|
});
|
|
110
110
|
// `--time-format=iso` for kernel 5.10+; older kernels ignore the
|
|
111
111
|
// flag and produce relative-time output we tolerate downstream.
|
|
112
|
-
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
const dmesgOut = out ?? (await run("dmesg", ["--no-pager"]));
|
|
112
|
+
// readDmesg falls back to plain `--no-pager` when that call produces
|
|
113
|
+
// nothing (no privileges is more common than a missing flag).
|
|
114
|
+
const dmesgOut = await readDmesg({ extraIsoArgs: ["--ctime"] });
|
|
116
115
|
if (!dmesgOut) {
|
|
117
116
|
return empty("dmesg not readable (CAP_SYSLOG missing or kernel.dmesg_restrict=1?)");
|
|
118
117
|
}
|
|
@@ -165,28 +164,11 @@ export function parseDmesgOutput(raw, cutoffMs) {
|
|
|
165
164
|
return events;
|
|
166
165
|
}
|
|
167
166
|
/**
|
|
168
|
-
* Extract a unix-ms timestamp from a dmesg line.
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
* Relative-time format ("[12345.678]") returns null (no absolute
|
|
173
|
-
* anchor available without `uptime`).
|
|
167
|
+
* Extract a unix-ms timestamp from a dmesg line. Thin re-export of the
|
|
168
|
+
* shared lib/dmesg parser, kept under the original name for callers and
|
|
169
|
+
* tests that import `parseDmesgTimestamp` directly.
|
|
174
170
|
*/
|
|
175
|
-
export
|
|
176
|
-
const isoMatch = line.match(/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:[,.]\d+)?(?:[+-]\d{2}:?\d{2}|Z)?)/);
|
|
177
|
-
if (isoMatch) {
|
|
178
|
-
// Normalise the comma fractional separator to dot.
|
|
179
|
-
const iso = isoMatch[1].replace(",", ".");
|
|
180
|
-
const t = Date.parse(iso);
|
|
181
|
-
return Number.isFinite(t) ? t : null;
|
|
182
|
-
}
|
|
183
|
-
const ctimeMatch = line.match(/^\[([A-Z][a-z]{2}\s+[A-Z][a-z]{2}\s+\d+\s+\d{2}:\d{2}:\d{2}\s+\d{4})\]/);
|
|
184
|
-
if (ctimeMatch) {
|
|
185
|
-
const t = Date.parse(ctimeMatch[1]);
|
|
186
|
-
return Number.isFinite(t) ? t : null;
|
|
187
|
-
}
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
171
|
+
export const parseDmesgTimestamp = parseKernelLogTimestamp;
|
|
190
172
|
export const __test_only = {
|
|
191
173
|
parseDmesgOutput,
|
|
192
174
|
parseDmesgTimestamp,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dmesg-events.js","sourceRoot":"","sources":["../../src/collect/dmesg-events.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,EAAE;AACF,qEAAqE;AACrE,mEAAmE;AACnE,mEAAmE;AACnE,EAAE;AACF,8CAA8C;AAC9C,6BAA6B;AAC7B,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,uEAAuE;AACvE,oEAAoE;AACpE,oEAAoE;AACpE,gEAAgE;AAChE,iEAAiE;AACjE,qEAAqE;AACrE,mBAAmB;AACnB,EAAE;AACF,sEAAsE;AACtE,qEAAqE;AACrE,2BAA2B;AAC3B,EAAE;AACF,oEAAoE;AACpE,qEAAqE;AACrE,sEAAsE;AACtE,qEAAqE;AAErE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dmesg-events.js","sourceRoot":"","sources":["../../src/collect/dmesg-events.ts"],"names":[],"mappings":"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"}
|
package/dist/collect/dmi.js
CHANGED
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
import { promises as fs } from "node:fs";
|
|
2
1
|
import { join } from "node:path";
|
|
2
|
+
import { readFileTrim } from "../lib/parse.js";
|
|
3
3
|
const DMI_ROOT = "/sys/class/dmi/id";
|
|
4
|
-
async function readTrim(path) {
|
|
5
|
-
try {
|
|
6
|
-
const raw = await fs.readFile(path, "utf-8");
|
|
7
|
-
return raw.trim() || null;
|
|
8
|
-
}
|
|
9
|
-
catch {
|
|
10
|
-
return null;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
4
|
/**
|
|
14
5
|
* Classify the contents of /sys/class/dmi/id/sys_vendor (and product_name
|
|
15
6
|
* for the Microsoft Hyper-V edge case) into a canonical vendor.
|
|
@@ -65,12 +56,12 @@ export function classifyVendor(rawVendor, productName) {
|
|
|
65
56
|
return { vendor: "generic", is_virtual: false };
|
|
66
57
|
}
|
|
67
58
|
export async function collectDmi(root = DMI_ROOT) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
59
|
+
// Empty-string contents are treated as absent (|| null), matching the
|
|
60
|
+
// previous private readTrim's `raw.trim() || null`.
|
|
61
|
+
const rawVendor = readFileTrim(join(root, "sys_vendor")) || null;
|
|
62
|
+
const productName = readFileTrim(join(root, "product_name")) || null;
|
|
63
|
+
const biosVersion = readFileTrim(join(root, "bios_version")) || null;
|
|
64
|
+
const biosDate = readFileTrim(join(root, "bios_date")) || null;
|
|
74
65
|
if (!rawVendor && !productName && !biosVersion && !biosDate) {
|
|
75
66
|
return {
|
|
76
67
|
available: false,
|
package/dist/collect/dmi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dmi.js","sourceRoot":"","sources":["../../src/collect/dmi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dmi.js","sourceRoot":"","sources":["../../src/collect/dmi.ts"],"names":[],"mappings":"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"}
|
package/dist/collect/edac.js
CHANGED
|
@@ -18,56 +18,27 @@
|
|
|
18
18
|
//
|
|
19
19
|
// On hosts where EDAC is loaded but counters stay at zero, this
|
|
20
20
|
// collector emits zero counters — that's the correct baseline.
|
|
21
|
-
import { readdirSync, readFileSync } from "node:fs";
|
|
22
21
|
import { join } from "node:path";
|
|
22
|
+
import { readDirSafe, readFileInt, readFileTrim } from "../lib/parse.js";
|
|
23
23
|
const EDAC_ROOT = "/sys/devices/system/edac/mc";
|
|
24
|
-
function readUint(path) {
|
|
25
|
-
try {
|
|
26
|
-
const s = readFileSync(path, "utf8").trim();
|
|
27
|
-
if (!/^\d+$/.test(s))
|
|
28
|
-
return null;
|
|
29
|
-
return parseInt(s, 10);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
function readString(path) {
|
|
36
|
-
try {
|
|
37
|
-
return readFileSync(path, "utf8").trim();
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
24
|
function listMcDirs() {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
.map((n) => join(EDAC_ROOT, n));
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return [];
|
|
51
|
-
}
|
|
25
|
+
return readDirSafe(EDAC_ROOT)
|
|
26
|
+
.filter((n) => /^mc\d+$/.test(n))
|
|
27
|
+
.map((n) => join(EDAC_ROOT, n));
|
|
52
28
|
}
|
|
53
29
|
function listDimmDirs(mcPath) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
.map((n) => join(mcPath, n));
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return [];
|
|
61
|
-
}
|
|
30
|
+
return readDirSafe(mcPath)
|
|
31
|
+
.filter((n) => /^dimm\d+$/.test(n) || /^rank\d+$/.test(n))
|
|
32
|
+
.map((n) => join(mcPath, n));
|
|
62
33
|
}
|
|
63
34
|
function collectDimm(dimmPath) {
|
|
64
|
-
const ce =
|
|
65
|
-
const ue =
|
|
35
|
+
const ce = readFileInt(join(dimmPath, "dimm_ce_count"));
|
|
36
|
+
const ue = readFileInt(join(dimmPath, "dimm_ue_count"));
|
|
66
37
|
if (ce === null && ue === null)
|
|
67
38
|
return null;
|
|
68
|
-
const label =
|
|
69
|
-
const location =
|
|
70
|
-
const sizeStr =
|
|
39
|
+
const label = readFileTrim(join(dimmPath, "dimm_label"));
|
|
40
|
+
const location = readFileTrim(join(dimmPath, "dimm_location"));
|
|
41
|
+
const sizeStr = readFileTrim(join(dimmPath, "size"));
|
|
71
42
|
const sizeMb = sizeStr && /^\d+$/.test(sizeStr) ? parseInt(sizeStr, 10) : null;
|
|
72
43
|
return {
|
|
73
44
|
label: label ?? "",
|
|
@@ -85,8 +56,8 @@ export function collectEdac() {
|
|
|
85
56
|
let totalUe = 0;
|
|
86
57
|
const dimms = [];
|
|
87
58
|
for (const mc of mcDirs) {
|
|
88
|
-
const ce =
|
|
89
|
-
const ue =
|
|
59
|
+
const ce = readFileInt(join(mc, "ce_count")) ?? 0;
|
|
60
|
+
const ue = readFileInt(join(mc, "ue_count")) ?? 0;
|
|
90
61
|
totalCe += ce;
|
|
91
62
|
totalUe += ue;
|
|
92
63
|
for (const dimm of listDimmDirs(mc)) {
|
package/dist/collect/edac.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edac.js","sourceRoot":"","sources":["../../src/collect/edac.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,EAAE;AACF,kEAAkE;AAClE,EAAE;AACF,sEAAsE;AACtE,qEAAqE;AACrE,sEAAsE;AACtE,gEAAgE;AAChE,EAAE;AACF,+DAA+D;AAC/D,kEAAkE;AAClE,EAAE;AACF,uDAAuD;AACvD,8DAA8D;AAC9D,gEAAgE;AAChE,mEAAmE;AACnE,6BAA6B;AAC7B,EAAE;AACF,gEAAgE;AAChE,+DAA+D;AAE/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"edac.js","sourceRoot":"","sources":["../../src/collect/edac.ts"],"names":[],"mappings":"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"}
|
package/dist/collect/fd.js
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
// Two-pass strategy: cheap readdir over /proc to count FDs per PID, then
|
|
11
11
|
// expensive read of limits + comm only for the top 50 consumers. Process-
|
|
12
12
|
// disappeared races are tolerated silently (ENOENT swallowed).
|
|
13
|
-
import { readdirSync
|
|
14
|
-
import { readProcFile } from "../lib/parse.js";
|
|
13
|
+
import { readdirSync } from "fs";
|
|
14
|
+
import { readFileTrim, readProcFile } from "../lib/parse.js";
|
|
15
15
|
const TOP_N = 50;
|
|
16
16
|
export function collectFileDescriptors() {
|
|
17
17
|
const raw = readProcFile("/proc/sys/fs/file-nr");
|
|
@@ -75,10 +75,10 @@ export function collectProcessFd() {
|
|
|
75
75
|
// Expensive pass: read comm + limits for the candidates.
|
|
76
76
|
const top_consumers = [];
|
|
77
77
|
for (const { pid, fd_count } of candidates) {
|
|
78
|
-
const comm =
|
|
78
|
+
const comm = readFileTrim(`/proc/${pid}/comm`);
|
|
79
79
|
if (comm === null)
|
|
80
80
|
continue; // Process disappeared.
|
|
81
|
-
const limits =
|
|
81
|
+
const limits = readFileTrim(`/proc/${pid}/limits`);
|
|
82
82
|
if (limits === null)
|
|
83
83
|
continue;
|
|
84
84
|
const parsed = parseOpenFilesLimit(limits);
|
|
@@ -107,14 +107,6 @@ export function collectProcessFd() {
|
|
|
107
107
|
highest_percent_of_limit: highest,
|
|
108
108
|
};
|
|
109
109
|
}
|
|
110
|
-
function safeReadTrimmed(path) {
|
|
111
|
-
try {
|
|
112
|
-
return readFileSync(path, "utf-8").trim();
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
110
|
function errCode(err) {
|
|
119
111
|
if (err && typeof err === "object" && "code" in err) {
|
|
120
112
|
const code = err.code;
|