@sonde/packs 0.0.0

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 (153) hide show
  1. package/dist/docker/index.d.ts +3 -0
  2. package/dist/docker/index.d.ts.map +1 -0
  3. package/dist/docker/index.js +15 -0
  4. package/dist/docker/index.js.map +1 -0
  5. package/dist/docker/manifest.d.ts +3 -0
  6. package/dist/docker/manifest.d.ts.map +1 -0
  7. package/dist/docker/manifest.js +54 -0
  8. package/dist/docker/manifest.js.map +1 -0
  9. package/dist/docker/probes/containers-list.d.ts +19 -0
  10. package/dist/docker/probes/containers-list.d.ts.map +1 -0
  11. package/dist/docker/probes/containers-list.js +25 -0
  12. package/dist/docker/probes/containers-list.js.map +1 -0
  13. package/dist/docker/probes/containers-list.test.d.ts +2 -0
  14. package/dist/docker/probes/containers-list.test.d.ts.map +1 -0
  15. package/dist/docker/probes/containers-list.test.js +43 -0
  16. package/dist/docker/probes/containers-list.test.js.map +1 -0
  17. package/dist/docker/probes/daemon-info.d.ts +16 -0
  18. package/dist/docker/probes/daemon-info.d.ts.map +1 -0
  19. package/dist/docker/probes/daemon-info.js +20 -0
  20. package/dist/docker/probes/daemon-info.js.map +1 -0
  21. package/dist/docker/probes/daemon-info.test.d.ts +2 -0
  22. package/dist/docker/probes/daemon-info.test.d.ts.map +1 -0
  23. package/dist/docker/probes/daemon-info.test.js +42 -0
  24. package/dist/docker/probes/daemon-info.test.js.map +1 -0
  25. package/dist/docker/probes/images-list.d.ts +17 -0
  26. package/dist/docker/probes/images-list.d.ts.map +1 -0
  27. package/dist/docker/probes/images-list.js +23 -0
  28. package/dist/docker/probes/images-list.js.map +1 -0
  29. package/dist/docker/probes/images-list.test.d.ts +2 -0
  30. package/dist/docker/probes/images-list.test.d.ts.map +1 -0
  31. package/dist/docker/probes/images-list.test.js +41 -0
  32. package/dist/docker/probes/images-list.test.js.map +1 -0
  33. package/dist/docker/probes/logs-tail.d.ts +12 -0
  34. package/dist/docker/probes/logs-tail.d.ts.map +1 -0
  35. package/dist/docker/probes/logs-tail.js +22 -0
  36. package/dist/docker/probes/logs-tail.js.map +1 -0
  37. package/dist/docker/probes/logs-tail.test.d.ts +2 -0
  38. package/dist/docker/probes/logs-tail.test.d.ts.map +1 -0
  39. package/dist/docker/probes/logs-tail.test.js +42 -0
  40. package/dist/docker/probes/logs-tail.test.js.map +1 -0
  41. package/dist/index.d.ts +9 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +15 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/system/index.d.ts +3 -0
  46. package/dist/system/index.d.ts.map +1 -0
  47. package/dist/system/index.js +13 -0
  48. package/dist/system/index.js.map +1 -0
  49. package/dist/system/manifest.d.ts +3 -0
  50. package/dist/system/manifest.d.ts.map +1 -0
  51. package/dist/system/manifest.js +39 -0
  52. package/dist/system/manifest.js.map +1 -0
  53. package/dist/system/probes/cpu-usage.d.ts +14 -0
  54. package/dist/system/probes/cpu-usage.d.ts.map +1 -0
  55. package/dist/system/probes/cpu-usage.js +20 -0
  56. package/dist/system/probes/cpu-usage.js.map +1 -0
  57. package/dist/system/probes/cpu-usage.test.d.ts +2 -0
  58. package/dist/system/probes/cpu-usage.test.d.ts.map +1 -0
  59. package/dist/system/probes/cpu-usage.test.js +45 -0
  60. package/dist/system/probes/cpu-usage.test.js.map +1 -0
  61. package/dist/system/probes/disk-usage.d.ts +19 -0
  62. package/dist/system/probes/disk-usage.d.ts.map +1 -0
  63. package/dist/system/probes/disk-usage.js +34 -0
  64. package/dist/system/probes/disk-usage.js.map +1 -0
  65. package/dist/system/probes/disk-usage.test.d.ts +2 -0
  66. package/dist/system/probes/disk-usage.test.d.ts.map +1 -0
  67. package/dist/system/probes/disk-usage.test.js +62 -0
  68. package/dist/system/probes/disk-usage.test.js.map +1 -0
  69. package/dist/system/probes/memory-usage.d.ts +19 -0
  70. package/dist/system/probes/memory-usage.d.ts.map +1 -0
  71. package/dist/system/probes/memory-usage.js +46 -0
  72. package/dist/system/probes/memory-usage.js.map +1 -0
  73. package/dist/system/probes/memory-usage.test.d.ts +2 -0
  74. package/dist/system/probes/memory-usage.test.d.ts.map +1 -0
  75. package/dist/system/probes/memory-usage.test.js +50 -0
  76. package/dist/system/probes/memory-usage.test.js.map +1 -0
  77. package/dist/systemd/index.d.ts +3 -0
  78. package/dist/systemd/index.d.ts.map +1 -0
  79. package/dist/systemd/index.js +13 -0
  80. package/dist/systemd/index.js.map +1 -0
  81. package/dist/systemd/manifest.d.ts +3 -0
  82. package/dist/systemd/manifest.d.ts.map +1 -0
  83. package/dist/systemd/manifest.js +51 -0
  84. package/dist/systemd/manifest.js.map +1 -0
  85. package/dist/systemd/probes/journal-query.d.ts +19 -0
  86. package/dist/systemd/probes/journal-query.d.ts.map +1 -0
  87. package/dist/systemd/probes/journal-query.js +37 -0
  88. package/dist/systemd/probes/journal-query.js.map +1 -0
  89. package/dist/systemd/probes/journal-query.test.d.ts +2 -0
  90. package/dist/systemd/probes/journal-query.test.d.ts.map +1 -0
  91. package/dist/systemd/probes/journal-query.test.js +50 -0
  92. package/dist/systemd/probes/journal-query.test.js.map +1 -0
  93. package/dist/systemd/probes/service-status.d.ts +16 -0
  94. package/dist/systemd/probes/service-status.d.ts.map +1 -0
  95. package/dist/systemd/probes/service-status.js +29 -0
  96. package/dist/systemd/probes/service-status.js.map +1 -0
  97. package/dist/systemd/probes/service-status.test.d.ts +2 -0
  98. package/dist/systemd/probes/service-status.test.d.ts.map +1 -0
  99. package/dist/systemd/probes/service-status.test.js +48 -0
  100. package/dist/systemd/probes/service-status.test.js.map +1 -0
  101. package/dist/systemd/probes/services-list.d.ts +18 -0
  102. package/dist/systemd/probes/services-list.d.ts.map +1 -0
  103. package/dist/systemd/probes/services-list.js +29 -0
  104. package/dist/systemd/probes/services-list.js.map +1 -0
  105. package/dist/systemd/probes/services-list.test.d.ts +2 -0
  106. package/dist/systemd/probes/services-list.test.d.ts.map +1 -0
  107. package/dist/systemd/probes/services-list.test.js +61 -0
  108. package/dist/systemd/probes/services-list.test.js.map +1 -0
  109. package/dist/types.d.ts +11 -0
  110. package/dist/types.d.ts.map +1 -0
  111. package/dist/types.js +2 -0
  112. package/dist/types.js.map +1 -0
  113. package/dist/validation.d.ts +16 -0
  114. package/dist/validation.d.ts.map +1 -0
  115. package/dist/validation.js +44 -0
  116. package/dist/validation.js.map +1 -0
  117. package/dist/validation.test.d.ts +2 -0
  118. package/dist/validation.test.d.ts.map +1 -0
  119. package/dist/validation.test.js +76 -0
  120. package/dist/validation.test.js.map +1 -0
  121. package/package.json +26 -0
  122. package/src/docker/index.ts +16 -0
  123. package/src/docker/manifest.ts +55 -0
  124. package/src/docker/probes/containers-list.test.ts +50 -0
  125. package/src/docker/probes/containers-list.ts +42 -0
  126. package/src/docker/probes/daemon-info.test.ts +48 -0
  127. package/src/docker/probes/daemon-info.ts +33 -0
  128. package/src/docker/probes/images-list.test.ts +48 -0
  129. package/src/docker/probes/images-list.ts +39 -0
  130. package/src/docker/probes/logs-tail.test.ts +51 -0
  131. package/src/docker/probes/logs-tail.ts +32 -0
  132. package/src/index.ts +18 -0
  133. package/src/system/index.ts +14 -0
  134. package/src/system/manifest.ts +40 -0
  135. package/src/system/probes/cpu-usage.test.ts +55 -0
  136. package/src/system/probes/cpu-usage.ts +30 -0
  137. package/src/system/probes/disk-usage.test.ts +73 -0
  138. package/src/system/probes/disk-usage.ts +53 -0
  139. package/src/system/probes/memory-usage.test.ts +58 -0
  140. package/src/system/probes/memory-usage.ts +63 -0
  141. package/src/systemd/index.ts +14 -0
  142. package/src/systemd/manifest.ts +52 -0
  143. package/src/systemd/probes/journal-query.test.ts +64 -0
  144. package/src/systemd/probes/journal-query.ts +56 -0
  145. package/src/systemd/probes/service-status.test.ts +59 -0
  146. package/src/systemd/probes/service-status.ts +42 -0
  147. package/src/systemd/probes/services-list.test.ts +68 -0
  148. package/src/systemd/probes/services-list.ts +45 -0
  149. package/src/types.ts +16 -0
  150. package/src/validation.test.ts +86 -0
  151. package/src/validation.ts +52 -0
  152. package/tsconfig.json +11 -0
  153. package/vitest.config.ts +8 -0
