@profullstack/hqtui-demo 0.1.2 → 0.1.3

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 (44) hide show
  1. package/README.md +51 -8
  2. package/dist/main.js +34 -11
  3. package/dist/main.js.map +1 -1
  4. package/dist/screens/index.js +4 -0
  5. package/dist/screens/index.js.map +1 -1
  6. package/dist/screens/network.js +86 -0
  7. package/dist/screens/network.js.map +1 -0
  8. package/dist/screens/services.js +121 -0
  9. package/dist/screens/services.js.map +1 -0
  10. package/dist/screens/sessions.js +80 -0
  11. package/dist/screens/sessions.js.map +1 -0
  12. package/dist/screens/traffic.js +183 -0
  13. package/dist/screens/traffic.js.map +1 -0
  14. package/dist/simulation.js +6 -0
  15. package/dist/simulation.js.map +1 -1
  16. package/dist/state.js +4 -1
  17. package/dist/state.js.map +1 -1
  18. package/dist/system/common.js +2 -0
  19. package/dist/system/common.js.map +1 -1
  20. package/dist/system/linux-telemetry.js +420 -0
  21. package/dist/system/linux-telemetry.js.map +1 -0
  22. package/dist/system/linux-traffic.js +282 -0
  23. package/dist/system/linux-traffic.js.map +1 -0
  24. package/dist/system/linux.js +90 -26
  25. package/dist/system/linux.js.map +1 -1
  26. package/dist/system/simulated-telemetry.js +267 -0
  27. package/dist/system/simulated-telemetry.js.map +1 -0
  28. package/dist/system/telemetry.js +44 -0
  29. package/dist/system/telemetry.js.map +1 -0
  30. package/package.json +4 -3
  31. package/src/main.ts +26 -11
  32. package/src/screens/index.ts +4 -0
  33. package/src/screens/network.ts +91 -0
  34. package/src/screens/services.ts +136 -0
  35. package/src/screens/sessions.ts +85 -0
  36. package/src/screens/traffic.ts +199 -0
  37. package/src/simulation.ts +12 -0
  38. package/src/state.ts +7 -2
  39. package/src/system/common.ts +2 -0
  40. package/src/system/linux-telemetry.ts +431 -0
  41. package/src/system/linux-traffic.ts +375 -0
  42. package/src/system/linux.ts +95 -21
  43. package/src/system/simulated-telemetry.ts +280 -0
  44. package/src/system/telemetry.ts +263 -0
