@superyachttimes/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/dist/commands/recreate-nodejs-api.d.ts +2 -0
- package/dist/commands/recreate-nodejs-api.d.ts.map +1 -0
- package/dist/commands/recreate-nodejs-api.js +113 -0
- package/dist/commands/recreate-nodejs-api.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/portainer/api.d.ts +64 -0
- package/dist/portainer/api.d.ts.map +1 -0
- package/dist/portainer/api.js +74 -0
- package/dist/portainer/api.js.map +1 -0
- package/dist/portainer/urls.d.ts +10 -0
- package/dist/portainer/urls.d.ts.map +1 -0
- package/dist/portainer/urls.js +11 -0
- package/dist/portainer/urls.js.map +1 -0
- package/package.json +25 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recreate-nodejs-api.d.ts","sourceRoot":"","sources":["../../src/commands/recreate-nodejs-api.ts"],"names":[],"mappings":"AAmIA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBvD"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { loadConfig } from "../config.js";
|
|
2
|
+
import * as portainer from "../portainer/api.js";
|
|
3
|
+
function buildNewContainerConfig(container, name) {
|
|
4
|
+
const config = container.Config;
|
|
5
|
+
const hostConfig = container.HostConfig;
|
|
6
|
+
const networkSettings = container.NetworkSettings;
|
|
7
|
+
const networks = networkSettings?.Networks ?? {};
|
|
8
|
+
return {
|
|
9
|
+
...config,
|
|
10
|
+
HostConfig: hostConfig,
|
|
11
|
+
name,
|
|
12
|
+
NetworkingConfig: {
|
|
13
|
+
EndpointsConfig: networks,
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async function recreateInstance(instance, log) {
|
|
18
|
+
const { portainerUrl, portainerEndpointId, portainerApiKey, portainerRegistryAuth, portainerContainerName, } = instance;
|
|
19
|
+
const common = { portainerUrl, portainerEndpointId, portainerApiKey };
|
|
20
|
+
// [Step 1] Get the container information
|
|
21
|
+
log("[Step 1] Get the container information");
|
|
22
|
+
const container = await portainer.getContainer({
|
|
23
|
+
...common,
|
|
24
|
+
portainerContainerName,
|
|
25
|
+
});
|
|
26
|
+
const oldContainerId = container.Id;
|
|
27
|
+
// [Step 2] Pull the latest image
|
|
28
|
+
log("[Step 2] Pull the latest image");
|
|
29
|
+
await portainer.pullImage({
|
|
30
|
+
...common,
|
|
31
|
+
portainerRegistryAuth,
|
|
32
|
+
image: container.Config.Image,
|
|
33
|
+
});
|
|
34
|
+
// [Step 3] Stop the current container
|
|
35
|
+
log("[Step 3] Stop the current container");
|
|
36
|
+
await portainer.stopContainer({
|
|
37
|
+
...common,
|
|
38
|
+
portainerContainerId: oldContainerId,
|
|
39
|
+
});
|
|
40
|
+
// [Step 4] Rename the current container
|
|
41
|
+
log("[Step 4] Rename the current container");
|
|
42
|
+
await portainer.renameContainer({
|
|
43
|
+
...common,
|
|
44
|
+
portainerContainerId: oldContainerId,
|
|
45
|
+
name: `${portainerContainerName}-old`,
|
|
46
|
+
});
|
|
47
|
+
// [Step 5] Create a new container
|
|
48
|
+
log("[Step 5] Create a new container");
|
|
49
|
+
const newContainerConfig = buildNewContainerConfig(container, portainerContainerName);
|
|
50
|
+
const newContainer = await portainer.createContainer({
|
|
51
|
+
...common,
|
|
52
|
+
name: portainerContainerName,
|
|
53
|
+
config: newContainerConfig,
|
|
54
|
+
});
|
|
55
|
+
const newContainerId = newContainer.Id;
|
|
56
|
+
// [Step 6] Connect to networks
|
|
57
|
+
log("[Step 6] Connect to networks");
|
|
58
|
+
const networks = (container.NetworkSettings?.Networks ?? {});
|
|
59
|
+
await Promise.all(Object.keys(networks).map((networkName) => portainer.connectContainerToNetwork({
|
|
60
|
+
...common,
|
|
61
|
+
portainerContainerId: newContainerId,
|
|
62
|
+
networkName,
|
|
63
|
+
})));
|
|
64
|
+
// [Step 7] Start the new container
|
|
65
|
+
log("[Step 7] Start the new container");
|
|
66
|
+
await portainer.startContainer({
|
|
67
|
+
...common,
|
|
68
|
+
portainerContainerId: newContainerId,
|
|
69
|
+
});
|
|
70
|
+
// [Step 8] Update the resource controller
|
|
71
|
+
log("[Step 8] Update the resource controller");
|
|
72
|
+
const resourceControl = container.Portainer?.ResourceControl;
|
|
73
|
+
if (resourceControl) {
|
|
74
|
+
await portainer.updateResourceControl({
|
|
75
|
+
portainerUrl,
|
|
76
|
+
portainerApiKey,
|
|
77
|
+
resourceControlId: resourceControl.Id,
|
|
78
|
+
data: {
|
|
79
|
+
AdministratorsOnly: resourceControl.AdministratorsOnly,
|
|
80
|
+
Public: resourceControl.Public,
|
|
81
|
+
Users: resourceControl.UserAccesses.map((a) => a.UserId),
|
|
82
|
+
Teams: resourceControl.TeamAccesses,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// [Step 9] Delete the old container
|
|
87
|
+
log("[Step 9] Delete the old container");
|
|
88
|
+
await portainer.deleteContainer({
|
|
89
|
+
...common,
|
|
90
|
+
portainerContainerId: oldContainerId,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export async function recreateNodejsApi() {
|
|
94
|
+
const config = loadConfig();
|
|
95
|
+
const results = await Promise.allSettled(config.nodejsApi.map((instance) => {
|
|
96
|
+
const prefix = `[${instance.portainerUrl} (${instance.portainerContainerName})]`;
|
|
97
|
+
const log = (msg) => console.log(`${prefix} ${msg}`);
|
|
98
|
+
log("Starting...");
|
|
99
|
+
return recreateInstance(instance, log).then(() => {
|
|
100
|
+
log("Done.");
|
|
101
|
+
});
|
|
102
|
+
}));
|
|
103
|
+
console.log();
|
|
104
|
+
const failed = results.filter((r) => r.status === "rejected");
|
|
105
|
+
if (failed.length > 0) {
|
|
106
|
+
for (const r of failed) {
|
|
107
|
+
console.error(`Failed: ${r.reason}`);
|
|
108
|
+
}
|
|
109
|
+
throw new Error(`${failed.length}/${results.length} instance(s) failed`);
|
|
110
|
+
}
|
|
111
|
+
console.log(`All ${results.length} instance(s) completed successfully.`);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=recreate-nodejs-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recreate-nodejs-api.js","sourceRoot":"","sources":["../../src/commands/recreate-nodejs-api.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface PortainerInstance {
|
|
2
|
+
portainerUrl: string;
|
|
3
|
+
portainerEndpointId: string;
|
|
4
|
+
portainerApiKey: string;
|
|
5
|
+
portainerRegistryAuth?: string;
|
|
6
|
+
portainerContainerName: string;
|
|
7
|
+
}
|
|
8
|
+
export interface Config {
|
|
9
|
+
nodejsApi: PortainerInstance[];
|
|
10
|
+
}
|
|
11
|
+
export declare function loadConfig(): Config;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAID,wBAAgB,UAAU,IAAI,MAAM,CAiCnC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
const CONFIG_PATH = join(homedir(), ".syt-cli.json");
|
|
5
|
+
export function loadConfig() {
|
|
6
|
+
let raw;
|
|
7
|
+
try {
|
|
8
|
+
raw = readFileSync(CONFIG_PATH, "utf-8");
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
throw new Error(`Config file not found at ${CONFIG_PATH}`);
|
|
12
|
+
}
|
|
13
|
+
const config = JSON.parse(raw);
|
|
14
|
+
if (!Array.isArray(config.nodejsApi) || config.nodejsApi.length === 0) {
|
|
15
|
+
throw new Error(`Config file at ${CONFIG_PATH} must contain a non-empty "nodejsApi" array`);
|
|
16
|
+
}
|
|
17
|
+
for (const [i, instance] of config.nodejsApi.entries()) {
|
|
18
|
+
for (const key of [
|
|
19
|
+
"portainerUrl",
|
|
20
|
+
"portainerEndpointId",
|
|
21
|
+
"portainerApiKey",
|
|
22
|
+
"portainerContainerName",
|
|
23
|
+
]) {
|
|
24
|
+
const value = instance[key];
|
|
25
|
+
if (value == null || String(value).trim().length === 0) {
|
|
26
|
+
throw new Error(`nodejsApi[${i}] is missing required field "${key}"`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Coerce endpointId to string in case it's a number in the JSON
|
|
30
|
+
instance.portainerEndpointId = String(instance.portainerEndpointId);
|
|
31
|
+
}
|
|
32
|
+
return config;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAclC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAErD,MAAM,UAAU,UAAU;IACxB,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,4BAA4B,WAAW,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,kBAAkB,WAAW,6CAA6C,CAC3E,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI;YAChB,cAAc;YACd,qBAAqB;YACrB,iBAAiB;YACjB,wBAAwB;SAChB,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,gCAAgC,GAAG,GAAG,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,gEAAgE;QAChE,QAAQ,CAAC,mBAAmB,GAAG,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { recreateNodejsApi } from "./commands/recreate-nodejs-api.js";
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
|
|
8
|
+
function printHelp() {
|
|
9
|
+
console.log(`syt v${pkg.version} — SuperYachtTimes CLI`);
|
|
10
|
+
console.log();
|
|
11
|
+
console.log("Usage: syt <command> [options]");
|
|
12
|
+
console.log();
|
|
13
|
+
console.log("Commands:");
|
|
14
|
+
console.log(" recreate-nodejs-api Recreate Node.js API containers via Portainer");
|
|
15
|
+
console.log();
|
|
16
|
+
console.log("Options:");
|
|
17
|
+
console.log(" -v, --version Show version");
|
|
18
|
+
console.log(" -h, --help Show this help");
|
|
19
|
+
}
|
|
20
|
+
const args = process.argv.slice(2);
|
|
21
|
+
const command = args[0];
|
|
22
|
+
if (args.includes("--version") || args.includes("-v")) {
|
|
23
|
+
console.log(pkg.version);
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
if (!command || args.includes("--help") || args.includes("-h")) {
|
|
27
|
+
printHelp();
|
|
28
|
+
process.exit(0);
|
|
29
|
+
}
|
|
30
|
+
switch (command) {
|
|
31
|
+
case "recreate-nodejs-api":
|
|
32
|
+
recreateNodejsApi().catch((err) => {
|
|
33
|
+
console.error(`Error: ${err.message}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
});
|
|
36
|
+
break;
|
|
37
|
+
default:
|
|
38
|
+
console.error(`Unknown command: ${command}`);
|
|
39
|
+
printHelp();
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAC7D,CAAC;AAEF,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/D,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,qBAAqB;QACxB,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YACvC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IACR;QACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QAC7C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export declare function getContainer(opts: {
|
|
2
|
+
portainerUrl: string;
|
|
3
|
+
portainerEndpointId: string;
|
|
4
|
+
portainerApiKey: string;
|
|
5
|
+
portainerContainerName: string;
|
|
6
|
+
}): Promise<any>;
|
|
7
|
+
export declare function pullImage(opts: {
|
|
8
|
+
portainerUrl: string;
|
|
9
|
+
portainerEndpointId: string;
|
|
10
|
+
portainerApiKey: string;
|
|
11
|
+
portainerRegistryAuth?: string;
|
|
12
|
+
image: string;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
export declare function stopContainer(opts: {
|
|
15
|
+
portainerUrl: string;
|
|
16
|
+
portainerEndpointId: string;
|
|
17
|
+
portainerApiKey: string;
|
|
18
|
+
portainerContainerId: string;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
export declare function renameContainer(opts: {
|
|
21
|
+
portainerUrl: string;
|
|
22
|
+
portainerEndpointId: string;
|
|
23
|
+
portainerApiKey: string;
|
|
24
|
+
portainerContainerId: string;
|
|
25
|
+
name: string;
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
export declare function createContainer(opts: {
|
|
28
|
+
portainerUrl: string;
|
|
29
|
+
portainerEndpointId: string;
|
|
30
|
+
portainerApiKey: string;
|
|
31
|
+
name: string;
|
|
32
|
+
config: unknown;
|
|
33
|
+
}): Promise<any>;
|
|
34
|
+
export declare function connectContainerToNetwork(opts: {
|
|
35
|
+
portainerUrl: string;
|
|
36
|
+
portainerEndpointId: string;
|
|
37
|
+
portainerApiKey: string;
|
|
38
|
+
portainerContainerId: string;
|
|
39
|
+
networkName: string;
|
|
40
|
+
}): Promise<void>;
|
|
41
|
+
export declare function startContainer(opts: {
|
|
42
|
+
portainerUrl: string;
|
|
43
|
+
portainerEndpointId: string;
|
|
44
|
+
portainerApiKey: string;
|
|
45
|
+
portainerContainerId: string;
|
|
46
|
+
}): Promise<void>;
|
|
47
|
+
export declare function updateResourceControl(opts: {
|
|
48
|
+
portainerUrl: string;
|
|
49
|
+
portainerApiKey: string;
|
|
50
|
+
resourceControlId: number;
|
|
51
|
+
data: {
|
|
52
|
+
AdministratorsOnly: boolean;
|
|
53
|
+
Public: boolean;
|
|
54
|
+
Users: number[];
|
|
55
|
+
Teams: unknown[];
|
|
56
|
+
};
|
|
57
|
+
}): Promise<void>;
|
|
58
|
+
export declare function deleteContainer(opts: {
|
|
59
|
+
portainerUrl: string;
|
|
60
|
+
portainerEndpointId: string;
|
|
61
|
+
portainerApiKey: string;
|
|
62
|
+
portainerContainerId: string;
|
|
63
|
+
}): Promise<void>;
|
|
64
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/portainer/api.ts"],"names":[],"mappings":"AA0CA,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;CAEhC,GAAG,OAAO,CAAC,GAAG,CAAC,CASf;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBhB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,CAShB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB;AAGD,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CAEjB,GAAG,OAAO,CAAC,GAAG,CAAC,CASf;AAED,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAahB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,CAShB;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE;QACJ,kBAAkB,EAAE,OAAO,CAAC;QAC5B,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,OAAO,EAAE,CAAC;KAClB,CAAC;CACH,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,CAShB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as urls from "./urls.js";
|
|
2
|
+
async function request(url, options) {
|
|
3
|
+
const headers = {
|
|
4
|
+
"X-API-Key": options.apiKey,
|
|
5
|
+
};
|
|
6
|
+
if (options.registryAuth) {
|
|
7
|
+
headers["X-Registry-Auth"] = options.registryAuth;
|
|
8
|
+
}
|
|
9
|
+
if (options.body !== undefined) {
|
|
10
|
+
headers["Content-Type"] = "application/json";
|
|
11
|
+
}
|
|
12
|
+
const res = await fetch(url, {
|
|
13
|
+
method: options.method ?? "GET",
|
|
14
|
+
headers,
|
|
15
|
+
body: options.body !== undefined ? JSON.stringify(options.body) : undefined,
|
|
16
|
+
});
|
|
17
|
+
if (!res.ok) {
|
|
18
|
+
const text = await res.text().catch(() => "");
|
|
19
|
+
throw new Error(`Portainer API error: ${options.method ?? "GET"} ${url} → ${res.status} ${res.statusText}${text ? `\n${text}` : ""}`);
|
|
20
|
+
}
|
|
21
|
+
const contentType = res.headers.get("content-type") ?? "";
|
|
22
|
+
if (contentType.includes("application/json")) {
|
|
23
|
+
return res.json();
|
|
24
|
+
}
|
|
25
|
+
return res.text();
|
|
26
|
+
}
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
export async function getContainer(opts) {
|
|
29
|
+
return request(urls.containerUrl(opts.portainerUrl, opts.portainerEndpointId, opts.portainerContainerName), { apiKey: opts.portainerApiKey });
|
|
30
|
+
}
|
|
31
|
+
export async function pullImage(opts) {
|
|
32
|
+
const url = urls.imagePullUrl(opts.portainerUrl, opts.portainerEndpointId, opts.image);
|
|
33
|
+
const headers = {
|
|
34
|
+
"X-API-Key": opts.portainerApiKey,
|
|
35
|
+
};
|
|
36
|
+
if (opts.portainerRegistryAuth) {
|
|
37
|
+
headers["X-Registry-Auth"] = opts.portainerRegistryAuth;
|
|
38
|
+
}
|
|
39
|
+
const res = await fetch(url, { method: "POST", headers });
|
|
40
|
+
if (!res.ok) {
|
|
41
|
+
const text = await res.text().catch(() => "");
|
|
42
|
+
throw new Error(`Portainer API error: POST ${url} → ${res.status} ${res.statusText}${text ? `\n${text}` : ""}`);
|
|
43
|
+
}
|
|
44
|
+
// The pull endpoint returns a stream of newline-delimited JSON progress
|
|
45
|
+
// lines — consume the body without parsing it as a single JSON object.
|
|
46
|
+
await res.text();
|
|
47
|
+
}
|
|
48
|
+
export async function stopContainer(opts) {
|
|
49
|
+
await request(urls.containerStopUrl(opts.portainerUrl, opts.portainerEndpointId, opts.portainerContainerId), { method: "POST", apiKey: opts.portainerApiKey });
|
|
50
|
+
}
|
|
51
|
+
export async function renameContainer(opts) {
|
|
52
|
+
await request(urls.containerRenameUrl(opts.portainerUrl, opts.portainerEndpointId, opts.portainerContainerId, opts.name), { method: "POST", apiKey: opts.portainerApiKey });
|
|
53
|
+
}
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
55
|
+
export async function createContainer(opts) {
|
|
56
|
+
return request(urls.containerCreateUrl(opts.portainerUrl, opts.portainerEndpointId, opts.name), { method: "POST", apiKey: opts.portainerApiKey, body: opts.config });
|
|
57
|
+
}
|
|
58
|
+
export async function connectContainerToNetwork(opts) {
|
|
59
|
+
await request(urls.networkConnectUrl(opts.portainerUrl, opts.portainerEndpointId, opts.networkName), {
|
|
60
|
+
method: "POST",
|
|
61
|
+
apiKey: opts.portainerApiKey,
|
|
62
|
+
body: { Container: opts.portainerContainerId },
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export async function startContainer(opts) {
|
|
66
|
+
await request(urls.containerStartUrl(opts.portainerUrl, opts.portainerEndpointId, opts.portainerContainerId), { method: "POST", apiKey: opts.portainerApiKey });
|
|
67
|
+
}
|
|
68
|
+
export async function updateResourceControl(opts) {
|
|
69
|
+
await request(urls.resourceControlsUrl(opts.portainerUrl, opts.resourceControlId), { method: "PUT", apiKey: opts.portainerApiKey, body: opts.data });
|
|
70
|
+
}
|
|
71
|
+
export async function deleteContainer(opts) {
|
|
72
|
+
await request(urls.containerDeleteUrl(opts.portainerUrl, opts.portainerEndpointId, opts.portainerContainerId), { method: "DELETE", apiKey: opts.portainerApiKey });
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/portainer/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const containerUrl: (baseUrl: string, endpointId: string, containerName: string) => string;
|
|
2
|
+
export declare const containerStopUrl: (baseUrl: string, endpointId: string, containerId: string) => string;
|
|
3
|
+
export declare const containerStartUrl: (baseUrl: string, endpointId: string, containerId: string) => string;
|
|
4
|
+
export declare const containerRenameUrl: (baseUrl: string, endpointId: string, containerId: string, name: string) => string;
|
|
5
|
+
export declare const containerCreateUrl: (baseUrl: string, endpointId: string, name: string) => string;
|
|
6
|
+
export declare const networkConnectUrl: (baseUrl: string, endpointId: string, networkName: string) => string;
|
|
7
|
+
export declare const imagePullUrl: (baseUrl: string, endpointId: string, image: string) => string;
|
|
8
|
+
export declare const containerDeleteUrl: (baseUrl: string, endpointId: string, containerId: string) => string;
|
|
9
|
+
export declare const resourceControlsUrl: (baseUrl: string, resourceControlId: number) => string;
|
|
10
|
+
//# sourceMappingURL=urls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/portainer/urls.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,GACvB,SAAS,MAAM,EACf,YAAY,MAAM,EAClB,eAAe,MAAM,WAC+C,CAAC;AAEvE,eAAO,MAAM,gBAAgB,GAC3B,SAAS,MAAM,EACf,YAAY,MAAM,EAClB,aAAa,MAAM,WAC+C,CAAC;AAErE,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,YAAY,MAAM,EAClB,aAAa,MAAM,WACgD,CAAC;AAEtE,eAAO,MAAM,kBAAkB,GAC7B,SAAS,MAAM,EACf,YAAY,MAAM,EAClB,aAAa,MAAM,EACnB,MAAM,MAAM,WAEkE,CAAC;AAEjF,eAAO,MAAM,kBAAkB,GAC7B,SAAS,MAAM,EACf,YAAY,MAAM,EAClB,MAAM,MAAM,WACsD,CAAC;AAErE,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,YAAY,MAAM,EAClB,aAAa,MAAM,WACgD,CAAC;AAEtE,eAAO,MAAM,YAAY,GACvB,SAAS,MAAM,EACf,YAAY,MAAM,EAClB,OAAO,MAAM,WACuD,CAAC;AAEvE,eAAO,MAAM,kBAAkB,GAC7B,SAAS,MAAM,EACf,YAAY,MAAM,EAClB,aAAa,MAAM,WACyD,CAAC;AAE/E,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,EACf,mBAAmB,MAAM,WACiC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const docker = (baseUrl, endpointId) => `${baseUrl}/api/endpoints/${endpointId}/docker`;
|
|
2
|
+
export const containerUrl = (baseUrl, endpointId, containerName) => `${docker(baseUrl, endpointId)}/containers/${containerName}/json`;
|
|
3
|
+
export const containerStopUrl = (baseUrl, endpointId, containerId) => `${docker(baseUrl, endpointId)}/containers/${containerId}/stop`;
|
|
4
|
+
export const containerStartUrl = (baseUrl, endpointId, containerId) => `${docker(baseUrl, endpointId)}/containers/${containerId}/start`;
|
|
5
|
+
export const containerRenameUrl = (baseUrl, endpointId, containerId, name) => `${docker(baseUrl, endpointId)}/containers/${containerId}/rename?name=${name}`;
|
|
6
|
+
export const containerCreateUrl = (baseUrl, endpointId, name) => `${docker(baseUrl, endpointId)}/containers/create?name=${name}`;
|
|
7
|
+
export const networkConnectUrl = (baseUrl, endpointId, networkName) => `${docker(baseUrl, endpointId)}/networks/${networkName}/connect`;
|
|
8
|
+
export const imagePullUrl = (baseUrl, endpointId, image) => `${docker(baseUrl, endpointId)}/images/create?fromImage=${image}`;
|
|
9
|
+
export const containerDeleteUrl = (baseUrl, endpointId, containerId) => `${docker(baseUrl, endpointId)}/containers/${containerId}?v=1&force=true`;
|
|
10
|
+
export const resourceControlsUrl = (baseUrl, resourceControlId) => `${baseUrl}/api/resource_controls/${resourceControlId}`;
|
|
11
|
+
//# sourceMappingURL=urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/portainer/urls.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,UAAkB,EAAE,EAAE,CACrD,GAAG,OAAO,kBAAkB,UAAU,SAAS,CAAC;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAAe,EACf,UAAkB,EAClB,aAAqB,EACrB,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,eAAe,aAAa,OAAO,CAAC;AAEvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,OAAe,EACf,UAAkB,EAClB,WAAmB,EACnB,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,eAAe,WAAW,OAAO,CAAC;AAErE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAe,EACf,UAAkB,EAClB,WAAmB,EACnB,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,eAAe,WAAW,QAAQ,CAAC;AAEtE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAAe,EACf,UAAkB,EAClB,WAAmB,EACnB,IAAY,EACZ,EAAE,CACF,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,eAAe,WAAW,gBAAgB,IAAI,EAAE,CAAC;AAEjF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAAe,EACf,UAAkB,EAClB,IAAY,EACZ,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,2BAA2B,IAAI,EAAE,CAAC;AAErE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAe,EACf,UAAkB,EAClB,WAAmB,EACnB,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,aAAa,WAAW,UAAU,CAAC;AAEtE,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAAe,EACf,UAAkB,EAClB,KAAa,EACb,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,4BAA4B,KAAK,EAAE,CAAC;AAEvE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAAe,EACf,UAAkB,EAClB,WAAmB,EACnB,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,eAAe,WAAW,iBAAiB,CAAC;AAE/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAe,EACf,iBAAyB,EACzB,EAAE,CAAC,GAAG,OAAO,0BAA0B,iBAAiB,EAAE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@superyachttimes/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "SuperYachtTimes CLI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"syt": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"dev": "tsc --watch",
|
|
15
|
+
"clean": "rm -rf dist",
|
|
16
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
17
|
+
},
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=20"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/node": "^22",
|
|
23
|
+
"typescript": "^5"
|
|
24
|
+
}
|
|
25
|
+
}
|