@@ -0,0 +1,39 @@
1
+ export const systemManifest = {
2
+ name: 'system',
3
+ version: '0.1.0',
4
+ description: 'Basic system metrics: disk usage, memory usage, CPU load',
5
+ requires: {
6
+ groups: [],
7
+ files: [],
8
+ commands: ['df'],
9
+ },
10
+ probes: [
11
+ {
12
+ name: 'disk.usage',
13
+ description: 'Disk usage per mounted filesystem',
14
+ capability: 'observe',
15
+ timeout: 10_000,
16
+ },
17
+ {
18
+ name: 'memory.usage',
19
+ description: 'System memory and swap usage',
20
+ capability: 'observe',
21
+ timeout: 10_000,
22
+ },
23
+ {
24
+ name: 'cpu.usage',
25
+ description: 'CPU load averages and core count',
26
+ capability: 'observe',
27
+ timeout: 10_000,
28
+ },
29
+ ],
30
+ runbook: {
31
+ category: 'system',
32
+ probes: ['disk.usage', 'memory.usage', 'cpu.usage'],
33
+ parallel: true,
34
+ },
35
+ detect: {
36
+ files: ['/proc/loadavg'],
37
+ },
38
+ };
39
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/system/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,0DAA0D;IACvE,QAAQ,EAAE;QACR,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,CAAC,IAAI,CAAC;KACjB;IACD,MAAM,EAAE;QACN;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,mCAAmC;YAChD,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,MAAM;SAChB;QACD;YACE,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,8BAA8B;YAC3C,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,MAAM;SAChB;QACD;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,kCAAkC;YAC/C,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,MAAM;SAChB;KACF;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,WAAW,CAAC;QACnD,QAAQ,EAAE,IAAI;KACf;IACD,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,eAAe,CAAC;KACzB;CACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ProbeHandler } from '../../types.js';
2
+ export interface CpuUsageResult {
3
+ loadAvg1: number;
4
+ loadAvg5: number;
5
+ loadAvg15: number;
6
+ cpuCount: number;
7
+ }
8
+ /**
9
+ * Reads /proc/loadavg for load averages and `nproc` for CPU count.
10
+ * Returns load averages and core count so consumers can compute utilization.
11
+ */
12
+ export declare const cpuUsage: ProbeHandler;
13
+ export declare function parseLoadAvg(loadAvgRaw: string, nprocRaw: string): CpuUsageResult;
14
+ //# sourceMappingURL=cpu-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpu-usage.d.ts","sourceRoot":"","sources":["../../../src/system/probes/cpu-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,YAMtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAQjF"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Reads /proc/loadavg for load averages and `nproc` for CPU count.
3
+ * Returns load averages and core count so consumers can compute utilization.
4
+ */
5
+ export const cpuUsage = async (_params, exec) => {
6
+ const [loadAvgRaw, nprocRaw] = await Promise.all([
7
+ exec('cat', ['/proc/loadavg']),
8
+ exec('nproc', []),
9
+ ]);
10
+ return parseLoadAvg(loadAvgRaw, nprocRaw);
11
+ };
12
+ export function parseLoadAvg(loadAvgRaw, nprocRaw) {
13
+ const parts = loadAvgRaw.trim().split(/\s+/);
14
+ const loadAvg1 = Number(parts[0]);
15
+ const loadAvg5 = Number(parts[1]);
16
+ const loadAvg15 = Number(parts[2]);
17
+ const cpuCount = Number.parseInt(nprocRaw.trim(), 10);
18
+ return { loadAvg1, loadAvg5, loadAvg15, cpuCount };
19
+ }
20
+ //# sourceMappingURL=cpu-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpu-usage.js","sourceRoot":"","sources":["../../../src/system/probes/cpu-usage.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAiB,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5D,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;KAClB,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,QAAgB;IAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAEtD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cpu-usage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpu-usage.test.d.ts","sourceRoot":"","sources":["../../../src/system/probes/cpu-usage.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { cpuUsage, parseLoadAvg } from './cpu-usage.js';
3
+ describe('parseLoadAvg', () => {
4
+ it('parses /proc/loadavg and nproc output', () => {
5
+ const result = parseLoadAvg('1.52 0.89 0.65 2/345 12345\n', '4\n');
6
+ expect(result.loadAvg1).toBeCloseTo(1.52);
7
+ expect(result.loadAvg5).toBeCloseTo(0.89);
8
+ expect(result.loadAvg15).toBeCloseTo(0.65);
9
+ expect(result.cpuCount).toBe(4);
10
+ });
11
+ it('handles high load values', () => {
12
+ const result = parseLoadAvg('24.50 18.30 12.10 5/1200 99999\n', '8\n');
13
+ expect(result.loadAvg1).toBeCloseTo(24.5);
14
+ expect(result.loadAvg5).toBeCloseTo(18.3);
15
+ expect(result.loadAvg15).toBeCloseTo(12.1);
16
+ expect(result.cpuCount).toBe(8);
17
+ });
18
+ it('handles single CPU', () => {
19
+ const result = parseLoadAvg('0.01 0.02 0.00 1/50 100\n', '1\n');
20
+ expect(result.loadAvg1).toBeCloseTo(0.01);
21
+ expect(result.cpuCount).toBe(1);
22
+ });
23
+ });
24
+ describe('cpuUsage handler', () => {
25
+ it('calls cat /proc/loadavg and nproc, returns parsed result', async () => {
26
+ const calls = [];
27
+ const mockExec = async (cmd, args) => {
28
+ calls.push({ cmd, args });
29
+ if (cmd === 'cat' && args[0] === '/proc/loadavg') {
30
+ return '2.10 1.50 0.90 3/400 54321\n';
31
+ }
32
+ if (cmd === 'nproc') {
33
+ return '16\n';
34
+ }
35
+ throw new Error(`Unexpected command: ${cmd}`);
36
+ };
37
+ const result = (await cpuUsage(undefined, mockExec));
38
+ expect(result.loadAvg1).toBeCloseTo(2.1);
39
+ expect(result.loadAvg5).toBeCloseTo(1.5);
40
+ expect(result.loadAvg15).toBeCloseTo(0.9);
41
+ expect(result.cpuCount).toBe(16);
42
+ expect(calls).toHaveLength(2);
43
+ });
44
+ });
45
+ //# sourceMappingURL=cpu-usage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpu-usage.test.js","sourceRoot":"","sources":["../../../src/system/probes/cpu-usage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ProbeHandler } from '../../types.js';
2
+ export interface FilesystemUsage {
3
+ filesystem: string;
4
+ sizeKb: number;
5
+ usedKb: number;
6
+ availableKb: number;
7
+ usePct: number;
8
+ mountedOn: string;
9
+ }
10
+ export interface DiskUsageResult {
11
+ filesystems: FilesystemUsage[];
12
+ }
13
+ /**
14
+ * Runs `df -kP` and parses the output into structured JSON.
15
+ * `-k` = 1K blocks, `-P` = POSIX portable output format (one line per fs).
16
+ */
17
+ export declare const diskUsage: ProbeHandler;
18
+ export declare function parseDfOutput(stdout: string): DiskUsageResult;
19
+ //# sourceMappingURL=disk-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-usage.d.ts","sourceRoot":"","sources":["../../../src/system/probes/disk-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,YAGvB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CA4B7D"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Runs `df -kP` and parses the output into structured JSON.
3
+ * `-k` = 1K blocks, `-P` = POSIX portable output format (one line per fs).
4
+ */
5
+ export const diskUsage = async (_params, exec) => {
6
+ const stdout = await exec('df', ['-kP']);
7
+ return parseDfOutput(stdout);
8
+ };
9
+ export function parseDfOutput(stdout) {
10
+ const lines = stdout.trim().split('\n');
11
+ // Skip header line
12
+ const dataLines = lines.slice(1);
13
+ const filesystems = [];
14
+ for (const line of dataLines) {
15
+ const parts = line.trim().split(/\s+/);
16
+ if (parts.length < 6)
17
+ continue;
18
+ const [filesystem, sizeStr, usedStr, availStr, pctStr, mountedOn] = parts;
19
+ if (!filesystem || !sizeStr || !usedStr || !availStr || !pctStr || !mountedOn)
20
+ continue;
21
+ // Skip pseudo-filesystems
22
+ if (filesystem === 'tmpfs' || filesystem === 'devtmpfs' || filesystem === 'none')
23
+ continue;
24
+ const sizeKb = Number(sizeStr);
25
+ const usedKb = Number(usedStr);
26
+ const availableKb = Number(availStr);
27
+ const usePct = Number.parseInt(pctStr.replace('%', ''), 10);
28
+ if (Number.isNaN(sizeKb) || Number.isNaN(usedKb))
29
+ continue;
30
+ filesystems.push({ filesystem, sizeKb, usedKb, availableKb, usePct, mountedOn });
31
+ }
32
+ return { filesystems };
33
+ }
34
+ //# sourceMappingURL=disk-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-usage.js","sourceRoot":"","sources":["../../../src/system/probes/disk-usage.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAiB,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,mBAAmB;IACnB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;QAC1E,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS;YAAE,SAAS;QAExF,0BAA0B;QAC1B,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,MAAM;YAAE,SAAS;QAE3F,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAE5D,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,SAAS;QAE3D,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=disk-usage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-usage.test.d.ts","sourceRoot":"","sources":["../../../src/system/probes/disk-usage.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { diskUsage, parseDfOutput } from './disk-usage.js';
3
+ const SAMPLE_DF_OUTPUT = `Filesystem 1024-blocks Used Available Capacity Mounted on
4
+ /dev/sda1 51474044 31285940 17548392 65% /
5
+ /dev/sdb1 103081248 45234112 52579600 47% /data
6
+ tmpfs 8152560 0 8152560 0% /dev/shm
7
+ `;
8
+ describe('parseDfOutput', () => {
9
+ it('parses df -kP output into structured data', () => {
10
+ const result = parseDfOutput(SAMPLE_DF_OUTPUT);
11
+ expect(result.filesystems).toHaveLength(2);
12
+ expect(result.filesystems[0]).toEqual({
13
+ filesystem: '/dev/sda1',
14
+ sizeKb: 51474044,
15
+ usedKb: 31285940,
16
+ availableKb: 17548392,
17
+ usePct: 65,
18
+ mountedOn: '/',
19
+ });
20
+ expect(result.filesystems[1]).toEqual({
21
+ filesystem: '/dev/sdb1',
22
+ sizeKb: 103081248,
23
+ usedKb: 45234112,
24
+ availableKb: 52579600,
25
+ usePct: 47,
26
+ mountedOn: '/data',
27
+ });
28
+ });
29
+ it('filters out tmpfs and devtmpfs', () => {
30
+ const result = parseDfOutput(SAMPLE_DF_OUTPUT);
31
+ const names = result.filesystems.map((f) => f.filesystem);
32
+ expect(names).not.toContain('tmpfs');
33
+ expect(names).not.toContain('devtmpfs');
34
+ });
35
+ it('handles single filesystem output', () => {
36
+ const output = `Filesystem 1024-blocks Used Available Capacity Mounted on
37
+ /dev/vda1 25671908 5432100 19912300 22% /
38
+ `;
39
+ const result = parseDfOutput(output);
40
+ expect(result.filesystems).toHaveLength(1);
41
+ expect(result.filesystems[0]?.usePct).toBe(22);
42
+ });
43
+ it('returns empty array for header-only output', () => {
44
+ const output = `Filesystem 1024-blocks Used Available Capacity Mounted on
45
+ `;
46
+ const result = parseDfOutput(output);
47
+ expect(result.filesystems).toHaveLength(0);
48
+ });
49
+ });
50
+ describe('diskUsage handler', () => {
51
+ it('calls df -kP and returns parsed result', async () => {
52
+ const mockExec = async (cmd, args) => {
53
+ expect(cmd).toBe('df');
54
+ expect(args).toEqual(['-kP']);
55
+ return SAMPLE_DF_OUTPUT;
56
+ };
57
+ const result = (await diskUsage(undefined, mockExec));
58
+ expect(result.filesystems).toHaveLength(2);
59
+ expect(result.filesystems[0]?.mountedOn).toBe('/');
60
+ });
61
+ });
62
+ //# sourceMappingURL=disk-usage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-usage.test.js","sourceRoot":"","sources":["../../../src/system/probes/disk-usage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ProbeHandler } from '../../types.js';
2
+ export interface MemoryUsageResult {
3
+ totalBytes: number;
4
+ usedBytes: number;
5
+ freeBytes: number;
6
+ availableBytes: number;
7
+ swap: {
8
+ totalBytes: number;
9
+ usedBytes: number;
10
+ freeBytes: number;
11
+ };
12
+ }
13
+ /**
14
+ * Runs `free -b` and parses the output into structured JSON.
15
+ * `-b` = output in bytes.
16
+ */
17
+ export declare const memoryUsage: ProbeHandler;
18
+ export declare function parseFreeOutput(stdout: string): MemoryUsageResult;
19
+ //# sourceMappingURL=memory-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-usage.d.ts","sourceRoot":"","sources":["../../../src/system/probes/memory-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,YAGzB,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAuCjE"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Runs `free -b` and parses the output into structured JSON.
3
+ * `-b` = output in bytes.
4
+ */
5
+ export const memoryUsage = async (_params, exec) => {
6
+ const stdout = await exec('free', ['-b']);
7
+ return parseFreeOutput(stdout);
8
+ };
9
+ export function parseFreeOutput(stdout) {
10
+ const lines = stdout.trim().split('\n');
11
+ let totalBytes = 0;
12
+ let usedBytes = 0;
13
+ let freeBytes = 0;
14
+ let availableBytes = 0;
15
+ let swapTotal = 0;
16
+ let swapUsed = 0;
17
+ let swapFree = 0;
18
+ for (const line of lines) {
19
+ const parts = line.trim().split(/\s+/);
20
+ const label = parts[0]?.toLowerCase();
21
+ if (label === 'mem:') {
22
+ totalBytes = Number(parts[1]);
23
+ usedBytes = Number(parts[2]);
24
+ freeBytes = Number(parts[3]);
25
+ // "available" is the last column in modern `free` output
26
+ availableBytes = Number(parts[parts.length - 1]);
27
+ }
28
+ else if (label === 'swap:') {
29
+ swapTotal = Number(parts[1]);
30
+ swapUsed = Number(parts[2]);
31
+ swapFree = Number(parts[3]);
32
+ }
33
+ }
34
+ return {
35
+ totalBytes,
36
+ usedBytes,
37
+ freeBytes,
38
+ availableBytes,
39
+ swap: {
40
+ totalBytes: swapTotal,
41
+ usedBytes: swapUsed,
42
+ freeBytes: swapFree,
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=memory-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-usage.js","sourceRoot":"","sources":["../../../src/system/probes/memory-usage.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAiB,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAEtC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,yDAAyD;YACzD,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC7B,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU;QACV,SAAS;QACT,SAAS;QACT,cAAc;QACd,IAAI,EAAE;YACJ,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,QAAQ;SACpB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-usage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-usage.test.d.ts","sourceRoot":"","sources":["../../../src/system/probes/memory-usage.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { memoryUsage, parseFreeOutput } from './memory-usage.js';
3
+ const SAMPLE_FREE_OUTPUT = ` total used free shared buff/cache available
4
+ Mem: 16595034112 8234127360 1021071360 348321792 7339835392 10543906816
5
+ Swap: 8589930496 1073741824 7516188672
6
+ `;
7
+ describe('parseFreeOutput', () => {
8
+ it('parses free -b output into structured data', () => {
9
+ const result = parseFreeOutput(SAMPLE_FREE_OUTPUT);
10
+ expect(result.totalBytes).toBe(16595034112);
11
+ expect(result.usedBytes).toBe(8234127360);
12
+ expect(result.freeBytes).toBe(1021071360);
13
+ expect(result.availableBytes).toBe(10543906816);
14
+ expect(result.swap.totalBytes).toBe(8589930496);
15
+ expect(result.swap.usedBytes).toBe(1073741824);
16
+ expect(result.swap.freeBytes).toBe(7516188672);
17
+ });
18
+ it('handles no swap', () => {
19
+ const output = ` total used free shared buff/cache available
20
+ Mem: 4153344000 2076672000 512000000 100000000 1564672000 2576672000
21
+ Swap: 0 0 0
22
+ `;
23
+ const result = parseFreeOutput(output);
24
+ expect(result.totalBytes).toBe(4153344000);
25
+ expect(result.swap.totalBytes).toBe(0);
26
+ expect(result.swap.usedBytes).toBe(0);
27
+ expect(result.swap.freeBytes).toBe(0);
28
+ });
29
+ it('handles minimal output format', () => {
30
+ const output = ` total used free shared buff/cache available
31
+ Mem: 8000000000 4000000000 2000000000 500000000 1500000000 5000000000
32
+ `;
33
+ const result = parseFreeOutput(output);
34
+ expect(result.totalBytes).toBe(8000000000);
35
+ expect(result.swap.totalBytes).toBe(0);
36
+ });
37
+ });
38
+ describe('memoryUsage handler', () => {
39
+ it('calls free -b and returns parsed result', async () => {
40
+ const mockExec = async (cmd, args) => {
41
+ expect(cmd).toBe('free');
42
+ expect(args).toEqual(['-b']);
43
+ return SAMPLE_FREE_OUTPUT;
44
+ };
45
+ const result = (await memoryUsage(undefined, mockExec));
46
+ expect(result.totalBytes).toBe(16595034112);
47
+ expect(result.swap.freeBytes).toBe(7516188672);
48
+ });
49
+ });
50
+ //# sourceMappingURL=memory-usage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-usage.test.js","sourceRoot":"","sources":["../../../src/system/probes/memory-usage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Pack } from '../types.js';
2
+ export declare const systemdPack: Pack;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/systemd/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAMxC,eAAO,MAAM,WAAW,EAAE,IAOzB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { systemdManifest } from './manifest.js';
2
+ import { journalQuery } from './probes/journal-query.js';
3
+ import { serviceStatus } from './probes/service-status.js';
4
+ import { servicesList } from './probes/services-list.js';
5
+ export const systemdPack = {
6
+ manifest: systemdManifest,
7
+ handlers: {
8
+ 'systemd.services.list': servicesList,
9
+ 'systemd.service.status': serviceStatus,
10
+ 'systemd.journal.query': journalQuery,
11
+ },
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/systemd/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,QAAQ,EAAE,eAAe;IACzB,QAAQ,EAAE;QACR,uBAAuB,EAAE,YAAY;QACrC,wBAAwB,EAAE,aAAa;QACvC,uBAAuB,EAAE,YAAY;KACtC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PackManifest } from '@sonde/shared';
2
+ export declare const systemdManifest: PackManifest;
3
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/systemd/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,eAAO,MAAM,eAAe,EAAE,YAiD7B,CAAC"}
@@ -0,0 +1,51 @@
1
+ export const systemdManifest = {
2
+ name: 'systemd',
3
+ version: '0.1.0',
4
+ description: 'systemd service and journal probes',
5
+ requires: {
6
+ groups: [],
7
+ files: [],
8
+ commands: ['systemctl'],
9
+ },
10
+ probes: [
11
+ {
12
+ name: 'services.list',
13
+ description: 'List all systemd service units',
14
+ capability: 'observe',
15
+ timeout: 10_000,
16
+ },
17
+ {
18
+ name: 'service.status',
19
+ description: 'Detailed status of a specific service',
20
+ capability: 'observe',
21
+ params: {
22
+ service: { type: 'string', description: 'Service unit name', required: true },
23
+ },
24
+ timeout: 10_000,
25
+ },
26
+ {
27
+ name: 'journal.query',
28
+ description: 'Query journal logs for a unit',
29
+ capability: 'observe',
30
+ params: {
31
+ unit: { type: 'string', description: 'Systemd unit name', required: true },
32
+ lines: {
33
+ type: 'number',
34
+ description: 'Number of log entries',
35
+ required: false,
36
+ default: 50,
37
+ },
38
+ },
39
+ timeout: 15_000,
40
+ },
41
+ ],
42
+ runbook: {
43
+ category: 'systemd',
44
+ probes: ['services.list'],
45
+ parallel: true,
46
+ },
47
+ detect: {
48
+ files: ['/run/systemd/system'],
49
+ },
50
+ };
51
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/systemd/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,oCAAoC;IACjD,QAAQ,EAAE;QACR,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,CAAC,WAAW,CAAC;KACxB;IACD,MAAM,EAAE;QACN;YACE,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,gCAAgC;YAC7C,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,MAAM;SAChB;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,uCAAuC;YACpD,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE;gBACN,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC9E;YACD,OAAO,EAAE,MAAM;SAChB;QACD;YACE,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,+BAA+B;YAC5C,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE;gBACN,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC1E,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uBAAuB;oBACpC,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,EAAE;iBACZ;aACF;YACD,OAAO,EAAE,MAAM;SAChB;KACF;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,CAAC,eAAe,CAAC;QACzB,QAAQ,EAAE,IAAI;KACf;IACD,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,qBAAqB,CAAC;KAC/B;CACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ProbeHandler } from '../../types.js';
2
+ export interface JournalEntry {
3
+ timestamp: string;
4
+ priority: number;
5
+ message: string;
6
+ pid: string;
7
+ uid: string;
8
+ }
9
+ export interface JournalQueryResult {
10
+ unit: string;
11
+ entries: JournalEntry[];
12
+ entryCount: number;
13
+ }
14
+ /**
15
+ * Runs `journalctl -u <unit> -n <lines> --no-pager -o json` and parses each JSON line.
16
+ */
17
+ export declare const journalQuery: ProbeHandler;
18
+ export declare function parseJournalQuery(unit: string, stdout: string): JournalQueryResult;
19
+ //# sourceMappingURL=journal-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-query.d.ts","sourceRoot":"","sources":["../../../src/systemd/probes/journal-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,YAc1B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAoBlF"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Runs `journalctl -u <unit> -n <lines> --no-pager -o json` and parses each JSON line.
3
+ */
4
+ export const journalQuery = async (params, exec) => {
5
+ const unit = params?.unit;
6
+ const lines = params?.lines ?? 50;
7
+ const stdout = await exec('journalctl', [
8
+ '-u',
9
+ unit,
10
+ '-n',
11
+ String(lines),
12
+ '--no-pager',
13
+ '-o',
14
+ 'json',
15
+ ]);
16
+ return parseJournalQuery(unit, stdout);
17
+ };
18
+ export function parseJournalQuery(unit, stdout) {
19
+ const lines = stdout.trim().split('\n').filter(Boolean);
20
+ const entries = [];
21
+ for (const line of lines) {
22
+ const raw = JSON.parse(line);
23
+ entries.push({
24
+ timestamp: raw.__REALTIME_TIMESTAMP ?? raw._SOURCE_REALTIME_TIMESTAMP ?? '',
25
+ priority: Number(raw.PRIORITY ?? 6),
26
+ message: raw.MESSAGE ?? '',
27
+ pid: raw._PID ?? '',
28
+ uid: raw._UID ?? '',
29
+ });
30
+ }
31
+ return {
32
+ unit,
33
+ entries,
34
+ entryCount: entries.length,
35
+ };
36
+ }
37
+ //# sourceMappingURL=journal-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-query.js","sourceRoot":"","sources":["../../../src/systemd/probes/journal-query.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAiB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;IAC/D,MAAM,IAAI,GAAG,MAAM,EAAE,IAAc,CAAC;IACpC,MAAM,KAAK,GAAI,MAAM,EAAE,KAAgB,IAAI,EAAE,CAAC;IAE9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE;QACtC,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,MAAM,CAAC,KAAK,CAAC;QACb,YAAY;QACZ,IAAI;QACJ,MAAM;KACP,CAAC,CAAC;IACH,OAAO,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAc;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC;YACX,SAAS,EAAE,GAAG,CAAC,oBAAoB,IAAI,GAAG,CAAC,0BAA0B,IAAI,EAAE;YAC3E,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;YACnC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;YAC1B,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;YACnB,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI;QACJ,OAAO;QACP,UAAU,EAAE,OAAO,CAAC,MAAM;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=journal-query.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-query.test.d.ts","sourceRoot":"","sources":["../../../src/systemd/probes/journal-query.test.ts"],"names":[],"mappings":""}