@glassmkr/crucible 0.1.0 → 0.3.1

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.
Files changed (45) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +24 -0
  2. package/.github/ISSUE_TEMPLATE/no_data.md +26 -0
  3. package/README.md +48 -52
  4. package/dist/alerts/rules.js +120 -0
  5. package/dist/alerts/rules.js.map +1 -1
  6. package/dist/collect/cpu.js +57 -16
  7. package/dist/collect/cpu.js.map +1 -1
  8. package/dist/collect/disks.js +48 -2
  9. package/dist/collect/disks.js.map +1 -1
  10. package/dist/collect/ipmi.js +160 -2
  11. package/dist/collect/ipmi.js.map +1 -1
  12. package/dist/collect/security.d.ts +39 -0
  13. package/dist/collect/security.js +176 -0
  14. package/dist/collect/security.js.map +1 -0
  15. package/dist/config.d.ts +23 -0
  16. package/dist/config.js +5 -0
  17. package/dist/config.js.map +1 -1
  18. package/dist/index.js +48 -3
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/types.d.ts +64 -0
  21. package/dist/lib/version-check.d.ts +7 -0
  22. package/dist/lib/version-check.js +39 -0
  23. package/dist/lib/version-check.js.map +1 -0
  24. package/dist/metrics-server.d.ts +3 -0
  25. package/dist/metrics-server.js +113 -0
  26. package/dist/metrics-server.js.map +1 -0
  27. package/dist/notify/telegram.js +27 -9
  28. package/dist/notify/telegram.js.map +1 -1
  29. package/dist/push/forge.d.ts +1 -0
  30. package/dist/push/forge.js +80 -4
  31. package/dist/push/forge.js.map +1 -1
  32. package/package.json +1 -1
  33. package/scripts/sign-release.sh +29 -0
  34. package/src/alerts/rules.ts +99 -0
  35. package/src/collect/cpu.ts +64 -16
  36. package/src/collect/disks.ts +57 -2
  37. package/src/collect/ipmi.ts +147 -3
  38. package/src/collect/security.ts +238 -0
  39. package/src/config.ts +5 -0
  40. package/src/index.ts +49 -3
  41. package/src/lib/types.ts +44 -0
  42. package/src/lib/version-check.ts +38 -0
  43. package/src/metrics-server.ts +123 -0
  44. package/src/notify/telegram.ts +29 -9
  45. package/src/push/forge.ts +89 -5
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Something is not working as expected
4
+ ---
5
+
6
+ **Crucible version:** (check package.json or service logs)
7
+ **OS and version:** (e.g., Ubuntu 24.04)
8
+ **Kernel:** (output of `uname -r`)
9
+ **Node.js version:** (output of `node --version`)
10
+ **Running as root:** yes/no
11
+
12
+ **What happened:**
13
+
14
+ **What you expected:**
15
+
16
+ **Service status:**
17
+ ```
18
+ systemctl status glassmkr-collector
19
+ ```
20
+
21
+ **Last 50 log lines:**
22
+ ```
23
+ journalctl -u glassmkr-collector -n 50 --no-pager
24
+ ```
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: No Data in Forge
3
+ about: Crucible is running but Forge shows no data
4
+ ---
5
+
6
+ **Crucible version:**
7
+ **OS and version:**
8
+ **How long since install:**
9
+
10
+ **Can you reach Forge?**
11
+ ```
12
+ curl -s -o /dev/null -w "%{http_code}" https://forge.glassmkr.com/api/health
13
+ ```
14
+
15
+ **Service status:**
16
+ ```
17
+ systemctl status glassmkr-collector
18
+ ```
19
+
20
+ **Last 50 log lines:**
21
+ ```
22
+ journalctl -u glassmkr-collector -n 50 --no-pager
23
+ ```
24
+
25
+ **Is smartctl installed?** `which smartctl`
26
+ **Is ipmitool installed?** `which ipmitool`
package/README.md CHANGED
@@ -1,8 +1,11 @@
1
- # Glassmkr Collector
1
+ # Crucible
2
2
 
