@developers-homelab/runestone-cli 1.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/LICENSE +21 -0
- package/README.md +107 -0
- package/bin/runestone +17 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +78 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/certs.d.ts +3 -0
- package/dist/commands/certs.d.ts.map +1 -0
- package/dist/commands/certs.js +110 -0
- package/dist/commands/certs.js.map +1 -0
- package/dist/commands/down.d.ts +3 -0
- package/dist/commands/down.d.ts.map +1 -0
- package/dist/commands/down.js +59 -0
- package/dist/commands/down.js.map +1 -0
- package/dist/commands/keys.d.ts +3 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +51 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/setup.d.ts +15 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +641 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +57 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +3 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +25 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/up.d.ts +3 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +72 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/i18n/index.d.ts +316 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +378 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/services/cert-manager.d.ts +38 -0
- package/dist/services/cert-manager.d.ts.map +1 -0
- package/dist/services/cert-manager.js +260 -0
- package/dist/services/cert-manager.js.map +1 -0
- package/dist/services/docker-compose.d.ts +24 -0
- package/dist/services/docker-compose.d.ts.map +1 -0
- package/dist/services/docker-compose.js +132 -0
- package/dist/services/docker-compose.js.map +1 -0
- package/dist/services/docker-exec.d.ts +10 -0
- package/dist/services/docker-exec.d.ts.map +1 -0
- package/dist/services/docker-exec.js +39 -0
- package/dist/services/docker-exec.js.map +1 -0
- package/dist/services/docker-network.d.ts +13 -0
- package/dist/services/docker-network.d.ts.map +1 -0
- package/dist/services/docker-network.js +58 -0
- package/dist/services/docker-network.js.map +1 -0
- package/dist/services/docker-run.d.ts +18 -0
- package/dist/services/docker-run.d.ts.map +1 -0
- package/dist/services/docker-run.js +56 -0
- package/dist/services/docker-run.js.map +1 -0
- package/dist/services/docker-volume.d.ts +12 -0
- package/dist/services/docker-volume.d.ts.map +1 -0
- package/dist/services/docker-volume.js +57 -0
- package/dist/services/docker-volume.js.map +1 -0
- package/dist/services/domain-checker.d.ts +29 -0
- package/dist/services/domain-checker.d.ts.map +1 -0
- package/dist/services/domain-checker.js +149 -0
- package/dist/services/domain-checker.js.map +1 -0
- package/dist/services/port-checker.d.ts +3 -0
- package/dist/services/port-checker.d.ts.map +1 -0
- package/dist/services/port-checker.js +45 -0
- package/dist/services/port-checker.js.map +1 -0
- package/dist/services/ssh-manager.d.ts +7 -0
- package/dist/services/ssh-manager.d.ts.map +1 -0
- package/dist/services/ssh-manager.js +125 -0
- package/dist/services/ssh-manager.js.map +1 -0
- package/dist/utils/command.d.ts +6 -0
- package/dist/utils/command.d.ts.map +1 -0
- package/dist/utils/command.js +34 -0
- package/dist/utils/command.js.map +1 -0
- package/dist/utils/docker-checker.d.ts +5 -0
- package/dist/utils/docker-checker.d.ts.map +1 -0
- package/dist/utils/docker-checker.js +31 -0
- package/dist/utils/docker-checker.js.map +1 -0
- package/dist/utils/env-loader.d.ts +32 -0
- package/dist/utils/env-loader.d.ts.map +1 -0
- package/dist/utils/env-loader.js +113 -0
- package/dist/utils/env-loader.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +25 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/logo.d.ts +2 -0
- package/dist/utils/logo.d.ts.map +1 -0
- package/dist/utils/logo.js +15 -0
- package/dist/utils/logo.js.map +1 -0
- package/dist/utils/os-detector.d.ts +10 -0
- package/dist/utils/os-detector.d.ts.map +1 -0
- package/dist/utils/os-detector.js +76 -0
- package/dist/utils/os-detector.js.map +1 -0
- package/dist/utils/path-helpers.d.ts +9 -0
- package/dist/utils/path-helpers.d.ts.map +1 -0
- package/dist/utils/path-helpers.js +96 -0
- package/dist/utils/path-helpers.js.map +1 -0
- package/dist/utils/port-checker.d.ts +3 -0
- package/dist/utils/port-checker.d.ts.map +1 -0
- package/dist/utils/port-checker.js +45 -0
- package/dist/utils/port-checker.js.map +1 -0
- package/dist/utils/project-files.d.ts +7 -0
- package/dist/utils/project-files.d.ts.map +1 -0
- package/dist/utils/project-files.js +97 -0
- package/dist/utils/project-files.js.map +1 -0
- package/dist/utils/spawn.d.ts +7 -0
- package/dist/utils/spawn.d.ts.map +1 -0
- package/dist/utils/spawn.js +31 -0
- package/dist/utils/spawn.js.map +1 -0
- package/dist/utils/tool-state.d.ts +16 -0
- package/dist/utils/tool-state.d.ts.map +1 -0
- package/dist/utils/tool-state.js +86 -0
- package/dist/utils/tool-state.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runService = void 0;
|
|
4
|
+
const spawn_1 = require("../utils/spawn");
|
|
5
|
+
function buildArgs(options) {
|
|
6
|
+
const args = [];
|
|
7
|
+
if (options?.rm) {
|
|
8
|
+
args.push('--rm');
|
|
9
|
+
}
|
|
10
|
+
if (options?.interactive) {
|
|
11
|
+
args.push('-i');
|
|
12
|
+
}
|
|
13
|
+
if (options?.tty) {
|
|
14
|
+
args.push('-t');
|
|
15
|
+
}
|
|
16
|
+
if (options?.user) {
|
|
17
|
+
args.push('-u', options.user);
|
|
18
|
+
}
|
|
19
|
+
if (options?.volumes) {
|
|
20
|
+
for (const volume of options.volumes) {
|
|
21
|
+
const mode = volume.readonly ? ':ro' : '';
|
|
22
|
+
args.push('-v', `${volume.source}:${volume.target}${mode}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (options?.volumesFrom) {
|
|
26
|
+
args.push('--volumes-from', options.volumesFrom);
|
|
27
|
+
}
|
|
28
|
+
if (options?.name) {
|
|
29
|
+
args.push('--name', options.name);
|
|
30
|
+
}
|
|
31
|
+
return args;
|
|
32
|
+
}
|
|
33
|
+
exports.runService = {
|
|
34
|
+
run(image, command, options) {
|
|
35
|
+
if (options?.tty) {
|
|
36
|
+
throw new Error('TTY mode is not supported for automated container runs');
|
|
37
|
+
}
|
|
38
|
+
const args = ['run', ...buildArgs(options), image, ...command];
|
|
39
|
+
const result = (0, spawn_1.spawnCommand)('docker', args, {
|
|
40
|
+
input: options?.input,
|
|
41
|
+
encoding: 'utf8',
|
|
42
|
+
timeout: 300000
|
|
43
|
+
});
|
|
44
|
+
if (result.error) {
|
|
45
|
+
throw result.error;
|
|
46
|
+
}
|
|
47
|
+
if (result.status === null) {
|
|
48
|
+
throw new Error('docker command not found. Is Docker installed?');
|
|
49
|
+
}
|
|
50
|
+
if (result.status !== 0) {
|
|
51
|
+
throw new Error(`Docker run failed (exit ${result.status}): ${result.stderr?.trim() || 'unknown error'}`);
|
|
52
|
+
}
|
|
53
|
+
return result.stdout ?? '';
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=docker-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-run.js","sourceRoot":"","sources":["../../src/services/docker-run.ts"],"names":[],"mappings":";;;AAAA,0CAA8C;AAa9C,SAAS,SAAS,CAAC,OAAoB;IACrC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAEY,QAAA,UAAU,GAAG;IACxB,GAAG,CAAC,KAAa,EAAE,OAAiB,EAAE,OAAoB;QACxD,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,QAAQ,EAAE,IAAI,EAAE;YAC1C,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,MAAM,CAAC,KAAK,CAAC;QACrB,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;QAC5G,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface DockerVolume {
|
|
2
|
+
Name: string;
|
|
3
|
+
Driver: string;
|
|
4
|
+
Mountpoint: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const volumeService: {
|
|
7
|
+
createVolume(name: string): void;
|
|
8
|
+
exists(name: string): boolean;
|
|
9
|
+
removeVolume(name: string): void;
|
|
10
|
+
list(): DockerVolume[];
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=docker-volume.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-volume.d.ts","sourceRoot":"","sources":["../../src/services/docker-volume.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD,eAAO,MAAM,aAAa;uBACL,MAAM,GAAG,IAAI;iBAOnB,MAAM,GAAG,OAAO;uBASV,MAAM,GAAG,IAAI;YAOxB,YAAY,EAAE;CAiBvB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.volumeService = void 0;
|
|
4
|
+
const spawn_1 = require("../utils/spawn");
|
|
5
|
+
function runDocker(args) {
|
|
6
|
+
const result = (0, spawn_1.spawnCommand)('docker', args, {
|
|
7
|
+
encoding: 'utf8',
|
|
8
|
+
timeout: 30000
|
|
9
|
+
});
|
|
10
|
+
if (result.error) {
|
|
11
|
+
throw result.error;
|
|
12
|
+
}
|
|
13
|
+
if (result.status === null) {
|
|
14
|
+
throw new Error('docker command not found. Is Docker installed?');
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
exports.volumeService = {
|
|
19
|
+
createVolume(name) {
|
|
20
|
+
const result = runDocker(['volume', 'create', name]);
|
|
21
|
+
if (result.status !== 0) {
|
|
22
|
+
throw new Error(`Failed to create volume '${name}': ${result.stderr?.trim() || 'unknown error'}`);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
exists(name) {
|
|
26
|
+
try {
|
|
27
|
+
const result = runDocker(['volume', 'inspect', name]);
|
|
28
|
+
return result.status === 0 && Boolean(result.stdout?.trim());
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
removeVolume(name) {
|
|
35
|
+
const result = runDocker(['volume', 'rm', name]);
|
|
36
|
+
if (result.status !== 0) {
|
|
37
|
+
throw new Error(`Failed to remove volume '${name}': ${result.stderr?.trim() || 'unknown error'}`);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
list() {
|
|
41
|
+
const result = runDocker(['volume', 'ls', '--no-trunc', '--format', '{{json .}}']);
|
|
42
|
+
if (result.status !== 0) {
|
|
43
|
+
throw new Error(`Failed to list volumes: ${result.stderr?.trim() || 'unknown error'}`);
|
|
44
|
+
}
|
|
45
|
+
return (result.stdout ?? '')
|
|
46
|
+
.trim()
|
|
47
|
+
.split(/\r?\n/)
|
|
48
|
+
.filter(Boolean)
|
|
49
|
+
.map((line) => JSON.parse(line))
|
|
50
|
+
.map((item) => ({
|
|
51
|
+
Name: item.Name ?? '',
|
|
52
|
+
Driver: item.Driver ?? '',
|
|
53
|
+
Mountpoint: item.Mountpoint ?? ''
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=docker-volume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-volume.js","sourceRoot":"","sources":["../../src/services/docker-volume.ts"],"names":[],"mappings":";;;AACA,0CAA8C;AAQ9C,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,QAAQ,EAAE,IAAI,EAAE;QAC1C,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAEY,QAAA,aAAa,GAAG;IAC3B,YAAY,CAAC,IAAY;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YACtD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IAED,IAAI;QACF,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;QACnF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;aACzB,IAAI,EAAE;aACN,KAAK,CAAC,OAAO,CAAC;aACd,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2B,CAAC;aACzD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACd,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;SAClC,CAAC,CAAC,CAAC;IACR,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ResolvedAddress {
|
|
2
|
+
address: string;
|
|
3
|
+
family: number;
|
|
4
|
+
}
|
|
5
|
+
export interface LocalAddressInfo {
|
|
6
|
+
addresses: string[];
|
|
7
|
+
hasExternalIpv6: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface HostResolutionCheck {
|
|
10
|
+
host: string;
|
|
11
|
+
resolved: ResolvedAddress[];
|
|
12
|
+
matched: ResolvedAddress[];
|
|
13
|
+
warnings: string[];
|
|
14
|
+
errors: string[];
|
|
15
|
+
status: 'pass' | 'warn' | 'fail';
|
|
16
|
+
}
|
|
17
|
+
export interface DomainResolutionCheck {
|
|
18
|
+
domain: string;
|
|
19
|
+
wildcardProbeHost: string;
|
|
20
|
+
checkedHosts: HostResolutionCheck[];
|
|
21
|
+
localAddresses: string[];
|
|
22
|
+
hasExternalIpv6: boolean;
|
|
23
|
+
status: 'pass' | 'warn' | 'fail';
|
|
24
|
+
}
|
|
25
|
+
export declare function getLocalAddressInfo(): LocalAddressInfo;
|
|
26
|
+
export declare function checkHostResolution(host: string, resolved: ResolvedAddress[], localInfo: LocalAddressInfo): HostResolutionCheck;
|
|
27
|
+
export declare function wildcardProbeHost(domain: string): string;
|
|
28
|
+
export declare function checkDomainResolvesToThisMachine(domain: string): Promise<DomainResolutionCheck>;
|
|
29
|
+
//# sourceMappingURL=domain-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-checker.d.ts","sourceRoot":"","sources":["../../src/services/domain-checker.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAClC;AAmBD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAoBtD;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,eAAe,EAAE,EAC3B,SAAS,EAAE,gBAAgB,GAC1B,mBAAmB,CAoCrB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAsB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAsCrG"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getLocalAddressInfo = getLocalAddressInfo;
|
|
37
|
+
exports.checkHostResolution = checkHostResolution;
|
|
38
|
+
exports.wildcardProbeHost = wildcardProbeHost;
|
|
39
|
+
exports.checkDomainResolvesToThisMachine = checkDomainResolvesToThisMachine;
|
|
40
|
+
const dns_1 = require("dns");
|
|
41
|
+
const net = __importStar(require("net"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
function stripIpv6Scope(address) {
|
|
44
|
+
return address.split('%')[0];
|
|
45
|
+
}
|
|
46
|
+
function normalizeIpv4Mapped(address) {
|
|
47
|
+
const lower = address.toLowerCase();
|
|
48
|
+
if (lower.startsWith('::ffff:')) {
|
|
49
|
+
return lower.slice('::ffff:'.length);
|
|
50
|
+
}
|
|
51
|
+
return lower;
|
|
52
|
+
}
|
|
53
|
+
function normalizeAddress(address) {
|
|
54
|
+
return normalizeIpv4Mapped(stripIpv6Scope(address).trim());
|
|
55
|
+
}
|
|
56
|
+
function getLocalAddressInfo() {
|
|
57
|
+
const addresses = new Set(['127.0.0.1', '::1']);
|
|
58
|
+
let hasExternalIpv6 = false;
|
|
59
|
+
for (const entries of Object.values(os.networkInterfaces())) {
|
|
60
|
+
for (const entry of entries ?? []) {
|
|
61
|
+
const normalized = normalizeAddress(entry.address);
|
|
62
|
+
if (normalized && net.isIP(normalized)) {
|
|
63
|
+
addresses.add(normalized);
|
|
64
|
+
}
|
|
65
|
+
if (entry.family === 'IPv6' && !entry.internal) {
|
|
66
|
+
hasExternalIpv6 = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
addresses: [...addresses],
|
|
72
|
+
hasExternalIpv6
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function checkHostResolution(host, resolved, localInfo) {
|
|
76
|
+
const localAddresses = new Set(localInfo.addresses.map(normalizeAddress));
|
|
77
|
+
const matched = resolved.filter((record) => localAddresses.has(normalizeAddress(record.address)));
|
|
78
|
+
const ipv4Resolved = resolved.filter((record) => record.family === 4);
|
|
79
|
+
const ipv6Resolved = resolved.filter((record) => record.family === 6);
|
|
80
|
+
const ipv4Matched = matched.some((record) => record.family === 4);
|
|
81
|
+
const ipv6Matched = matched.some((record) => record.family === 6);
|
|
82
|
+
const warnings = [];
|
|
83
|
+
const errors = [];
|
|
84
|
+
if (resolved.length === 0) {
|
|
85
|
+
errors.push(`${host} did not resolve to any A or AAAA records.`);
|
|
86
|
+
}
|
|
87
|
+
if (ipv6Resolved.length > 0 && !localInfo.hasExternalIpv6 && !ipv6Matched) {
|
|
88
|
+
warnings.push(`${host} has IPv6 records, but this machine does not appear to have external IPv6 enabled.`);
|
|
89
|
+
}
|
|
90
|
+
if (matched.length === 0) {
|
|
91
|
+
errors.push(`${host} does not resolve to 127.0.0.1, ::1, or any local network interface address.`);
|
|
92
|
+
}
|
|
93
|
+
else if (ipv4Matched && ipv6Resolved.length > 0 && !ipv6Matched) {
|
|
94
|
+
warnings.push(`${host} resolves to this machine over IPv4, but its IPv6 records do not match this machine.`);
|
|
95
|
+
}
|
|
96
|
+
else if (ipv6Matched && ipv4Resolved.length > 0 && !ipv4Matched) {
|
|
97
|
+
warnings.push(`${host} resolves to this machine over IPv6, but its IPv4 records do not match this machine.`);
|
|
98
|
+
}
|
|
99
|
+
const status = errors.length > 0 ? 'fail' : warnings.length > 0 ? 'warn' : 'pass';
|
|
100
|
+
return {
|
|
101
|
+
host,
|
|
102
|
+
resolved,
|
|
103
|
+
matched,
|
|
104
|
+
warnings,
|
|
105
|
+
errors,
|
|
106
|
+
status
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function wildcardProbeHost(domain) {
|
|
110
|
+
return `runestone-wildcard-check.${domain.trim()}`;
|
|
111
|
+
}
|
|
112
|
+
async function checkDomainResolvesToThisMachine(domain) {
|
|
113
|
+
const normalizedDomain = domain.trim();
|
|
114
|
+
const localInfo = getLocalAddressInfo();
|
|
115
|
+
const probeHost = wildcardProbeHost(normalizedDomain);
|
|
116
|
+
const hosts = [probeHost];
|
|
117
|
+
const checkedHosts = [];
|
|
118
|
+
for (const host of hosts) {
|
|
119
|
+
try {
|
|
120
|
+
const resolved = await dns_1.promises.lookup(host, { all: true, verbatim: true });
|
|
121
|
+
checkedHosts.push(checkHostResolution(host, resolved, localInfo));
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
125
|
+
checkedHosts.push({
|
|
126
|
+
host,
|
|
127
|
+
resolved: [],
|
|
128
|
+
matched: [],
|
|
129
|
+
warnings: [],
|
|
130
|
+
errors: [`${host} could not be resolved: ${message}`],
|
|
131
|
+
status: 'fail'
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const status = checkedHosts.some((host) => host.status === 'fail')
|
|
136
|
+
? 'fail'
|
|
137
|
+
: checkedHosts.some((host) => host.status === 'warn')
|
|
138
|
+
? 'warn'
|
|
139
|
+
: 'pass';
|
|
140
|
+
return {
|
|
141
|
+
domain: normalizedDomain,
|
|
142
|
+
wildcardProbeHost: probeHost,
|
|
143
|
+
checkedHosts,
|
|
144
|
+
localAddresses: localInfo.addresses,
|
|
145
|
+
hasExternalIpv6: localInfo.hasExternalIpv6,
|
|
146
|
+
status
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=domain-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-checker.js","sourceRoot":"","sources":["../../src/services/domain-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-checker.d.ts","sourceRoot":"","sources":["../../src/services/port-checker.ts"],"names":[],"mappings":"AAOA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAsB1E;AAiBD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIpE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isListeningLineForPort = isListeningLineForPort;
|
|
4
|
+
exports.isPortAvailable = isPortAvailable;
|
|
5
|
+
const spawn_1 = require("../utils/spawn");
|
|
6
|
+
function addressHasPort(address, port) {
|
|
7
|
+
const escapedPort = String(port).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
8
|
+
return new RegExp(`[:.]${escapedPort}$`).test(address.trim());
|
|
9
|
+
}
|
|
10
|
+
function isListeningLineForPort(line, port) {
|
|
11
|
+
const parts = line.trim().split(/\s+/);
|
|
12
|
+
if (parts.length === 0) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const hasListeningState = parts.some((part) => /^LISTEN(?:ING)?$/i.test(part));
|
|
16
|
+
if (!hasListeningState) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const upperFirst = parts[0].toUpperCase();
|
|
20
|
+
const localAddress = upperFirst === 'LISTEN'
|
|
21
|
+
? parts[3]
|
|
22
|
+
: /^TCP\d*$/i.test(parts[0]) || /^UDP\d*$/i.test(parts[0])
|
|
23
|
+
? parts[3]?.toUpperCase() === 'LISTEN' || parts[3]?.toUpperCase() === 'LISTENING'
|
|
24
|
+
? parts[1]
|
|
25
|
+
: parts[3]
|
|
26
|
+
: undefined;
|
|
27
|
+
return Boolean(localAddress && addressHasPort(localAddress, port));
|
|
28
|
+
}
|
|
29
|
+
function netstatOutput() {
|
|
30
|
+
const args = process.platform === 'win32' ? ['-ano'] : ['-an'];
|
|
31
|
+
const result = (0, spawn_1.spawnCommand)('netstat', args, { encoding: 'utf8' });
|
|
32
|
+
if (result.error) {
|
|
33
|
+
throw result.error;
|
|
34
|
+
}
|
|
35
|
+
if (result.status !== 0) {
|
|
36
|
+
throw new Error(result.stderr?.trim() || 'netstat failed');
|
|
37
|
+
}
|
|
38
|
+
return result.stdout ?? '';
|
|
39
|
+
}
|
|
40
|
+
async function isPortAvailable(port) {
|
|
41
|
+
return !netstatOutput()
|
|
42
|
+
.split(/\r?\n/)
|
|
43
|
+
.some((line) => isListeningLineForPort(line, port));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=port-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-checker.js","sourceRoot":"","sources":["../../src/services/port-checker.ts"],"names":[],"mappings":";;AAOA,wDAsBC;AAiBD,0CAIC;AAlDD,0CAA8C;AAE9C,SAAS,cAAc,CAAC,OAAe,EAAE,IAAY;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACxE,OAAO,IAAI,MAAM,CAAC,OAAO,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,SAAgB,sBAAsB,CAAC,IAAY,EAAE,IAAY;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,YAAY,GAChB,UAAU,KAAK,QAAQ;QACrB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,WAAW;gBAC/E,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACV,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACZ,CAAC,CAAC,SAAS,CAAC;IAElB,OAAO,OAAO,CAAC,YAAY,IAAI,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,SAAS,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;AAC7B,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,OAAO,CAAC,aAAa,EAAE;SACpB,KAAK,CAAC,OAAO,CAAC;SACd,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const sshManager: {
|
|
2
|
+
scanHomeDirectory(): string[];
|
|
3
|
+
listKeys(volumeName?: string): string[];
|
|
4
|
+
addKey(keyPath: string, volumeName?: string): boolean;
|
|
5
|
+
addKeys(keys?: string[], volumeName?: string): void;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=ssh-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh-manager.d.ts","sourceRoot":"","sources":["../../src/services/ssh-manager.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,UAAU;yBACA,MAAM,EAAE;mCAYe,MAAM,EAAE;oBA0BpC,MAAM,wBAAqC,OAAO;mBAwBnD,MAAM,EAAE,wBAAqC,IAAI;CAMjE,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.sshManager = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const os_detector_1 = require("../utils/os-detector");
|
|
40
|
+
const docker_run_1 = require("./docker-run");
|
|
41
|
+
const docker_volume_1 = require("./docker-volume");
|
|
42
|
+
const DEFAULT_VOLUME_NAME = 'runestone-ssh';
|
|
43
|
+
const SSH_MOUNT_PATH = '/root/.ssh';
|
|
44
|
+
const PRIVATE_KEY_NAMES = new Set(['id_rsa', 'id_ecdsa', 'id_ed25519', 'id_dsa']);
|
|
45
|
+
function isPrivateKeyFile(filePath) {
|
|
46
|
+
return PRIVATE_KEY_NAMES.has(path.basename(filePath));
|
|
47
|
+
}
|
|
48
|
+
function quoteForShell(value) {
|
|
49
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
50
|
+
}
|
|
51
|
+
function ensureVolume(volumeName) {
|
|
52
|
+
if (!docker_volume_1.volumeService.exists(volumeName)) {
|
|
53
|
+
docker_volume_1.volumeService.createVolume(volumeName);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function writeFileToVolume(volumeName, basename, content, mode) {
|
|
57
|
+
const target = `${SSH_MOUNT_PATH}/${basename}`;
|
|
58
|
+
const fileMode = mode ?? '644';
|
|
59
|
+
docker_run_1.runService.run('alpine:latest', ['sh', '-c', 'dd of="$1"; chmod "$2" "$1"', 'sh', target, fileMode], {
|
|
60
|
+
rm: true,
|
|
61
|
+
interactive: true,
|
|
62
|
+
volumes: [{ source: volumeName, target: SSH_MOUNT_PATH }],
|
|
63
|
+
input: content
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
exports.sshManager = {
|
|
67
|
+
scanHomeDirectory() {
|
|
68
|
+
const sshDir = os_detector_1.osDetector.sshDir();
|
|
69
|
+
if (!fs.existsSync(sshDir)) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
return fs
|
|
73
|
+
.readdirSync(sshDir)
|
|
74
|
+
.map((file) => path.join(sshDir, file))
|
|
75
|
+
.filter((file) => fs.statSync(file).isFile() && isPrivateKeyFile(file));
|
|
76
|
+
},
|
|
77
|
+
listKeys(volumeName = DEFAULT_VOLUME_NAME) {
|
|
78
|
+
try {
|
|
79
|
+
const output = docker_run_1.runService.run('alpine:latest', [
|
|
80
|
+
'sh',
|
|
81
|
+
'-c',
|
|
82
|
+
'for f in "$1"/*; do [ -f "$f" ] || continue; case "$f" in *.pub) continue;; esac; basename "$f"; done',
|
|
83
|
+
'sh',
|
|
84
|
+
SSH_MOUNT_PATH
|
|
85
|
+
], {
|
|
86
|
+
rm: true,
|
|
87
|
+
volumes: [{ source: volumeName, target: SSH_MOUNT_PATH }]
|
|
88
|
+
});
|
|
89
|
+
return output
|
|
90
|
+
.split(/\r?\n/)
|
|
91
|
+
.map((line) => line.trim())
|
|
92
|
+
.filter(Boolean);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
addKey(keyPath, volumeName = DEFAULT_VOLUME_NAME) {
|
|
99
|
+
const absolutePath = path.resolve(keyPath);
|
|
100
|
+
if (!fs.existsSync(absolutePath)) {
|
|
101
|
+
throw new Error(`SSH key not found: ${absolutePath}`);
|
|
102
|
+
}
|
|
103
|
+
if (!fs.statSync(absolutePath).isFile()) {
|
|
104
|
+
throw new Error(`SSH key is not a file: ${absolutePath}`);
|
|
105
|
+
}
|
|
106
|
+
if (!isPrivateKeyFile(absolutePath)) {
|
|
107
|
+
throw new Error(`File '${path.basename(absolutePath)}' is not a supported SSH private key name`);
|
|
108
|
+
}
|
|
109
|
+
ensureVolume(volumeName);
|
|
110
|
+
const basename = path.basename(absolutePath);
|
|
111
|
+
writeFileToVolume(volumeName, basename, fs.readFileSync(absolutePath, 'utf8'), '600');
|
|
112
|
+
const publicKeyPath = `${absolutePath}.pub`;
|
|
113
|
+
if (fs.existsSync(publicKeyPath) && fs.statSync(publicKeyPath).isFile()) {
|
|
114
|
+
writeFileToVolume(volumeName, `${basename}.pub`, fs.readFileSync(publicKeyPath, 'utf8'));
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
},
|
|
118
|
+
addKeys(keys, volumeName = DEFAULT_VOLUME_NAME) {
|
|
119
|
+
const keyPaths = keys ?? this.scanHomeDirectory();
|
|
120
|
+
for (const keyPath of keyPaths) {
|
|
121
|
+
this.addKey(keyPath, volumeName);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=ssh-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh-manager.js","sourceRoot":"","sources":["../../src/services/ssh-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/utils/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAU,MAAM,WAAW,CAAC;AAyBlD,qBAAa,gBAAiB,SAAQ,OAAO;IAC3C,UAAU,IAAI,IAAI;CAGnB;AAED,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RunestoneCommand = void 0;
|
|
4
|
+
exports.createCommand = createCommand;
|
|
5
|
+
const commander_1 = require("commander");
|
|
6
|
+
class RunestoneHelp extends commander_1.Help {
|
|
7
|
+
commandUsage(cmd) {
|
|
8
|
+
const usage = super.commandUsage(cmd);
|
|
9
|
+
if (this.hasVisibleNonHelpOptions(cmd)) {
|
|
10
|
+
return usage;
|
|
11
|
+
}
|
|
12
|
+
return usage
|
|
13
|
+
.replace(/\s*\[options\]\s*/g, ' ')
|
|
14
|
+
.replace(/\s{2,}/g, ' ')
|
|
15
|
+
.trim();
|
|
16
|
+
}
|
|
17
|
+
visibleOptions(cmd) {
|
|
18
|
+
const options = super.visibleOptions(cmd);
|
|
19
|
+
return this.hasVisibleNonHelpOptions(cmd) ? options : [];
|
|
20
|
+
}
|
|
21
|
+
hasVisibleNonHelpOptions(cmd) {
|
|
22
|
+
return super.visibleOptions(cmd).some((option) => option.short !== '-h' && option.long !== '--help');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
class RunestoneCommand extends commander_1.Command {
|
|
26
|
+
createHelp() {
|
|
27
|
+
return new RunestoneHelp();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.RunestoneCommand = RunestoneCommand;
|
|
31
|
+
function createCommand(name) {
|
|
32
|
+
return new RunestoneCommand(name).addHelpCommand(false);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/utils/command.ts"],"names":[],"mappings":";;;AA+BA,sCAEC;AAjCD,yCAAkD;AAElD,MAAM,aAAc,SAAQ,gBAAI;IAC9B,YAAY,CAAC,GAAY;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,KAAK;aACT,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC;aAClC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,IAAI,EAAE,CAAC;IACZ,CAAC;IAED,cAAc,CAAC,GAAY;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC;IAEO,wBAAwB,CAAC,GAAY;QAC3C,OAAO,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACvG,CAAC;CACF;AAED,MAAa,gBAAiB,SAAQ,mBAAO;IAC3C,UAAU;QACR,OAAO,IAAI,aAAa,EAAE,CAAC;IAC7B,CAAC;CACF;AAJD,4CAIC;AAED,SAAgB,aAAa,CAAC,IAAa;IACzC,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-checker.d.ts","sourceRoot":"","sources":["../../src/utils/docker-checker.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa;mBACT,OAAO;8BAaI,OAAO;CAYlC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dockerChecker = void 0;
|
|
4
|
+
const spawn_1 = require("./spawn");
|
|
5
|
+
exports.dockerChecker = {
|
|
6
|
+
isInstalled() {
|
|
7
|
+
try {
|
|
8
|
+
const result = (0, spawn_1.spawnCommand)('docker', ['--version'], {
|
|
9
|
+
encoding: 'utf8',
|
|
10
|
+
timeout: 5000
|
|
11
|
+
});
|
|
12
|
+
return result.status === 0 && Boolean(result.stdout?.toString().trim());
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
composePluginInstalled() {
|
|
19
|
+
try {
|
|
20
|
+
const result = (0, spawn_1.spawnCommand)('docker', ['compose', 'version'], {
|
|
21
|
+
encoding: 'utf8',
|
|
22
|
+
timeout: 5000
|
|
23
|
+
});
|
|
24
|
+
return result.status === 0 && Boolean(result.stdout?.toString().trim());
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=docker-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-checker.js","sourceRoot":"","sources":["../../src/utils/docker-checker.ts"],"names":[],"mappings":";;;AAAA,mCAAuC;AAE1B,QAAA,aAAa,GAAG;IAC3B,WAAW;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE;gBACnD,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;gBAC5D,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAC"}
|