@@ -0,0 +1,420 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import { sh, push } from "./common.js";
4
+ async function read(path) {
5
+ try {
6
+ return await readFile(path, "utf8");
7
+ }
8
+ catch {
9
+ return "";
10
+ }
11
+ }
12
+ /** `who -u`: who is logged in right now, and how idle they are. */
13
+ export async function sessions() {
14
+ const text = await sh("who", ["-u"]);
15
+ if (!text)
16
+ return [];
17
+ return text.trim().split("\n").filter(Boolean).map((line) => {
18
+ const parts = line.trim().split(/\s+/);
19
+ return {
20
+ user: parts[0] ?? "-",
21
+ tty: parts[1] ?? "-",
22
+ loginAt: `${parts[2] ?? ""} ${parts[3] ?? ""}`.trim(),
23
+ idle: parts[4] ?? ".",
24
+ what: parts[5] ?? "",
25
+ // `who -u` puts the origin host in parentheses at the end when there is one.
26
+ from: /\(([^)]+)\)/.exec(line)?.[1] ?? "local",
27
+ };
28
+ });
29
+ }
30
+ function parseLastLine(line, status) {
31
+ if (!line.trim() || /^(wtmp|btmp|reboot|$)/.test(line))
32
+ return null;
33
+ const parts = line.trim().split(/\s+/);
34
+ if (parts.length < 4)
35
+ return null;
36
+ const stillLoggedIn = /still logged in/.test(line);
37
+ return {
38
+ user: parts[0],
39
+ tty: parts[1],
40
+ from: /^\d+\.\d+\.\d+\.\d+$/.test(parts[2]) || parts[2].includes(".") ? parts[2] : "local",
41
+ when: parts.slice(-7, -3).join(" ") || parts.slice(3, 7).join(" "),
42
+ status: stillLoggedIn ? "still" : status,
43
+ };
44
+ }
45
+ /** Successful logins from wtmp. */
46
+ export async function logins(limit = 20) {
47
+ const text = await sh("last", ["-n", String(limit), "-w"]);
48
+ if (!text)
49
+ return [];
50
+ return text.split("\n").map((l) => parseLastLine(l, "ok")).filter((e) => e !== null);
51
+ }
52
+ /** Failed logins from btmp. Usually root-only, so an empty list is normal. */
53
+ export async function failedLogins(limit = 15) {
54
+ const text = await sh("lastb", ["-n", String(limit), "-w"]);
55
+ if (!text)
56
+ return [];
57
+ return text.split("\n").map((l) => parseLastLine(l, "failed")).filter((e) => e !== null);
58
+ }
59
+ function splitAddress(address) {
60
+ const index = address.lastIndexOf(":");
61
+ if (index === -1)
62
+ return { host: address, port: "" };
63
+ return { host: address.slice(0, index), port: address.slice(index + 1) };
64
+ }
65
+ /** `ss -tunap`: established connections and listening sockets. */
66
+ export async function sockets() {
67
+ const text = await sh("ss", ["-tunap"]);
68
+ if (!text)
69
+ return { connections: [], listeners: [] };
70
+ const connections = [];
71
+ const listeners = [];
72
+ for (const line of text.trim().split("\n").slice(1)) {
73
+ const parts = line.trim().split(/\s+/);
74
+ if (parts.length < 5)
75
+ continue;
76
+ const [proto, state, , , local, remote] = parts;
77
+ const process = /users:\(\("([^"]+)",pid=(\d+)/.exec(line);
78
+ const label = process ? `${process[1]}/${process[2]}` : "-";
79
+ if (state === "LISTEN") {
80
+ const { host, port } = splitAddress(local);
81
+ listeners.push({ proto, address: host, port, process: label });
82
+ }
83
+ else if (state === "ESTAB" || proto.startsWith("udp")) {
84
+ connections.push({ proto, local, remote: remote ?? "-", state, process: label });
85
+ }
86
+ }
87
+ return { connections, listeners };
88
+ }
89
+ /** systemd units that are loaded, with failures first. */
90
+ export async function services(limit = 60) {
91
+ const text = await sh("systemctl", [
92
+ "list-units", "--type=service", "--all", "--no-pager", "--no-legend", "--plain",
93
+ ]);
94
+ if (!text)
95
+ return [];
96
+ const units = text.trim().split("\n").map((line) => {
97
+ const parts = line.trim().split(/\s+/);
98
+ if (parts.length < 4)
99
+ return null;
100
+ return {
101
+ name: parts[0].replace(/\.service$/, ""),
102
+ active: parts[2],
103
+ sub: parts[3],
104
+ description: parts.slice(4).join(" "),
105
+ };
106
+ }).filter((u) => u !== null);
107
+ const rank = (unit) => unit.active === "failed" ? 0 : unit.active === "active" ? 1 : 2;
108
+ units.sort((a, b) => rank(a) - rank(b) || a.name.localeCompare(b.name));
109
+ return units.slice(0, limit);
110
+ }
111
+ /** Running docker containers, when docker is reachable without a password. */
112
+ export async function containers() {
113
+ const text = await sh("docker", [
114
+ "ps", "--no-trunc", "--format", "{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}",
115
+ ], 3000);
116
+ if (!text)
117
+ return [];
118
+ return text.trim().split("\n").filter(Boolean).map((line) => {
119
+ const [id, name, image, status] = line.split("\t");
120
+ return { id: (id ?? "").slice(0, 12), name: name ?? "-", image: image ?? "-", status: status ?? "-", cpu: "-", memory: "-" };
121
+ });
122
+ }
123
+ const previousInterfaces = {};
124
+ /** Every network interface with its own throughput history. */
125
+ export async function interfaces(dt, history) {
126
+ const netdev = await read("/proc/net/dev");
127
+ if (!netdev)
128
+ return [];
129
+ const addresses = os.networkInterfaces();
130
+ const out = [];
131
+ for (const line of netdev.split("\n").slice(2)) {
132
+ const match = /^\s*([\w.@-]+):\s*(.*)$/.exec(line);
133
+ if (!match)
134
+ continue;
135
+ const name = match[1];
136
+ if (name === "lo")
137
+ continue;
138
+ const values = match[2].trim().split(/\s+/).map(Number);
139
+ const [rxBytes, , rxErrs, rxDrop] = values;
140
+ const txBytes = values[8];
141
+ const txErrs = values[10] ?? 0;
142
+ const txDrop = values[11] ?? 0;
143
+ const previous = previousInterfaces[name];
144
+ const rxRate = previous && rxBytes >= previous[0] ? (rxBytes - previous[0]) / dt : 0;
145
+ const txRate = previous && txBytes >= previous[1] ? (txBytes - previous[1]) / dt : 0;
146
+ previousInterfaces[name] = [rxBytes, txBytes];
147
+ const address = (addresses[name] ?? []).find((a) => a.family === "IPv4");
148
+ const existing = history.get(name);
149
+ const entry = {
150
+ name,
151
+ ip: address?.address ?? "-",
152
+ mac: address?.mac ?? "-",
153
+ state: (await read(`/sys/class/net/${name}/operstate`)).trim() || "unknown",
154
+ mtu: Number((await read(`/sys/class/net/${name}/mtu`)).trim()) || 0,
155
+ rxRate,
156
+ txRate,
157
+ rxTotal: rxBytes,
158
+ txTotal: txBytes,
159
+ rxHistory: existing?.rxHistory ?? [],
160
+ txHistory: existing?.txHistory ?? [],
161
+ errors: (rxErrs ?? 0) + txErrs,
162
+ drops: (rxDrop ?? 0) + txDrop,
163
+ };
164
+ push(entry.rxHistory, rxRate);
165
+ push(entry.txHistory, txRate);
166
+ history.set(name, entry);
167
+ out.push(entry);
168
+ }
169
+ return out;
170
+ }
171
+ /** Mounted filesystems with capacity and inode usage. */
172
+ export async function filesystems() {
173
+ const [sizes, inodes] = await Promise.all([
174
+ sh("df", ["-kPT", "-x", "tmpfs", "-x", "devtmpfs", "-x", "squashfs", "-x", "overlay"]),
175
+ sh("df", ["-iP", "-x", "tmpfs", "-x", "devtmpfs", "-x", "squashfs", "-x", "overlay"]),
176
+ ]);
177
+ if (!sizes)
178
+ return [];
179
+ const inodeByMount = new Map();
180
+ for (const line of inodes.trim().split("\n").slice(1)) {
181
+ const parts = line.trim().split(/\s+/);
182
+ if (parts.length < 6)
183
+ continue;
184
+ inodeByMount.set(parts[parts.length - 1], [Number(parts[2]), Number(parts[1])]);
185
+ }
186
+ return sizes.trim().split("\n").slice(1).map((line) => {
187
+ const parts = line.trim().split(/\s+/);
188
+ if (parts.length < 7)
189
+ return null;
190
+ const mount = parts[parts.length - 1];
191
+ const [inodesUsed, inodesTotal] = inodeByMount.get(mount) ?? [0, 0];
192
+ return {
193
+ device: parts[0],
194
+ type: parts[1],
195
+ size: Number(parts[2]) * 1024,
196
+ used: Number(parts[3]) * 1024,
197
+ mount,
198
+ inodesUsed,
199
+ inodesTotal,
200
+ };
201
+ }).filter((f) => f !== null).slice(0, 8);
202
+ }
203
+ let previousKernel = null;
204
+ /** Kernel counters: context switches, interrupts, forks, entropy, fd usage. */
205
+ export async function kernel(dt) {
206
+ const [stat, vmstat, entropy, fileNr] = await Promise.all([
207
+ read("/proc/stat"),
208
+ read("/proc/vmstat"),
209
+ read("/proc/sys/kernel/random/entropy_avail"),
210
+ read("/proc/sys/fs/file-nr"),
211
+ ]);
212
+ const number = (source, pattern) => Number(pattern.exec(source)?.[1] ?? 0);
213
+ const ctxt = number(stat, /^ctxt (\d+)/m);
214
+ const intr = Number(/^intr (\d+)/m.exec(stat)?.[1] ?? 0);
215
+ const forks = number(stat, /^processes (\d+)/m);
216
+ let contextSwitchRate = 0;
217
+ let interruptRate = 0;
218
+ let forkRate = 0;
219
+ if (previousKernel && dt > 0) {
220
+ contextSwitchRate = Math.max(0, (ctxt - previousKernel.ctxt) / dt);
221
+ interruptRate = Math.max(0, (intr - previousKernel.intr) / dt);
222
+ forkRate = Math.max(0, (forks - previousKernel.forks) / dt);
223
+ }
224
+ previousKernel = { ctxt, intr, forks, at: Date.now() };
225
+ const fd = fileNr.trim().split(/\s+/).map(Number);
226
+ return {
227
+ contextSwitches: ctxt,
228
+ contextSwitchRate,
229
+ interrupts: intr,
230
+ interruptRate,
231
+ forks,
232
+ forkRate,
233
+ procsRunning: number(stat, /^procs_running (\d+)/m),
234
+ procsBlocked: number(stat, /^procs_blocked (\d+)/m),
235
+ entropy: Number(entropy.trim()) || 0,
236
+ openFiles: fd[0] ?? 0,
237
+ maxFiles: fd[2] ?? 0,
238
+ bootTime: number(stat, /^btime (\d+)/m),
239
+ pageIn: number(vmstat, /^pgpgin (\d+)/m),
240
+ pageOut: number(vmstat, /^pgpgout (\d+)/m),
241
+ swapIn: number(vmstat, /^pswpin (\d+)/m),
242
+ swapOut: number(vmstat, /^pswpout (\d+)/m),
243
+ };
244
+ }
245
+ /** Temperatures from hwmon and, when that is empty, the thermal zones. */
246
+ export async function temperatures() {
247
+ const out = [];
248
+ try {
249
+ for (const chip of await readdir("/sys/class/hwmon")) {
250
+ const base = `/sys/class/hwmon/${chip}`;
251
+ const name = (await read(`${base}/name`)).trim();
252
+ for (const entry of await readdir(base).catch(() => [])) {
253
+ if (!/^temp\d+_input$/.test(entry))
254
+ continue;
255
+ const value = Number(await read(`${base}/${entry}`)) / 1000;
256
+ if (!Number.isFinite(value) || value <= 0 || value > 150)
257
+ continue;
258
+ const label = (await read(`${base}/${entry.replace("_input", "_label")}`)).trim();
259
+ const max = Number(await read(`${base}/${entry.replace("_input", "_crit")}`)) / 1000;
260
+ out.push({
261
+ label: label || `${name} ${entry.replace("_input", "")}`,
262
+ value,
263
+ max: Number.isFinite(max) && max > 0 ? max : 100,
264
+ });
265
+ }
266
+ }
267
+ }
268
+ catch {
269
+ // No hwmon: containers and most VMs.
270
+ }
271
+ // Thermal zones are present on many machines that expose no hwmon at all.
272
+ if (out.length === 0) {
273
+ try {
274
+ for (const zone of await readdir("/sys/class/thermal")) {
275
+ if (!zone.startsWith("thermal_zone"))
276
+ continue;
277
+ const value = Number(await read(`/sys/class/thermal/${zone}/temp`)) / 1000;
278
+ if (!Number.isFinite(value) || value <= 0 || value > 150)
279
+ continue;
280
+ const type = (await read(`/sys/class/thermal/${zone}/type`)).trim();
281
+ out.push({ label: type || zone, value, max: 100 });
282
+ }
283
+ }
284
+ catch {
285
+ // Neither interface exists; the UI reports temperatures as unavailable.
286
+ }
287
+ }
288
+ return out.slice(0, 12);
289
+ }
290
+ /** GPU stats, when the NVIDIA tools are installed. */
291
+ export async function gpus() {
292
+ const text = await sh("nvidia-smi", [
293
+ "--query-gpu=name,utilization.gpu,memory.used,memory.total,temperature.gpu,power.draw",
294
+ "--format=csv,noheader,nounits",
295
+ ], 3000);
296
+ if (!text)
297
+ return [];
298
+ return text.trim().split("\n").filter(Boolean).map((line) => {
299
+ const [name, utilization, used, total, temperature, power] = line.split(",").map((v) => v.trim());
300
+ return {
301
+ name,
302
+ utilization: Number(utilization) / 100,
303
+ memoryUsed: Number(used) * 1024 ** 2,
304
+ memoryTotal: Number(total) * 1024 ** 2,
305
+ temperature: Number(temperature),
306
+ power: Number(power),
307
+ };
308
+ });
309
+ }
310
+ /** Battery and AC state from /sys/class/power_supply. */
311
+ export async function power() {
312
+ try {
313
+ const supplies = await readdir("/sys/class/power_supply");
314
+ let battery = null;
315
+ let acConnected = false;
316
+ for (const supply of supplies) {
317
+ const base = `/sys/class/power_supply/${supply}`;
318
+ const type = (await read(`${base}/type`)).trim();
319
+ if (type === "Mains") {
320
+ acConnected = (await read(`${base}/online`)).trim() === "1";
321
+ continue;
322
+ }
323
+ if (type !== "Battery")
324
+ continue;
325
+ const capacity = Number((await read(`${base}/capacity`)).trim());
326
+ const status = (await read(`${base}/status`)).trim();
327
+ const currentNow = Number((await read(`${base}/current_now`)).trim());
328
+ const voltageNow = Number((await read(`${base}/voltage_now`)).trim());
329
+ battery = {
330
+ battery: Number.isFinite(capacity) ? capacity : 0,
331
+ charging: status === "Charging",
332
+ timeRemaining: status,
333
+ powerDraw: Number.isFinite(currentNow * voltageNow) ? (currentNow * voltageNow) / 1e12 : 0,
334
+ acConnected,
335
+ };
336
+ }
337
+ if (battery)
338
+ battery.acConnected = acConnected;
339
+ return battery;
340
+ }
341
+ catch {
342
+ return null;
343
+ }
344
+ }
345
+ const LEVELS = ["EMERG", "ALERT", "CRIT", "ERROR", "WARN", "NOTICE", "INFO", "DEBUG"];
346
+ /** Recent journald entries, falling back to syslog and then dmesg. */
347
+ export async function journal(limit = 60) {
348
+ const text = await sh("journalctl", [
349
+ "-n", String(limit), "--no-pager", "--output=json", "--output-fields=MESSAGE,PRIORITY,_SYSTEMD_UNIT,SYSLOG_IDENTIFIER",
350
+ ], 5000);
351
+ if (text) {
352
+ const entries = [];
353
+ for (const line of text.trim().split("\n")) {
354
+ if (!line.startsWith("{"))
355
+ continue;
356
+ try {
357
+ const row = JSON.parse(line);
358
+ const micros = Number(row.__REALTIME_TIMESTAMP ?? 0);
359
+ const time = micros
360
+ ? new Date(micros / 1000).toTimeString().slice(0, 8)
361
+ : new Date().toTimeString().slice(0, 8);
362
+ entries.push({
363
+ time,
364
+ level: LEVELS[Number(row.PRIORITY ?? 6)] ?? "INFO",
365
+ unit: (row._SYSTEMD_UNIT ?? row.SYSLOG_IDENTIFIER ?? "-").replace(/\.service$/, ""),
366
+ message: String(row.MESSAGE ?? "").slice(0, 200),
367
+ });
368
+ }
369
+ catch {
370
+ // Skip malformed lines rather than losing the whole log.
371
+ }
372
+ }
373
+ if (entries.length)
374
+ return entries;
375
+ }
376
+ for (const path of ["/var/log/syslog", "/var/log/messages"]) {
377
+ const raw = await read(path);
378
+ if (!raw)
379
+ continue;
380
+ return raw.trim().split("\n").slice(-limit).map((line) => {
381
+ const match = /^(\w+\s+\d+\s+[\d:]+)\s+\S+\s+([^:[]+)/.exec(line);
382
+ return {
383
+ time: (match?.[1] ?? "").slice(-8),
384
+ level: /error|fail/i.test(line) ? "ERROR" : /warn/i.test(line) ? "WARN" : "INFO",
385
+ unit: (match?.[2] ?? "system").trim(),
386
+ message: line.slice(match?.[0]?.length ?? 0).replace(/^[:\s]+/, "").slice(0, 200),
387
+ };
388
+ });
389
+ }
390
+ const dmesg = await sh("dmesg", ["--time-format", "iso", "-l", "err,warn,info"], 3000);
391
+ if (!dmesg)
392
+ return [];
393
+ return dmesg.trim().split("\n").slice(-limit).map((line) => ({
394
+ time: (/T(\d{2}:\d{2}:\d{2})/.exec(line)?.[1]) ?? "",
395
+ level: /error/i.test(line) ? "ERROR" : /warn/i.test(line) ? "WARN" : "INFO",
396
+ unit: "kernel",
397
+ message: line.replace(/^\S+\s+/, "").slice(0, 200),
398
+ }));
399
+ }
400
+ /** Process counts by state, straight from /proc. */
401
+ export async function processStates() {
402
+ const text = await sh("ps", ["-eo", "state", "--no-headers"]);
403
+ const states = { running: 0, sleeping: 0, stopped: 0, zombie: 0, total: 0 };
404
+ if (!text)
405
+ return states;
406
+ for (const raw of text.trim().split("\n")) {
407
+ const state = raw.trim()[0];
408
+ states.total++;
409
+ if (state === "R")
410
+ states.running++;
411
+ else if (state === "S" || state === "D" || state === "I")
412
+ states.sleeping++;
413
+ else if (state === "T" || state === "t")
414
+ states.stopped++;
415
+ else if (state === "Z")
416
+ states.zombie++;
417
+ }
418
+ return states;
419
+ }
420
+ //# sourceMappingURL=linux-telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-telemetry.js","sourceRoot":"","sources":["../../src/system/linux-telemetry.ts"],"names":[],"mappings":"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"}