@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.
- package/dist/docker/index.d.ts +3 -0
- package/dist/docker/index.d.ts.map +1 -0
- package/dist/docker/index.js +15 -0
- package/dist/docker/index.js.map +1 -0
- package/dist/docker/manifest.d.ts +3 -0
- package/dist/docker/manifest.d.ts.map +1 -0
- package/dist/docker/manifest.js +54 -0
- package/dist/docker/manifest.js.map +1 -0
- package/dist/docker/probes/containers-list.d.ts +19 -0
- package/dist/docker/probes/containers-list.d.ts.map +1 -0
- package/dist/docker/probes/containers-list.js +25 -0
- package/dist/docker/probes/containers-list.js.map +1 -0
- package/dist/docker/probes/containers-list.test.d.ts +2 -0
- package/dist/docker/probes/containers-list.test.d.ts.map +1 -0
- package/dist/docker/probes/containers-list.test.js +43 -0
- package/dist/docker/probes/containers-list.test.js.map +1 -0
- package/dist/docker/probes/daemon-info.d.ts +16 -0
- package/dist/docker/probes/daemon-info.d.ts.map +1 -0
- package/dist/docker/probes/daemon-info.js +20 -0
- package/dist/docker/probes/daemon-info.js.map +1 -0
- package/dist/docker/probes/daemon-info.test.d.ts +2 -0
- package/dist/docker/probes/daemon-info.test.d.ts.map +1 -0
- package/dist/docker/probes/daemon-info.test.js +42 -0
- package/dist/docker/probes/daemon-info.test.js.map +1 -0
- package/dist/docker/probes/images-list.d.ts +17 -0
- package/dist/docker/probes/images-list.d.ts.map +1 -0
- package/dist/docker/probes/images-list.js +23 -0
- package/dist/docker/probes/images-list.js.map +1 -0
- package/dist/docker/probes/images-list.test.d.ts +2 -0
- package/dist/docker/probes/images-list.test.d.ts.map +1 -0
- package/dist/docker/probes/images-list.test.js +41 -0
- package/dist/docker/probes/images-list.test.js.map +1 -0
- package/dist/docker/probes/logs-tail.d.ts +12 -0
- package/dist/docker/probes/logs-tail.d.ts.map +1 -0
- package/dist/docker/probes/logs-tail.js +22 -0
- package/dist/docker/probes/logs-tail.js.map +1 -0
- package/dist/docker/probes/logs-tail.test.d.ts +2 -0
- package/dist/docker/probes/logs-tail.test.d.ts.map +1 -0
- package/dist/docker/probes/logs-tail.test.js +42 -0
- package/dist/docker/probes/logs-tail.test.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/system/index.d.ts +3 -0
- package/dist/system/index.d.ts.map +1 -0
- package/dist/system/index.js +13 -0
- package/dist/system/index.js.map +1 -0
- package/dist/system/manifest.d.ts +3 -0
- package/dist/system/manifest.d.ts.map +1 -0
- package/dist/system/manifest.js +39 -0
- package/dist/system/manifest.js.map +1 -0
- package/dist/system/probes/cpu-usage.d.ts +14 -0
- package/dist/system/probes/cpu-usage.d.ts.map +1 -0
- package/dist/system/probes/cpu-usage.js +20 -0
- package/dist/system/probes/cpu-usage.js.map +1 -0
- package/dist/system/probes/cpu-usage.test.d.ts +2 -0
- package/dist/system/probes/cpu-usage.test.d.ts.map +1 -0
- package/dist/system/probes/cpu-usage.test.js +45 -0
- package/dist/system/probes/cpu-usage.test.js.map +1 -0
- package/dist/system/probes/disk-usage.d.ts +19 -0
- package/dist/system/probes/disk-usage.d.ts.map +1 -0
- package/dist/system/probes/disk-usage.js +34 -0
- package/dist/system/probes/disk-usage.js.map +1 -0
- package/dist/system/probes/disk-usage.test.d.ts +2 -0
- package/dist/system/probes/disk-usage.test.d.ts.map +1 -0
- package/dist/system/probes/disk-usage.test.js +62 -0
- package/dist/system/probes/disk-usage.test.js.map +1 -0
- package/dist/system/probes/memory-usage.d.ts +19 -0
- package/dist/system/probes/memory-usage.d.ts.map +1 -0
- package/dist/system/probes/memory-usage.js +46 -0
- package/dist/system/probes/memory-usage.js.map +1 -0
- package/dist/system/probes/memory-usage.test.d.ts +2 -0
- package/dist/system/probes/memory-usage.test.d.ts.map +1 -0
- package/dist/system/probes/memory-usage.test.js +50 -0
- package/dist/system/probes/memory-usage.test.js.map +1 -0
- package/dist/systemd/index.d.ts +3 -0
- package/dist/systemd/index.d.ts.map +1 -0
- package/dist/systemd/index.js +13 -0
- package/dist/systemd/index.js.map +1 -0
- package/dist/systemd/manifest.d.ts +3 -0
- package/dist/systemd/manifest.d.ts.map +1 -0
- package/dist/systemd/manifest.js +51 -0
- package/dist/systemd/manifest.js.map +1 -0
- package/dist/systemd/probes/journal-query.d.ts +19 -0
- package/dist/systemd/probes/journal-query.d.ts.map +1 -0
- package/dist/systemd/probes/journal-query.js +37 -0
- package/dist/systemd/probes/journal-query.js.map +1 -0
- package/dist/systemd/probes/journal-query.test.d.ts +2 -0
- package/dist/systemd/probes/journal-query.test.d.ts.map +1 -0
- package/dist/systemd/probes/journal-query.test.js +50 -0
- package/dist/systemd/probes/journal-query.test.js.map +1 -0
- package/dist/systemd/probes/service-status.d.ts +16 -0
- package/dist/systemd/probes/service-status.d.ts.map +1 -0
- package/dist/systemd/probes/service-status.js +29 -0
- package/dist/systemd/probes/service-status.js.map +1 -0
- package/dist/systemd/probes/service-status.test.d.ts +2 -0
- package/dist/systemd/probes/service-status.test.d.ts.map +1 -0
- package/dist/systemd/probes/service-status.test.js +48 -0
- package/dist/systemd/probes/service-status.test.js.map +1 -0
- package/dist/systemd/probes/services-list.d.ts +18 -0
- package/dist/systemd/probes/services-list.d.ts.map +1 -0
- package/dist/systemd/probes/services-list.js +29 -0
- package/dist/systemd/probes/services-list.js.map +1 -0
- package/dist/systemd/probes/services-list.test.d.ts +2 -0
- package/dist/systemd/probes/services-list.test.d.ts.map +1 -0
- package/dist/systemd/probes/services-list.test.js +61 -0
- package/dist/systemd/probes/services-list.test.js.map +1 -0
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +16 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +44 -0
- package/dist/validation.js.map +1 -0
- package/dist/validation.test.d.ts +2 -0
- package/dist/validation.test.d.ts.map +1 -0
- package/dist/validation.test.js +76 -0
- package/dist/validation.test.js.map +1 -0
- package/package.json +26 -0
- package/src/docker/index.ts +16 -0
- package/src/docker/manifest.ts +55 -0
- package/src/docker/probes/containers-list.test.ts +50 -0
- package/src/docker/probes/containers-list.ts +42 -0
- package/src/docker/probes/daemon-info.test.ts +48 -0
- package/src/docker/probes/daemon-info.ts +33 -0
- package/src/docker/probes/images-list.test.ts +48 -0
- package/src/docker/probes/images-list.ts +39 -0
- package/src/docker/probes/logs-tail.test.ts +51 -0
- package/src/docker/probes/logs-tail.ts +32 -0
- package/src/index.ts +18 -0
- package/src/system/index.ts +14 -0
- package/src/system/manifest.ts +40 -0
- package/src/system/probes/cpu-usage.test.ts +55 -0
- package/src/system/probes/cpu-usage.ts +30 -0
- package/src/system/probes/disk-usage.test.ts +73 -0
- package/src/system/probes/disk-usage.ts +53 -0
- package/src/system/probes/memory-usage.test.ts +58 -0
- package/src/system/probes/memory-usage.ts +63 -0
- package/src/systemd/index.ts +14 -0
- package/src/systemd/manifest.ts +52 -0
- package/src/systemd/probes/journal-query.test.ts +64 -0
- package/src/systemd/probes/journal-query.ts +56 -0
- package/src/systemd/probes/service-status.test.ts +59 -0
- package/src/systemd/probes/service-status.ts +42 -0
- package/src/systemd/probes/services-list.test.ts +68 -0
- package/src/systemd/probes/services-list.ts +45 -0
- package/src/types.ts +16 -0
- package/src/validation.test.ts +86 -0
- package/src/validation.ts +52 -0
- package/tsconfig.json +11 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/docker/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAOxC,eAAO,MAAM,UAAU,EAAE,IAQxB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { dockerManifest } from './manifest.js';
|
|
2
|
+
import { containersList } from './probes/containers-list.js';
|
|
3
|
+
import { daemonInfo } from './probes/daemon-info.js';
|
|
4
|
+
import { imagesList } from './probes/images-list.js';
|
|
5
|
+
import { logsTail } from './probes/logs-tail.js';
|
|
6
|
+
export const dockerPack = {
|
|
7
|
+
manifest: dockerManifest,
|
|
8
|
+
handlers: {
|
|
9
|
+
'docker.containers.list': containersList,
|
|
10
|
+
'docker.logs.tail': logsTail,
|
|
11
|
+
'docker.images.list': imagesList,
|
|
12
|
+
'docker.daemon.info': daemonInfo,
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/docker/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE;QACR,wBAAwB,EAAE,cAAc;QACxC,kBAAkB,EAAE,QAAQ;QAC5B,oBAAoB,EAAE,UAAU;QAChC,oBAAoB,EAAE,UAAU;KACjC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/docker/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,eAAO,MAAM,cAAc,EAAE,YAoD5B,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export const dockerManifest = {
|
|
2
|
+
name: 'docker',
|
|
3
|
+
version: '0.1.0',
|
|
4
|
+
description: 'Docker container and image management probes',
|
|
5
|
+
requires: {
|
|
6
|
+
groups: [],
|
|
7
|
+
files: [],
|
|
8
|
+
commands: ['docker'],
|
|
9
|
+
},
|
|
10
|
+
probes: [
|
|
11
|
+
{
|
|
12
|
+
name: 'containers.list',
|
|
13
|
+
description: 'List all Docker containers with status',
|
|
14
|
+
capability: 'observe',
|
|
15
|
+
timeout: 10_000,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'logs.tail',
|
|
19
|
+
description: 'Tail recent logs from a container',
|
|
20
|
+
capability: 'observe',
|
|
21
|
+
params: {
|
|
22
|
+
container: { type: 'string', description: 'Container name or ID', required: true },
|
|
23
|
+
lines: {
|
|
24
|
+
type: 'number',
|
|
25
|
+
description: 'Number of lines to tail',
|
|
26
|
+
required: false,
|
|
27
|
+
default: 100,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
timeout: 15_000,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'images.list',
|
|
34
|
+
description: 'List all Docker images',
|
|
35
|
+
capability: 'observe',
|
|
36
|
+
timeout: 10_000,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'daemon.info',
|
|
40
|
+
description: 'Docker daemon information and resource summary',
|
|
41
|
+
capability: 'observe',
|
|
42
|
+
timeout: 10_000,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
runbook: {
|
|
46
|
+
category: 'docker',
|
|
47
|
+
probes: ['containers.list', 'images.list', 'daemon.info'],
|
|
48
|
+
parallel: true,
|
|
49
|
+
},
|
|
50
|
+
detect: {
|
|
51
|
+
commands: ['docker'],
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/docker/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,8CAA8C;IAC3D,QAAQ,EAAE;QACR,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;IACD,MAAM,EAAE;QACN;YACE,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,wCAAwC;YACrD,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,MAAM;SAChB;QACD;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,mCAAmC;YAChD,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE;gBACN,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAClF,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yBAAyB;oBACtC,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,GAAG;iBACb;aACF;YACD,OAAO,EAAE,MAAM;SAChB;QACD;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,wBAAwB;YACrC,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,MAAM;SAChB;QACD;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,gDAAgD;YAC7D,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,MAAM;SAChB;KACF;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,CAAC,iBAAiB,EAAE,aAAa,EAAE,aAAa,CAAC;QACzD,QAAQ,EAAE,IAAI;KACf;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ProbeHandler } from '../../types.js';
|
|
2
|
+
export interface ContainerInfo {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
image: string;
|
|
6
|
+
state: string;
|
|
7
|
+
status: string;
|
|
8
|
+
ports: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ContainersListResult {
|
|
11
|
+
containers: ContainerInfo[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Runs `docker ps -a --format json` and parses each JSON line.
|
|
15
|
+
* The --format json flag outputs one JSON object per line (Docker 20.10+).
|
|
16
|
+
*/
|
|
17
|
+
export declare const containersList: ProbeHandler;
|
|
18
|
+
export declare function parseContainersList(stdout: string): ContainersListResult;
|
|
19
|
+
//# sourceMappingURL=containers-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containers-list.d.ts","sourceRoot":"","sources":["../../../src/docker/probes/containers-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,YAG5B,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAiBxE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs `docker ps -a --format json` and parses each JSON line.
|
|
3
|
+
* The --format json flag outputs one JSON object per line (Docker 20.10+).
|
|
4
|
+
*/
|
|
5
|
+
export const containersList = async (_params, exec) => {
|
|
6
|
+
const stdout = await exec('docker', ['ps', '-a', '--format', 'json']);
|
|
7
|
+
return parseContainersList(stdout);
|
|
8
|
+
};
|
|
9
|
+
export function parseContainersList(stdout) {
|
|
10
|
+
const lines = stdout.trim().split('\n').filter(Boolean);
|
|
11
|
+
const containers = [];
|
|
12
|
+
for (const line of lines) {
|
|
13
|
+
const raw = JSON.parse(line);
|
|
14
|
+
containers.push({
|
|
15
|
+
id: raw.ID ?? '',
|
|
16
|
+
name: raw.Names ?? '',
|
|
17
|
+
image: raw.Image ?? '',
|
|
18
|
+
state: raw.State ?? '',
|
|
19
|
+
status: raw.Status ?? '',
|
|
20
|
+
ports: raw.Ports ?? '',
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return { containers };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=containers-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containers-list.js","sourceRoot":"","sources":["../../../src/docker/probes/containers-list.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAiB,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAClE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,UAAU,GAAoB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,UAAU,CAAC,IAAI,CAAC;YACd,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE;YAChB,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;YACrB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;SACvB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containers-list.test.d.ts","sourceRoot":"","sources":["../../../src/docker/probes/containers-list.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { containersList, parseContainersList } from './containers-list.js';
|
|
3
|
+
const SAMPLE_OUTPUT = `{"Command":"\\"docker-entrypoint.s…\\"","CreatedAt":"2024-01-15 10:30:00 +0000 UTC","ID":"abc123def456","Image":"nginx:latest","Labels":"","LocalVolumes":"0","Mounts":"","Names":"web-server","Networks":"bridge","Ports":"0.0.0.0:80-\\u003e80/tcp","RunningFor":"2 hours ago","Size":"0B","State":"running","Status":"Up 2 hours"}
|
|
4
|
+
{"Command":"\\"postgres\\"","CreatedAt":"2024-01-15 09:00:00 +0000 UTC","ID":"789xyz000111","Image":"postgres:16","Labels":"","LocalVolumes":"1","Mounts":"pgdata","Names":"db","Networks":"bridge","Ports":"5432/tcp","RunningFor":"3 hours ago","Size":"0B","State":"exited","Status":"Exited (0) 1 hour ago"}`;
|
|
5
|
+
describe('parseContainersList', () => {
|
|
6
|
+
it('parses docker ps JSON output into structured data', () => {
|
|
7
|
+
const result = parseContainersList(SAMPLE_OUTPUT);
|
|
8
|
+
expect(result.containers).toHaveLength(2);
|
|
9
|
+
expect(result.containers[0]).toEqual({
|
|
10
|
+
id: 'abc123def456',
|
|
11
|
+
name: 'web-server',
|
|
12
|
+
image: 'nginx:latest',
|
|
13
|
+
state: 'running',
|
|
14
|
+
status: 'Up 2 hours',
|
|
15
|
+
ports: '0.0.0.0:80->80/tcp',
|
|
16
|
+
});
|
|
17
|
+
expect(result.containers[1]).toEqual({
|
|
18
|
+
id: '789xyz000111',
|
|
19
|
+
name: 'db',
|
|
20
|
+
image: 'postgres:16',
|
|
21
|
+
state: 'exited',
|
|
22
|
+
status: 'Exited (0) 1 hour ago',
|
|
23
|
+
ports: '5432/tcp',
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
it('returns empty array for empty output', () => {
|
|
27
|
+
const result = parseContainersList('');
|
|
28
|
+
expect(result.containers).toHaveLength(0);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('containersList handler', () => {
|
|
32
|
+
it('calls docker ps with correct args and returns parsed result', async () => {
|
|
33
|
+
const mockExec = async (cmd, args) => {
|
|
34
|
+
expect(cmd).toBe('docker');
|
|
35
|
+
expect(args).toEqual(['ps', '-a', '--format', 'json']);
|
|
36
|
+
return SAMPLE_OUTPUT;
|
|
37
|
+
};
|
|
38
|
+
const result = (await containersList(undefined, mockExec));
|
|
39
|
+
expect(result.containers).toHaveLength(2);
|
|
40
|
+
expect(result.containers[0]?.name).toBe('web-server');
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=containers-list.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containers-list.test.js","sourceRoot":"","sources":["../../../src/docker/probes/containers-list.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3E,MAAM,aAAa,GAAG;iTAC2R,CAAC;AAElT,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAElD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACnC,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,YAAY;YACpB,KAAK,EAAE,oBAAoB;SAC5B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACnC,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,uBAAuB;YAC/B,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,QAAQ,GAAW,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACvD,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAM,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAyB,CAAC;QACnF,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ProbeHandler } from '../../types.js';
|
|
2
|
+
export interface DaemonInfoResult {
|
|
3
|
+
serverVersion: string;
|
|
4
|
+
containers: number;
|
|
5
|
+
images: number;
|
|
6
|
+
driver: string;
|
|
7
|
+
os: string;
|
|
8
|
+
memoryBytes: number;
|
|
9
|
+
cpus: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Runs `docker info --format json` and extracts key daemon info.
|
|
13
|
+
*/
|
|
14
|
+
export declare const daemonInfo: ProbeHandler;
|
|
15
|
+
export declare function parseDaemonInfo(stdout: string): DaemonInfoResult;
|
|
16
|
+
//# sourceMappingURL=daemon-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-info.d.ts","sourceRoot":"","sources":["../../../src/docker/probes/daemon-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,YAGxB,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAYhE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs `docker info --format json` and extracts key daemon info.
|
|
3
|
+
*/
|
|
4
|
+
export const daemonInfo = async (_params, exec) => {
|
|
5
|
+
const stdout = await exec('docker', ['info', '--format', 'json']);
|
|
6
|
+
return parseDaemonInfo(stdout);
|
|
7
|
+
};
|
|
8
|
+
export function parseDaemonInfo(stdout) {
|
|
9
|
+
const raw = JSON.parse(stdout);
|
|
10
|
+
return {
|
|
11
|
+
serverVersion: raw.ServerVersion ?? '',
|
|
12
|
+
containers: raw.Containers ?? 0,
|
|
13
|
+
images: raw.Images ?? 0,
|
|
14
|
+
driver: raw.Driver ?? '',
|
|
15
|
+
os: raw.OperatingSystem ?? '',
|
|
16
|
+
memoryBytes: raw.MemTotal ?? 0,
|
|
17
|
+
cpus: raw.NCPU ?? 0,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=daemon-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-info.js","sourceRoot":"","sources":["../../../src/docker/probes/daemon-info.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAiB,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE/B,OAAO;QACL,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;QACtC,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;QAC/B,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;QACxB,EAAE,EAAE,GAAG,CAAC,eAAe,IAAI,EAAE;QAC7B,WAAW,EAAE,GAAG,CAAC,QAAQ,IAAI,CAAC;QAC9B,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-info.test.d.ts","sourceRoot":"","sources":["../../../src/docker/probes/daemon-info.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { daemonInfo, parseDaemonInfo } from './daemon-info.js';
|
|
3
|
+
const SAMPLE_OUTPUT = JSON.stringify({
|
|
4
|
+
ServerVersion: '24.0.7',
|
|
5
|
+
Containers: 5,
|
|
6
|
+
ContainersRunning: 3,
|
|
7
|
+
ContainersPaused: 0,
|
|
8
|
+
ContainersStopped: 2,
|
|
9
|
+
Images: 12,
|
|
10
|
+
Driver: 'overlay2',
|
|
11
|
+
OperatingSystem: 'Ubuntu 22.04.3 LTS',
|
|
12
|
+
MemTotal: 16777216000,
|
|
13
|
+
NCPU: 8,
|
|
14
|
+
KernelVersion: '5.15.0-91-generic',
|
|
15
|
+
});
|
|
16
|
+
describe('parseDaemonInfo', () => {
|
|
17
|
+
it('parses docker info JSON output into structured data', () => {
|
|
18
|
+
const result = parseDaemonInfo(SAMPLE_OUTPUT);
|
|
19
|
+
expect(result).toEqual({
|
|
20
|
+
serverVersion: '24.0.7',
|
|
21
|
+
containers: 5,
|
|
22
|
+
images: 12,
|
|
23
|
+
driver: 'overlay2',
|
|
24
|
+
os: 'Ubuntu 22.04.3 LTS',
|
|
25
|
+
memoryBytes: 16777216000,
|
|
26
|
+
cpus: 8,
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('daemonInfo handler', () => {
|
|
31
|
+
it('calls docker info with correct args and returns parsed result', async () => {
|
|
32
|
+
const mockExec = async (cmd, args) => {
|
|
33
|
+
expect(cmd).toBe('docker');
|
|
34
|
+
expect(args).toEqual(['info', '--format', 'json']);
|
|
35
|
+
return SAMPLE_OUTPUT;
|
|
36
|
+
};
|
|
37
|
+
const result = (await daemonInfo(undefined, mockExec));
|
|
38
|
+
expect(result.serverVersion).toBe('24.0.7');
|
|
39
|
+
expect(result.cpus).toBe(8);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=daemon-info.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-info.test.js","sourceRoot":"","sources":["../../../src/docker/probes/daemon-info.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC;IACnC,aAAa,EAAE,QAAQ;IACvB,UAAU,EAAE,CAAC;IACb,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,CAAC;IACnB,iBAAiB,EAAE,CAAC;IACpB,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,UAAU;IAClB,eAAe,EAAE,oBAAoB;IACrC,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,CAAC;IACP,aAAa,EAAE,mBAAmB;CACnC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,aAAa,EAAE,QAAQ;YACvB,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,UAAU;YAClB,EAAE,EAAE,oBAAoB;YACxB,WAAW,EAAE,WAAW;YACxB,IAAI,EAAE,CAAC;SACR,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,QAAQ,GAAW,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACnD,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAM,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAqB,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ProbeHandler } from '../../types.js';
|
|
2
|
+
export interface ImageInfo {
|
|
3
|
+
id: string;
|
|
4
|
+
repository: string;
|
|
5
|
+
tag: string;
|
|
6
|
+
size: string;
|
|
7
|
+
created: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ImagesListResult {
|
|
10
|
+
images: ImageInfo[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Runs `docker images --format json` and parses each JSON line.
|
|
14
|
+
*/
|
|
15
|
+
export declare const imagesList: ProbeHandler;
|
|
16
|
+
export declare function parseImagesList(stdout: string): ImagesListResult;
|
|
17
|
+
//# sourceMappingURL=images-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images-list.d.ts","sourceRoot":"","sources":["../../../src/docker/probes/images-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,YAGxB,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAgBhE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs `docker images --format json` and parses each JSON line.
|
|
3
|
+
*/
|
|
4
|
+
export const imagesList = async (_params, exec) => {
|
|
5
|
+
const stdout = await exec('docker', ['images', '--format', 'json']);
|
|
6
|
+
return parseImagesList(stdout);
|
|
7
|
+
};
|
|
8
|
+
export function parseImagesList(stdout) {
|
|
9
|
+
const lines = stdout.trim().split('\n').filter(Boolean);
|
|
10
|
+
const images = [];
|
|
11
|
+
for (const line of lines) {
|
|
12
|
+
const raw = JSON.parse(line);
|
|
13
|
+
images.push({
|
|
14
|
+
id: raw.ID ?? '',
|
|
15
|
+
repository: raw.Repository ?? '',
|
|
16
|
+
tag: raw.Tag ?? '',
|
|
17
|
+
size: raw.Size ?? '',
|
|
18
|
+
created: raw.CreatedSince ?? raw.CreatedAt ?? '',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return { images };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=images-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images-list.js","sourceRoot":"","sources":["../../../src/docker/probes/images-list.ts"],"names":[],"mappings":"AAcA;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAiB,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACpE,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,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE;YAChB,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;YAChC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;YACpB,OAAO,EAAE,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images-list.test.d.ts","sourceRoot":"","sources":["../../../src/docker/probes/images-list.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { imagesList, parseImagesList } from './images-list.js';
|
|
3
|
+
const SAMPLE_OUTPUT = `{"Containers":"N/A","CreatedAt":"2024-01-10 08:00:00 +0000 UTC","CreatedSince":"5 days ago","Digest":"\u003cnone\u003e","ID":"sha256:abc123","Repository":"nginx","SharedSize":"N/A","Size":"187MB","Tag":"latest","UniqueSize":"N/A","VirtualSize":"187MB"}
|
|
4
|
+
{"Containers":"N/A","CreatedAt":"2024-01-08 12:00:00 +0000 UTC","CreatedSince":"7 days ago","Digest":"\u003cnone\u003e","ID":"sha256:def456","Repository":"postgres","SharedSize":"N/A","Size":"432MB","Tag":"16","UniqueSize":"N/A","VirtualSize":"432MB"}`;
|
|
5
|
+
describe('parseImagesList', () => {
|
|
6
|
+
it('parses docker images JSON output into structured data', () => {
|
|
7
|
+
const result = parseImagesList(SAMPLE_OUTPUT);
|
|
8
|
+
expect(result.images).toHaveLength(2);
|
|
9
|
+
expect(result.images[0]).toEqual({
|
|
10
|
+
id: 'sha256:abc123',
|
|
11
|
+
repository: 'nginx',
|
|
12
|
+
tag: 'latest',
|
|
13
|
+
size: '187MB',
|
|
14
|
+
created: '5 days ago',
|
|
15
|
+
});
|
|
16
|
+
expect(result.images[1]).toEqual({
|
|
17
|
+
id: 'sha256:def456',
|
|
18
|
+
repository: 'postgres',
|
|
19
|
+
tag: '16',
|
|
20
|
+
size: '432MB',
|
|
21
|
+
created: '7 days ago',
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
it('returns empty array for empty output', () => {
|
|
25
|
+
const result = parseImagesList('');
|
|
26
|
+
expect(result.images).toHaveLength(0);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('imagesList handler', () => {
|
|
30
|
+
it('calls docker images with correct args and returns parsed result', async () => {
|
|
31
|
+
const mockExec = async (cmd, args) => {
|
|
32
|
+
expect(cmd).toBe('docker');
|
|
33
|
+
expect(args).toEqual(['images', '--format', 'json']);
|
|
34
|
+
return SAMPLE_OUTPUT;
|
|
35
|
+
};
|
|
36
|
+
const result = (await imagesList(undefined, mockExec));
|
|
37
|
+
expect(result.images).toHaveLength(2);
|
|
38
|
+
expect(result.images[0]?.repository).toBe('nginx');
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=images-list.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images-list.test.js","sourceRoot":"","sources":["../../../src/docker/probes/images-list.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,aAAa,GAAG;4PACsO,CAAC;AAE7P,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/B,EAAE,EAAE,eAAe;YACnB,UAAU,EAAE,OAAO;YACnB,GAAG,EAAE,QAAQ;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/B,EAAE,EAAE,eAAe;YACnB,UAAU,EAAE,UAAU;YACtB,GAAG,EAAE,IAAI;YACT,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,QAAQ,GAAW,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACrD,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAM,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAqB,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ProbeHandler } from '../../types.js';
|
|
2
|
+
export interface LogsTailResult {
|
|
3
|
+
container: string;
|
|
4
|
+
lines: string[];
|
|
5
|
+
lineCount: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Runs `docker logs --tail N <container>` and returns the log lines.
|
|
9
|
+
*/
|
|
10
|
+
export declare const logsTail: ProbeHandler;
|
|
11
|
+
export declare function parseLogsTail(container: string, stdout: string): LogsTailResult;
|
|
12
|
+
//# sourceMappingURL=logs-tail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs-tail.d.ts","sourceRoot":"","sources":["../../../src/docker/probes/logs-tail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,YAMtB,CAAC;AAEF,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAY/E"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs `docker logs --tail N <container>` and returns the log lines.
|
|
3
|
+
*/
|
|
4
|
+
export const logsTail = async (params, exec) => {
|
|
5
|
+
const container = params?.container;
|
|
6
|
+
const lines = params?.lines ?? 100;
|
|
7
|
+
const stdout = await exec('docker', ['logs', '--tail', String(lines), container]);
|
|
8
|
+
return parseLogsTail(container, stdout);
|
|
9
|
+
};
|
|
10
|
+
export function parseLogsTail(container, stdout) {
|
|
11
|
+
const lines = stdout.split('\n');
|
|
12
|
+
// Remove trailing empty line from split
|
|
13
|
+
if (lines.length > 0 && lines[lines.length - 1] === '') {
|
|
14
|
+
lines.pop();
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
container,
|
|
18
|
+
lines,
|
|
19
|
+
lineCount: lines.length,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=logs-tail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs-tail.js","sourceRoot":"","sources":["../../../src/docker/probes/logs-tail.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAiB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;IAC3D,MAAM,SAAS,GAAG,MAAM,EAAE,SAAmB,CAAC;IAC9C,MAAM,KAAK,GAAI,MAAM,EAAE,KAAgB,IAAI,GAAG,CAAC;IAE/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAClF,OAAO,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,MAAc;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,wCAAwC;IACxC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACvD,KAAK,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;IAED,OAAO;QACL,SAAS;QACT,KAAK;QACL,SAAS,EAAE,KAAK,CAAC,MAAM;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs-tail.test.d.ts","sourceRoot":"","sources":["../../../src/docker/probes/logs-tail.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { logsTail, parseLogsTail } from './logs-tail.js';
|
|
3
|
+
const SAMPLE_LOGS = `2024-01-15T10:30:00Z Starting nginx...
|
|
4
|
+
2024-01-15T10:30:01Z Listening on port 80
|
|
5
|
+
2024-01-15T10:30:05Z GET / 200 0.5ms
|
|
6
|
+
`;
|
|
7
|
+
describe('parseLogsTail', () => {
|
|
8
|
+
it('parses log output into structured data', () => {
|
|
9
|
+
const result = parseLogsTail('web-server', SAMPLE_LOGS);
|
|
10
|
+
expect(result.container).toBe('web-server');
|
|
11
|
+
expect(result.lines).toHaveLength(3);
|
|
12
|
+
expect(result.lineCount).toBe(3);
|
|
13
|
+
expect(result.lines[0]).toBe('2024-01-15T10:30:00Z Starting nginx...');
|
|
14
|
+
});
|
|
15
|
+
it('handles empty output', () => {
|
|
16
|
+
const result = parseLogsTail('web-server', '');
|
|
17
|
+
expect(result.lines).toHaveLength(0);
|
|
18
|
+
expect(result.lineCount).toBe(0);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('logsTail handler', () => {
|
|
22
|
+
it('calls docker logs with default lines and returns parsed result', async () => {
|
|
23
|
+
const mockExec = async (cmd, args) => {
|
|
24
|
+
expect(cmd).toBe('docker');
|
|
25
|
+
expect(args).toEqual(['logs', '--tail', '100', 'web-server']);
|
|
26
|
+
return SAMPLE_LOGS;
|
|
27
|
+
};
|
|
28
|
+
const result = (await logsTail({ container: 'web-server' }, mockExec));
|
|
29
|
+
expect(result.container).toBe('web-server');
|
|
30
|
+
expect(result.lineCount).toBe(3);
|
|
31
|
+
});
|
|
32
|
+
it('uses custom lines param', async () => {
|
|
33
|
+
const mockExec = async (cmd, args) => {
|
|
34
|
+
expect(cmd).toBe('docker');
|
|
35
|
+
expect(args).toEqual(['logs', '--tail', '50', 'my-app']);
|
|
36
|
+
return SAMPLE_LOGS;
|
|
37
|
+
};
|
|
38
|
+
const result = (await logsTail({ container: 'my-app', lines: 50 }, mockExec));
|
|
39
|
+
expect(result.container).toBe('my-app');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=logs-tail.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs-tail.test.js","sourceRoot":"","sources":["../../../src/docker/probes/logs-tail.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,GAAG;;;CAGnB,CAAC;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAExD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,QAAQ,GAAW,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;YAC9D,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAmB,CAAC;QACzF,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,QAAQ,GAAW,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YACzD,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAmB,CAAC;QAChG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Pack } from './types.js';
|
|
2
|
+
export type { ExecFn, Pack, ProbeHandler } from './types.js';
|
|
3
|
+
export { systemPack } from './system/index.js';
|
|
4
|
+
export { dockerPack } from './docker/index.js';
|
|
5
|
+
export { systemdPack } from './systemd/index.js';
|
|
6
|
+
export { createPackRegistry, PackValidationError, validatePack } from './validation.js';
|
|
7
|
+
/** Registry of all built-in packs, keyed by pack name */
|
|
8
|
+
export declare const packRegistry: ReadonlyMap<string, Pack>;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAExF,yDAAyD;AACzD,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAIjD,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { dockerPack } from './docker/index.js';
|
|
2
|
+
import { systemPack } from './system/index.js';
|
|
3
|
+
import { systemdPack } from './systemd/index.js';
|
|
4
|
+
import { createPackRegistry } from './validation.js';
|
|
5
|
+
export { systemPack } from './system/index.js';
|
|
6
|
+
export { dockerPack } from './docker/index.js';
|
|
7
|
+
export { systemdPack } from './systemd/index.js';
|
|
8
|
+
export { createPackRegistry, PackValidationError, validatePack } from './validation.js';
|
|
9
|
+
/** Registry of all built-in packs, keyed by pack name */
|
|
10
|
+
export const packRegistry = createPackRegistry([
|
|
11
|
+
systemPack,
|
|
12
|
+
dockerPack,
|
|
13
|
+
systemdPack,
|
|
14
|
+
]);
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAExF,yDAAyD;AACzD,MAAM,CAAC,MAAM,YAAY,GAA8B,kBAAkB,CAAC;IACxE,UAAU;IACV,UAAU;IACV,WAAW;CACZ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/system/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAMxC,eAAO,MAAM,UAAU,EAAE,IAOxB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { systemManifest } from './manifest.js';
|
|
2
|
+
import { cpuUsage } from './probes/cpu-usage.js';
|
|
3
|
+
import { diskUsage } from './probes/disk-usage.js';
|
|
4
|
+
import { memoryUsage } from './probes/memory-usage.js';
|
|
5
|
+
export const systemPack = {
|
|
6
|
+
manifest: systemManifest,
|
|
7
|
+
handlers: {
|
|
8
|
+
'system.disk.usage': diskUsage,
|
|
9
|
+
'system.memory.usage': memoryUsage,
|
|
10
|
+
'system.cpu.usage': cpuUsage,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/system/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE;QACR,mBAAmB,EAAE,SAAS;QAC9B,qBAAqB,EAAE,WAAW;QAClC,kBAAkB,EAAE,QAAQ;KAC7B;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/system/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,eAAO,MAAM,cAAc,EAAE,YAqC5B,CAAC"}
|