3
- Lightweight bare metal server monitoring. Collects hardware and OS health data, evaluates 15 opinionated alert rules, sends notifications directly (Telegram, Slack, email), and optionally pushes to [Forge](https://forge.glassmkr.com) for dashboard and history.
3
+ [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
4
+ [![npm version](https://img.shields.io/npm/v/@glassmkr/crucible.svg)](https://www.npmjs.com/package/@glassmkr/crucible)
4
5
 
5
- Runs as a systemd service. Wakes up every 5 minutes, collects everything, alerts if needed, sleeps.
6
+ Lightweight bare metal server monitoring agent. Collects hardware and OS health data, pushes snapshots to [Forge](https://forge.glassmkr.com) every 5 minutes. Forge evaluates 30 alert rules and sends notifications.
7
+
8
+ Open source. MIT licensed. Built by [Glassmkr](https://glassmkr.com).
6
9
 
7
10
  ## Quick Install
8
11
 
@@ -10,38 +13,34 @@ Runs as a systemd service. Wakes up every 5 minutes, collects everything, alerts
10
13
  curl -sf https://forge.glassmkr.com/install | bash
11
14
  ```
12
15
 
13
- Or manual:
16
+ Or via npm:
14
17
 
15
18
  ```bash
16
- npm install -g @glassmkr/collector
19
+ npm install -g @glassmkr/crucible
17
20
  ```
18
21
 
19
- ## What It Monitors
20
-
21
- **Hardware (IPMI):** CPU temperature, ECC memory errors, PSU redundancy
22
- **Storage:** SMART health, NVMe wear, RAID status, disk space, I/O latency
23
- **Network:** Interface errors/drops, link speed, saturation
24
- **OS:** RAM pressure, swap usage, CPU iowait, OOM kills, disk space
25
-
26
- ## 15 Alert Rules
27
-
28
- | # | Alert | Severity | Default Threshold |
29
- |---|-------|----------|-------------------|
30
- | 1 | RAM usage high | Warning/Critical | 90% / 95% |
31
- | 2 | Swap active | Warning | Any usage |
32
- | 3 | Disk space high | Warning/Critical | 85% / 95% |
33
- | 4 | CPU iowait high | Warning | 20% |
34
- | 5 | OOM kills detected | Critical | Any |
35
- | 6 | SMART failure | Critical | Bad health/sectors |
36
- | 7 | NVMe wear high | Warning/Critical | 85% / 95% |
37
- | 8 | RAID degraded | Critical | Any degradation |
38
- | 9 | Disk latency high | Warning | 50ms NVMe, 200ms HDD |
39
- | 10 | Interface errors | Warning | Any errors/drops |
40
- | 11 | Link speed mismatch | Warning | Below 1 Gbps |
41
- | 12 | Interface saturation | Warning | 90% utilization |
42
- | 13 | CPU temperature high | Warning/Critical | 80C / 90C |
43
- | 14 | ECC memory errors | Warning/Critical | Correctable / Uncorrectable |
44
- | 15 | PSU redundancy loss | Critical | Any PSU failed/absent |
22
+ ## What Crucible Collects
23
+
24
+ | Module | Data |
25
+ |--------|------|
26
+ | **CPU** | Aggregate and per-core utilization (user, system, iowait, idle, irq, softirq) |
27
+ | **Memory** | RAM usage, swap usage |
28
+ | **Disks** | Space per mount point, inode counts, mount options, filesystem type |
29
+ | **SMART** | Drive health, model, temperature, power-on hours, reallocated sectors, NVMe wear |
30
+ | **Network** | Interface traffic, error/drop counts, link speed |
31
+ | **RAID** | mdadm array status, degraded detection |
32
+ | **IPMI** | Sensor readings (temperatures, fans, voltages, power), ECC errors, SEL events |
33
+ | **Security** | SSH config, firewall status, pending updates, kernel vulnerabilities |
34
+
35
+ ## Alert Rules
36
+
37
+ Crucible collects the data. Forge evaluates 30 alert rules server-side and sends notifications via Telegram and Slack.
38
+
39
+ **Categories:** OS (5), Storage (8), Network (3), Hardware/IPMI (6), ZFS (2), Security (6).
40
+
41
+ **Priorities:** P1 Urgent, P2 High, P3 Medium, P4 Low.
42
+
43
+ See the full rule list: [forge.glassmkr.com/docs/alerts](https://forge.glassmkr.com/docs/alerts)
45
44
 
46
45
  ## Configuration
47
46
 
@@ -57,36 +56,33 @@ forge:
57
56
  enabled: true
58
57
  url: "https://forge.glassmkr.com"
59
58
  api_key: "col_xxx"
60
- thresholds:
61
- ram_percent: 90
62
- disk_percent: 85
63
- channels:
64
- telegram:
65
- enabled: true
66
- bot_token: "123:abc"
67
- chat_id: "123456"
68
59
  ```
69
60
 
70
- See [config/collector.example.yaml](config/collector.example.yaml) for all options.
61
+ Full configuration reference: [forge.glassmkr.com/docs/configuration](https://forge.glassmkr.com/docs/configuration)
71
62
 
72
63
  ## Requirements
73
64
 
74
- - Linux (Ubuntu 22.04/24.04, Debian 11/12)
75
- - Node.js 22+
76
- - Root access
77
- - Optional: smartmontools (for SMART monitoring)
78
- - Optional: ipmitool (for IPMI/BMC monitoring)
65
+ - Linux (any distribution: Ubuntu, Debian, RHEL, Rocky, Alma, Arch, Alpine)
66
+ - Node.js 18+
67
+ - Root access (for SMART, IPMI, and system metrics)
68
+ - Optional: `smartmontools` (SMART data), `ipmitool` (IPMI data)
79
69
 
80
- ## Notification Channels
70
+ ## How It Works
81
71
 
82
- **Telegram:** Provide bot token and chat ID. Create a bot via @BotFather.
83
- **Email:** Uses local sendmail. Install postfix or msmtp.
84
- **Slack:** Provide an incoming webhook URL.
72
+ 1. Crucible runs as a systemd service
73
+ 2. Every 5 minutes, it collects a complete health snapshot
74
+ 3. The snapshot is pushed to Forge via HTTPS (POST /api/v1/ingest)
75
+ 4. Forge evaluates alert rules and sends notifications
76
+ 5. Data appears in the Forge dashboard within seconds of push
85
77
 
86
- ## Forge Integration
78
+ ## Documentation
87
79
 
88
- Optional. Register at [forge.glassmkr.com](https://forge.glassmkr.com), add a server, get an API key. The collector pushes health snapshots for dashboard display and history.
80
+ - [Getting Started](https://forge.glassmkr.com/docs/getting-started)
81
+ - [Configuration Reference](https://forge.glassmkr.com/docs/configuration)
82
+ - [Alert Rules (30)](https://forge.glassmkr.com/docs/alerts)
83
+ - [Troubleshooting](https://forge.glassmkr.com/docs/troubleshooting)
84
+ - [API Reference](https://forge.glassmkr.com/docs/api)
89
85
 
90
86
  ## License
91
87
 
92
- [MIT](LICENSE)
88
+ MIT. See [LICENSE](LICENSE).
@@ -199,5 +199,125 @@ export const allRules = [
199
199
  evidence: { failed: failed.map(p => ({ name: p.name, status: p.status })) },
200
200
  recommendation: "Replace failed PSU. Check power connections." }];
201
201
  } },
202
+ // 19. IPMI SEL critical events
203
+ { type: "ipmi_sel_critical", evaluate(snap) {
204
+ if (!snap.ipmi?.available || !snap.ipmi.sel_events_recent?.length)
205
+ return [];
206
+ const critical = snap.ipmi.sel_events_recent.filter(e => e.severity === "critical" && e.direction === "Asserted");
207
+ if (critical.length === 0)
208
+ return [];
209
+ const byType = {};
210
+ for (const e of critical) {
211
+ if (!byType[e.sensor_type])
212
+ byType[e.sensor_type] = [];
213
+ byType[e.sensor_type].push(e);
214
+ }
215
+ const details = Object.entries(byType).map(([t, evts]) => `${t}: ${evts.map(e => `${e.sensor}: ${e.event}`).join(", ")}`).join("; ");
216
+ const recs = [];
217
+ if (byType.memory)
218
+ recs.push("Memory errors: identify slot with `ipmitool sel elist | grep -i memory`. Schedule DIMM replacement.");
219
+ if (byType.power)
220
+ recs.push("PSU event: check physical PSU and connections. Verify redundancy: `ipmitool chassis status`.");
221
+ if (byType.watchdog)
222
+ recs.push("Watchdog reset: OS or BMC became unresponsive. Check dmesg for root cause.");
223
+ if (byType.processor)
224
+ recs.push("CPU event: check for thermal throttling or MCE. Run `dmesg | grep -i mce`.");
225
+ if (recs.length === 0)
226
+ recs.push("Review full SEL: `ipmitool sel elist`.");
227
+ return [{ type: "ipmi_sel_critical", severity: "critical",
228
+ title: `IPMI: ${critical.length} critical hardware event(s)`,
229
+ message: `BMC System Event Log: ${critical.length} critical event(s). ${details}`,
230
+ evidence: { critical_events: critical, sensor_types: Object.keys(byType) },
231
+ recommendation: recs.join(" ") }];
232
+ } },
233
+ // 20. Fan failure
234
+ { type: "ipmi_fan_failure", evaluate(snap) {
235
+ if (!snap.ipmi?.available || !snap.ipmi.fans?.length)
236
+ return [];
237
+ const failed = snap.ipmi.fans.filter(f => f.status === "critical" || (f.rpm === 0 && f.status !== "absent"));
238
+ if (failed.length === 0)
239
+ return [];
240
+ const total = snap.ipmi.fans.filter(f => f.status !== "absent").length;
241
+ const names = failed.map(f => `${f.name} (${f.rpm} RPM)`).join(", ");
242
+ return [{ type: "ipmi_fan_failure", severity: "critical",
243
+ title: `Fan failure: ${failed.length} of ${total} fans`,
244
+ message: `${failed.length} fan(s) stopped or critically slow: ${names}. Reduced cooling capacity.`,
245
+ evidence: { failed_fans: failed, total_fans: total, all_fans: snap.ipmi.fans.filter(f => f.status !== "absent") },
246
+ recommendation: "Check physical fans. Monitor temps: `ipmitool sdr type Temperature`. Replace failed fan module." }];
247
+ } },
248
+ // === Security (6) ===
249
+ // 21. SSH root password login
250
+ { type: "ssh_root_password", evaluate(snap) {
251
+ if (!snap.security?.ssh?.rootPasswordExposed)
252
+ return [];
253
+ return [{ type: "ssh_root_password", severity: "warning",
254
+ title: "SSH root login with password enabled",
255
+ message: `PermitRootLogin is "${snap.security.ssh.permitRootLogin}" and PasswordAuthentication is "${snap.security.ssh.passwordAuthentication}". Root can be brute-forced over SSH.`,
256
+ evidence: { permitRootLogin: snap.security.ssh.permitRootLogin, passwordAuthentication: snap.security.ssh.passwordAuthentication },
257
+ recommendation: 'Set "PermitRootLogin prohibit-password" in /etc/ssh/sshd_config and restart sshd. Key-based root login still works.' }];
258
+ } },
259
+ // 22. No firewall
260
+ { type: "no_firewall", evaluate(snap) {
261
+ if (!snap.security || snap.security.firewall.active)
262
+ return [];
263
+ return [{ type: "no_firewall", severity: "warning",
264
+ title: "No firewall active",
265
+ message: "No active firewall rules detected (checked UFW, firewalld, nftables, iptables). All ports are exposed unless protected by network-level ACLs.",
266
+ evidence: { source: snap.security.firewall.source },
267
+ recommendation: 'Enable a firewall: "sudo ufw enable" (Debian/Ubuntu) or "sudo systemctl start firewalld" (RHEL/Rocky).' }];
268
+ } },
269
+ // 23. Pending security updates
270
+ { type: "pending_security_updates", evaluate(snap, t) {
271
+ if (!snap.security?.pending_updates?.available)
272
+ return [];
273
+ const maxPending = 10;
274
+ if (snap.security.pending_updates.pendingCount <= maxPending)
275
+ return [];
276
+ const d = snap.security.pending_updates;
277
+ return [{ type: "pending_security_updates", severity: "warning",
278
+ title: `${d.pendingCount} security updates pending`,
279
+ message: `${d.pendingCount} security updates pending on this ${d.distro} server.`,
280
+ evidence: { pendingCount: d.pendingCount, distro: d.distro },
281
+ recommendation: d.distro === "ubuntu" || d.distro === "debian" ? 'Apply with: "sudo apt-get upgrade"' : 'Apply with: "sudo dnf update --security"' }];
282
+ } },
283
+ // 24. Kernel vulnerabilities
284
+ { type: "kernel_vulnerabilities", evaluate(snap) {
285
+ if (!snap.security?.kernel_vulns?.length)
286
+ return [];
287
+ const unmitigated = snap.security.kernel_vulns.filter(v => !v.mitigated);
288
+ if (unmitigated.length === 0)
289
+ return [];
290
+ const details = unmitigated.map(v => `${v.name}: ${v.status}`).join("; ");
291
+ return [{ type: "kernel_vulnerabilities", severity: "warning",
292
+ title: `${unmitigated.length} CPU vulnerability mitigations missing`,
293
+ message: `Unmitigated: ${details}. Update the kernel and CPU microcode to apply mitigations.`,
294
+ evidence: { unmitigated, total: snap.security.kernel_vulns.length },
295
+ recommendation: 'Check: "grep . /sys/devices/system/cpu/vulnerabilities/*". Update kernel and microcode packages.' }];
296
+ } },
297
+ // 25. Kernel needs reboot
298
+ { type: "kernel_needs_reboot", evaluate(snap) {
299
+ if (!snap.security?.kernel_reboot?.needsReboot)
300
+ return [];
301
+ const k = snap.security.kernel_reboot;
302
+ return [{ type: "kernel_needs_reboot", severity: "warning",
303
+ title: "Reboot required for kernel update",
304
+ message: `Running kernel: ${k.running}. Installed kernel: ${k.installed}. A reboot is needed to apply the newer kernel.`,
305
+ evidence: { running: k.running, installed: k.installed },
306
+ recommendation: "Schedule a reboot to apply the newer kernel. Security patches may not be active until then." }];
307
+ } },
308
+ // 26. Unattended upgrades disabled
309
+ { type: "unattended_upgrades_disabled", evaluate(snap) {
310
+ if (!snap.security || snap.security.auto_updates.configured)
311
+ return [];
312
+ const a = snap.security.auto_updates;
313
+ const hint = a.mechanism === "unattended-upgrades" ? 'Enable: "sudo dpkg-reconfigure -plow unattended-upgrades"'
314
+ : a.mechanism === "dnf-automatic" ? 'Enable: "sudo systemctl enable --now dnf-automatic-install.timer"'
315
+ : 'Install: "sudo apt install unattended-upgrades" (Debian/Ubuntu) or "sudo dnf install dnf-automatic" (RHEL/Rocky)';
316
+ return [{ type: "unattended_upgrades_disabled", severity: "warning",
317
+ title: "Automatic security updates not configured",
318
+ message: `${a.details}. Without automatic updates, security patches must be applied manually.`,
319
+ evidence: { mechanism: a.mechanism, details: a.details },
320
+ recommendation: hint }];
321
+ } },
202
322
  ];
203
323
  //# sourceMappingURL=rules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/alerts/rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/alerts/rules.ts"],"names":[],"mappings":"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"}
@@ -1,35 +1,76 @@
1
1
  import { readProcFile, sleep } from "../lib/parse.js";
2
- function parseProcStat() {
3
- const raw = readProcFile("/proc/stat") || "";
4
- const line = raw.split("\n").find((l) => l.startsWith("cpu "));
5
- if (!line)
6
- return { user: 0, nice: 0, system: 0, idle: 0, iowait: 0, irq: 0, softirq: 0, steal: 0 };
2
+ function parseLine(line) {
7
3
  const parts = line.split(/\s+/).slice(1).map(Number);
8
4
  return {
9
5
  user: parts[0] || 0, nice: parts[1] || 0, system: parts[2] || 0, idle: parts[3] || 0,
10
6
  iowait: parts[4] || 0, irq: parts[5] || 0, softirq: parts[6] || 0, steal: parts[7] || 0,
11
7
  };
12
8
  }
9
+ function parseProcStat() {
10
+ const raw = readProcFile("/proc/stat") || "";
11
+ const lines = raw.split("\n");
12
+ const aggLine = lines.find((l) => l.startsWith("cpu "));
13
+ const aggregate = aggLine ? parseLine(aggLine) : { user: 0, nice: 0, system: 0, idle: 0, iowait: 0, irq: 0, softirq: 0, steal: 0 };
14
+ const cores = [];
15
+ for (const line of lines) {
16
+ if (/^cpu\d+\s/.test(line)) {
17
+ cores.push(parseLine(line));
18
+ }
19
+ }
20
+ return { aggregate, cores };
21
+ }
22
+ function calcPercents(d) {
23
+ const total = Object.values(d).reduce((a, b) => a + b, 0) || 1;
24
+ const r = (v) => Math.round((v / total) * 10000) / 100;
25
+ return {
26
+ user: r(d.user + d.nice),
27
+ system: r(d.system),
28
+ iowait: r(d.iowait),
29
+ idle: r(d.idle),
30
+ irq: r(d.irq),
31
+ softirq: r(d.softirq),
32
+ };
33
+ }
34
+ function delta(a, b) {
35
+ return {
36
+ user: b.user - a.user, nice: b.nice - a.nice,
37
+ system: b.system - a.system, idle: b.idle - a.idle,
38
+ iowait: b.iowait - a.iowait, irq: b.irq - a.irq,
39
+ softirq: b.softirq - a.softirq, steal: b.steal - a.steal,
40
+ };
41
+ }
13
42
  export async function collectCpu() {
14
43
  const stat1 = parseProcStat();
15
44
  await sleep(1000);
16
45
  const stat2 = parseProcStat();
17
- const d = {
18
- user: stat2.user - stat1.user, nice: stat2.nice - stat1.nice,
19
- system: stat2.system - stat1.system, idle: stat2.idle - stat1.idle,
20
- iowait: stat2.iowait - stat1.iowait, irq: stat2.irq - stat1.irq,
21
- softirq: stat2.softirq - stat1.softirq, steal: stat2.steal - stat1.steal,
22
- };
23
- const total = Object.values(d).reduce((a, b) => a + b, 0) || 1;
46
+ const aggDelta = delta(stat1.aggregate, stat2.aggregate);
47
+ const agg = calcPercents(aggDelta);
24
48
  const loadavg = (readProcFile("/proc/loadavg") || "0 0 0").trim().split(" ");
49
+ // Per-core stats
50
+ const cores = [];
51
+ const coreCount = Math.min(stat1.cores.length, stat2.cores.length);
52
+ for (let i = 0; i < coreCount; i++) {
53
+ const d = delta(stat1.cores[i], stat2.cores[i]);
54
+ const p = calcPercents(d);
55
+ cores.push({
56
+ core: i,
57
+ user_percent: p.user,
58
+ system_percent: p.system,
59
+ iowait_percent: p.iowait,
60
+ idle_percent: p.idle,
61
+ irq_percent: p.irq,
62
+ softirq_percent: p.softirq,
63
+ });
64
+ }
25
65
  return {
26
- user_percent: Math.round((d.user / total) * 10000) / 100,
27
- system_percent: Math.round((d.system / total) * 10000) / 100,
28
- iowait_percent: Math.round((d.iowait / total) * 10000) / 100,
29
- idle_percent: Math.round((d.idle / total) * 10000) / 100,
66
+ user_percent: agg.user,
67
+ system_percent: agg.system,
68
+ iowait_percent: agg.iowait,
69
+ idle_percent: agg.idle,
30
70
  load_1m: parseFloat(loadavg[0]) || 0,
31
71
  load_5m: parseFloat(loadavg[1]) || 0,
32
72
  load_15m: parseFloat(loadavg[2]) || 0,
73
+ cores,
33
74
  };
34
75
  }
35
76
  //# sourceMappingURL=cpu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cpu.js","sourceRoot":"","sources":["../../src/collect/cpu.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cpu.js","sourceRoot":"","sources":["../../src/collect/cpu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAQtD,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACpF,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;KACxF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAEnI,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;IAC/D,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACb,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,CAAU,EAAE,CAAU;IACnC,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;QAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;QAClD,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;QAC/C,OAAO,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;KACzD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IAClB,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAE9B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE7E,iBAAiB;IACjB,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,CAAC;YACP,YAAY,EAAE,CAAC,CAAC,IAAI;YACpB,cAAc,EAAE,CAAC,CAAC,MAAM;YACxB,cAAc,EAAE,CAAC,CAAC,MAAM;YACxB,YAAY,EAAE,CAAC,CAAC,IAAI;YACpB,WAAW,EAAE,CAAC,CAAC,GAAG;YAClB,eAAe,EAAE,CAAC,CAAC,OAAO;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,YAAY,EAAE,GAAG,CAAC,IAAI;QACtB,cAAc,EAAE,GAAG,CAAC,MAAM;QAC1B,cAAc,EAAE,GAAG,CAAC,MAAM;QAC1B,YAAY,EAAE,GAAG,CAAC,IAAI;QACtB,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrC,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -1,9 +1,49 @@
1
1
  import { run } from "../lib/exec.js";
2
+ import { readProcFile } from "../lib/parse.js";
3
+ function parseMounts() {
4
+ const raw = readProcFile("/proc/mounts") || "";
5
+ const result = [];
6
+ for (const line of raw.split("\n")) {
7
+ const parts = line.split(" ");
8
+ if (parts.length < 4)
9
+ continue;
10
+ result.push({
11
+ device: parts[0],
12
+ mount: parts[1],
13
+ fstype: parts[2],
14
+ options: parts[3],
15
+ });
16
+ }
17
+ return result;
18
+ }
2
19
  export async function collectDisks() {
3
20
  const dfOutput = await run("df", ["-B1", "--output=source,target,size,used,avail,pcent", "-x", "tmpfs", "-x", "devtmpfs", "-x", "squashfs"]);
4
21
  if (!dfOutput)
5
22
  return [];
6
- const lines = dfOutput.trim().split("\n").slice(1); // skip header
23
+ // Get inode data (df -i without --output, parse standard columns)
24
+ const dfInodeOutput = await run("df", ["-i", "-x", "tmpfs", "-x", "devtmpfs", "-x", "squashfs"]);
25
+ const inodeMap = new Map();
26
+ if (dfInodeOutput) {
27
+ // Standard df -i output: Filesystem Inodes IUsed IFree IUse% Mounted_on
28
+ for (const line of dfInodeOutput.trim().split("\n").slice(1)) {
29
+ const parts = line.trim().split(/\s+/);
30
+ if (parts.length < 6)
31
+ continue;
32
+ const mountPoint = parts[5];
33
+ inodeMap.set(mountPoint, {
34
+ total: parseInt(parts[1]) || 0,
35
+ used: parseInt(parts[2]) || 0,
36
+ free: parseInt(parts[3]) || 0,
37
+ });
38
+ }
39
+ }
40
+ // Get mount options and fstype from /proc/mounts
41
+ const mounts = parseMounts();
42
+ const mountMap = new Map();
43
+ for (const m of mounts) {
44
+ mountMap.set(m.mount, m);
45
+ }
46
+ const lines = dfOutput.trim().split("\n").slice(1);
7
47
  const disks = [];
8
48
  for (const line of lines) {
9
49
  const parts = line.trim().split(/\s+/);
@@ -16,9 +56,10 @@ export async function collectDisks() {
16
56
  const availBytes = parseInt(parts[4]) || 0;
17
57
  const pctStr = parts[5].replace("%", "");
18
58
  const percent = parseInt(pctStr) || 0;
19
- // Skip pseudo-filesystems
20
59
  if (!device.startsWith("/dev/"))
21
60
  continue;
61
+ const mountInfo = mountMap.get(mount);
62
+ const inodes = inodeMap.get(mount);
22
63
  disks.push({
23
64
  device,
24
65
  mount,
@@ -26,6 +67,11 @@ export async function collectDisks() {
26
67
  used_gb: Math.round((usedBytes / 1073741824) * 100) / 100,
27
68
  available_gb: Math.round((availBytes / 1073741824) * 100) / 100,
28
69
  percent_used: percent,
70
+ fstype: mountInfo?.fstype,
71
+ options: mountInfo?.options,
72
+ inodes_total: inodes?.total,
73
+ inodes_used: inodes?.used,
74
+ inodes_free: inodes?.free,
29
75
  });
30
76
  }
31
77
  return disks;
@@ -1 +1 @@
1
- {"version":3,"file":"disks.js","sourceRoot":"","sources":["../../src/collect/disks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAGrC,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,8CAA8C,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7I,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;IAClE,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEtC,0BAA0B;QAC1B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QAE1C,KAAK,CAAC,IAAI,CAAC;YACT,MAAM;YACN,KAAK;YACL,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YAC3D,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACzD,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YAC/D,YAAY,EAAE,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"disks.js","sourceRoot":"","sources":["../../src/collect/disks.ts"],"names":[],"mappings":"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"}