@intentic/cli 1.22.1 → 1.24.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/app.d.ts.map +1 -1
- package/dist/app.js +103 -57
- package/dist/app.js.map +1 -1
- package/dist/apply-lock.d.ts +12 -0
- package/dist/apply-lock.d.ts.map +1 -0
- package/dist/apply-lock.js +98 -0
- package/dist/apply-lock.js.map +1 -0
- package/dist/generated-secrets.d.ts +2 -1
- package/dist/generated-secrets.d.ts.map +1 -1
- package/dist/generated-secrets.js +13 -18
- package/dist/generated-secrets.js.map +1 -1
- package/dist/migrate.d.ts +20 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +112 -0
- package/dist/migrate.js.map +1 -0
- package/dist/secret-store.d.ts +12 -0
- package/dist/secret-store.d.ts.map +1 -0
- package/dist/secret-store.js +97 -0
- package/dist/secret-store.js.map +1 -0
- package/package.json +7 -7
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAigBpD,eAAO,MAAM,GAAG,qDAUf,CAAC"}
|
package/dist/app.js
CHANGED
|
@@ -1,25 +1,41 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { readFile, writeFile } from "node:fs/promises";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
4
5
|
import { dirname, join } from "node:path";
|
|
5
|
-
import { createStore, plan, prune, reconcile, resolveInputs } from "@intentic/engine";
|
|
6
|
-
import { createProviders, createSshExecutor, createSshProbe, forgejoApi, hostTarget, restoreBackup } from "@intentic/providers";
|
|
6
|
+
import { applyMoves, createStore, plan, prune, reconcile, resolveInputs, rewriteGraphForMoves } from "@intentic/engine";
|
|
7
|
+
import { createProviders, createSshExecutor, createSshProbe, forgejoApi, hostTarget, restoreBackup, } from "@intentic/providers";
|
|
7
8
|
import { resolveState } from "@intentic/state-resolver";
|
|
8
9
|
import { buildApplication, buildCommand, buildRouteMap, numberParser } from "@stricli/core";
|
|
9
10
|
import { collectAccess, formatAccessSummary, writeAccessFile } from "./access.js";
|
|
10
11
|
import { adoptRepos } from "./adopt.js";
|
|
11
12
|
import { GIT_TOKEN_ENV, GIT_TOKEN_SECRET, GIT_USER_SECRET, setRepoSecrets, writeControlPlaneWorkflows, } from "./adopt-pipelines.js";
|
|
13
|
+
import { acquireApplyLock } from "./apply-lock.js";
|
|
12
14
|
import { ACCESS_FILE, ARTIFACT_FILE, ARTIFACT_PATH, CONFIG_FILE, CONFIG_PATH, ENV_FILE, INTENT_DIR, LAST_APPLIED_FILE, loadEnvFile, readArtifact, STATUS_FILE, TARGET_DIR, writeArtifact, writeStatus, } from "./artifact.js";
|
|
13
15
|
import { forgejoIdentity, syncControlPlaneSecrets } from "./control-plane-sync.js";
|
|
14
16
|
import { collectDeployments } from "./deployments.js";
|
|
15
17
|
import { ensureGeneratedSecrets, readGeneratedSecrets } from "./generated-secrets.js";
|
|
16
18
|
import { scaffold } from "./init.js";
|
|
17
19
|
import { createKnownHostsStore } from "./known-hosts.js";
|
|
20
|
+
import { detectHostMoves, migrateHosts } from "./migrate.js";
|
|
18
21
|
import { createOutput, outputMode } from "./output.js";
|
|
19
22
|
import { discoverZone, loadIntent } from "./resolve.js";
|
|
23
|
+
import { createHostSecretStore, createLayeredSecretStore, createLocalSecretStore } from "./secret-store.js";
|
|
20
24
|
import { collectSecrets, writeEnvExample } from "./secrets.js";
|
|
21
25
|
const { version } = createRequire(import.meta.url)("../package.json");
|
|
22
26
|
const DEFAULT_MAX_ITERATIONS = 5;
|
|
27
|
+
const generatedSecretStore = (graph, dir, ssh, backfill, log) => {
|
|
28
|
+
const local = createLocalSecretStore(dir);
|
|
29
|
+
const forgejo = Object.values(graph.resources).find((node) => node.type === "forgejo");
|
|
30
|
+
const serverRef = forgejo?.inputs["server"];
|
|
31
|
+
const hostId = typeof serverRef === "object" && serverRef !== null && "$ref" in serverRef ? serverRef.$ref : undefined;
|
|
32
|
+
const hostNode = hostId !== undefined ? graph.resources[hostId] : undefined;
|
|
33
|
+
if (hostNode === undefined) {
|
|
34
|
+
return local;
|
|
35
|
+
}
|
|
36
|
+
const target = hostTarget(resolveInputs(hostNode.inputs, createStore(), process.env, { lenient: false }));
|
|
37
|
+
return createLayeredSecretStore([createHostSecretStore(target, ssh), local], { backfill, log });
|
|
38
|
+
};
|
|
23
39
|
const init = buildCommand({
|
|
24
40
|
docs: { brief: "Scaffold local intent, desired-state, and app git repos" },
|
|
25
41
|
parameters: {
|
|
@@ -68,7 +84,7 @@ const resolveCommand = buildCommand({
|
|
|
68
84
|
out.text(`set these in ${ENV_FILE} before apply (see ${ENV_FILE}.example): ${envKeys.join(", ")}`);
|
|
69
85
|
}
|
|
70
86
|
if (generated.length > 0) {
|
|
71
|
-
await ensureGeneratedSecrets(dir, generated, process.env);
|
|
87
|
+
await ensureGeneratedSecrets(createLocalSecretStore(dir), generated, process.env);
|
|
72
88
|
out.text(`generated these (stored in .secrets.json): ${generated.join(", ")}`);
|
|
73
89
|
}
|
|
74
90
|
let synced;
|
|
@@ -107,8 +123,8 @@ const planCommand = buildCommand({
|
|
|
107
123
|
const dir = dirname(artifact);
|
|
108
124
|
loadEnvFile(dir);
|
|
109
125
|
const graph = await readArtifact(artifact);
|
|
110
|
-
await ensureGeneratedSecrets(dir, collectSecrets(graph).generated, process.env);
|
|
111
126
|
const ssh = createSshExecutor(createKnownHostsStore(dir));
|
|
127
|
+
await ensureGeneratedSecrets(generatedSecretStore(graph, dir, ssh, false, out.log), collectSecrets(graph).generated, process.env);
|
|
112
128
|
const outcome = await plan(graph, { providers: createProviders({ ssh }), log: out.log, onEvent: out.onEvent });
|
|
113
129
|
for (const step of outcome.steps) {
|
|
114
130
|
out.text(`${step.action}\t${step.type}\t${step.id}${step.reason !== undefined ? `\t(${step.reason})` : ""}`);
|
|
@@ -141,10 +157,14 @@ const apply = buildCommand({
|
|
|
141
157
|
const dir = dirname(artifact);
|
|
142
158
|
loadEnvFile(dir);
|
|
143
159
|
const graph = await readArtifact(artifact);
|
|
144
|
-
await ensureGeneratedSecrets(dir, collectSecrets(graph).generated, process.env);
|
|
145
160
|
const ssh = createSshExecutor(createKnownHostsStore(dir));
|
|
146
|
-
const
|
|
147
|
-
const
|
|
161
|
+
const previousPath = flags.previous ?? join(dir, LAST_APPLIED_FILE);
|
|
162
|
+
const previous = existsSync(previousPath) ? await readArtifact(previousPath) : undefined;
|
|
163
|
+
const hostMoves = previous !== undefined ? detectHostMoves(previous, graph) : [];
|
|
164
|
+
const targets = Object.values(graph.resources)
|
|
165
|
+
.filter((node) => node.type === "host")
|
|
166
|
+
.map((node) => hostTarget(resolveInputs(node.inputs, createStore(), process.env, { lenient: false })));
|
|
167
|
+
const probes = targets.map((target) => createSshProbe(target, ssh));
|
|
148
168
|
const probe = probes.length === 0
|
|
149
169
|
? undefined
|
|
150
170
|
: async (url, status) => {
|
|
@@ -155,58 +175,83 @@ const apply = buildCommand({
|
|
|
155
175
|
}
|
|
156
176
|
return false;
|
|
157
177
|
};
|
|
158
|
-
const
|
|
159
|
-
await
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if (pruned.deleted.length > 0 || pruned.skipped.length > 0) {
|
|
170
|
-
out.text(`pruned ${pruned.deleted.length} resource(s)${pruned.skipped.length > 0 ? `, ${pruned.skipped.length} left in place` : ""}`);
|
|
178
|
+
const oldMoveTargets = hostMoves.map((move) => hostTarget(resolveInputs(move.oldNode.inputs, createStore(), process.env, { lenient: false })));
|
|
179
|
+
const lock = await acquireApplyLock(ssh, [...targets, ...oldMoveTargets], { log: out.log });
|
|
180
|
+
const onSignal = () => {
|
|
181
|
+
void lock.release().finally(() => process.exit(130));
|
|
182
|
+
};
|
|
183
|
+
process.once("SIGINT", onSignal);
|
|
184
|
+
process.once("SIGTERM", onSignal);
|
|
185
|
+
try {
|
|
186
|
+
await ensureGeneratedSecrets(generatedSecretStore(graph, dir, ssh, true, out.log), collectSecrets(graph).generated, process.env);
|
|
187
|
+
if (hostMoves.length > 0) {
|
|
188
|
+
await migrateHosts(hostMoves, { next: graph, ssh, env: process.env, tmpDir: tmpdir(), log: out.log });
|
|
171
189
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
out.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const noops = result.outcome.steps.filter((s) => s.action === "noop").length;
|
|
194
|
-
const summary = [
|
|
195
|
-
`**intentic apply** — ${result.converged ? "✅ converged" : "⚠️ did not converge"} in ${result.iterations} iteration(s)`,
|
|
196
|
-
`📊 ${result.outcome.steps.length} resources: ${creates} created, ${updates} updated, ${noops} unchanged`,
|
|
197
|
-
...(result.outcome.orphans.length > 0 ? [`🗑️ ${result.outcome.orphans.length} orphan(s) detected`] : []),
|
|
198
|
-
].join("\n");
|
|
199
|
-
try {
|
|
200
|
-
await fetch(reconcileWebhook, {
|
|
201
|
-
method: "POST",
|
|
202
|
-
headers: { "Content-Type": "application/json" },
|
|
203
|
-
body: JSON.stringify({ content: summary }),
|
|
204
|
-
});
|
|
190
|
+
const movedApplied = await applyMoves(graph, {
|
|
191
|
+
providers: createProviders({ ssh }),
|
|
192
|
+
log: out.log,
|
|
193
|
+
onEvent: out.onEvent,
|
|
194
|
+
env: process.env,
|
|
195
|
+
});
|
|
196
|
+
const result = await reconcile(graph, { providers: createProviders({ ssh }), log: out.log, onEvent: out.onEvent, ...(probe !== undefined ? { probe } : {}) }, { maxIterations: flags.maxIterations ?? DEFAULT_MAX_ITERATIONS });
|
|
197
|
+
await writeStatus(join(dir, STATUS_FILE), {
|
|
198
|
+
converged: result.converged,
|
|
199
|
+
iterations: result.iterations,
|
|
200
|
+
steps: result.outcome.steps,
|
|
201
|
+
});
|
|
202
|
+
let pruned = { deleted: [], skipped: [] };
|
|
203
|
+
if (previous !== undefined) {
|
|
204
|
+
await lock.renew();
|
|
205
|
+
await lock.verify();
|
|
206
|
+
const baseline = rewriteGraphForMoves(previous, movedApplied);
|
|
207
|
+
pruned = await prune(baseline, graph, { providers: createProviders({ ssh }), log: out.log, onEvent: out.onEvent, env: process.env });
|
|
208
|
+
if (pruned.deleted.length > 0 || pruned.skipped.length > 0) {
|
|
209
|
+
out.text(`pruned ${pruned.deleted.length} resource(s)${pruned.skipped.length > 0 ? `, ${pruned.skipped.length} left in place` : ""}`);
|
|
210
|
+
}
|
|
205
211
|
}
|
|
206
|
-
|
|
207
|
-
|
|
212
|
+
await writeFile(join(dir, LAST_APPLIED_FILE), await readFile(artifact, "utf8"));
|
|
213
|
+
const access = collectAccess(graph, result.outcome.outputs, process.env);
|
|
214
|
+
out.text(`${result.converged ? "converged" : "did not converge"} in ${result.iterations} iteration(s)`);
|
|
215
|
+
if (access.length > 0) {
|
|
216
|
+
await writeAccessFile(join(dir, ACCESS_FILE), access);
|
|
217
|
+
out.text(formatAccessSummary(access));
|
|
218
|
+
}
|
|
219
|
+
out.result({
|
|
220
|
+
converged: result.converged,
|
|
221
|
+
iterations: result.iterations,
|
|
222
|
+
steps: result.outcome.steps,
|
|
223
|
+
outputs: result.outcome.outputs,
|
|
224
|
+
orphans: result.outcome.orphans,
|
|
225
|
+
pruned,
|
|
226
|
+
access,
|
|
227
|
+
});
|
|
228
|
+
const reconcileWebhook = result.outcome.outputs["discord"]?.["reconcileWebhook"];
|
|
229
|
+
if (typeof reconcileWebhook === "string" && reconcileWebhook !== "") {
|
|
230
|
+
const creates = result.outcome.steps.filter((s) => s.action === "create").length;
|
|
231
|
+
const updates = result.outcome.steps.filter((s) => s.action === "update").length;
|
|
232
|
+
const noops = result.outcome.steps.filter((s) => s.action === "noop").length;
|
|
233
|
+
const summary = [
|
|
234
|
+
`**intentic apply** — ${result.converged ? "✅ converged" : "⚠️ did not converge"} in ${result.iterations} iteration(s)`,
|
|
235
|
+
`📊 ${result.outcome.steps.length} resources: ${creates} created, ${updates} updated, ${noops} unchanged`,
|
|
236
|
+
...(result.outcome.orphans.length > 0 ? [`🗑️ ${result.outcome.orphans.length} orphan(s) detected`] : []),
|
|
237
|
+
].join("\n");
|
|
238
|
+
try {
|
|
239
|
+
await fetch(reconcileWebhook, {
|
|
240
|
+
method: "POST",
|
|
241
|
+
headers: { "Content-Type": "application/json" },
|
|
242
|
+
body: JSON.stringify({ content: summary }),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
out.log("discord: failed to post reconcile summary (non-fatal)");
|
|
247
|
+
}
|
|
208
248
|
}
|
|
209
249
|
}
|
|
250
|
+
finally {
|
|
251
|
+
process.removeListener("SIGINT", onSignal);
|
|
252
|
+
process.removeListener("SIGTERM", onSignal);
|
|
253
|
+
await lock.release();
|
|
254
|
+
}
|
|
210
255
|
},
|
|
211
256
|
});
|
|
212
257
|
const adopt = buildCommand({
|
|
@@ -293,7 +338,8 @@ const restore = buildCommand({
|
|
|
293
338
|
const dir = dirname(artifact);
|
|
294
339
|
loadEnvFile(dir);
|
|
295
340
|
const graph = await readArtifact(artifact);
|
|
296
|
-
|
|
341
|
+
const ssh = createSshExecutor(createKnownHostsStore(dir));
|
|
342
|
+
await ensureGeneratedSecrets(generatedSecretStore(graph, dir, ssh, false, out.log), collectSecrets(graph).generated, process.env);
|
|
297
343
|
const backupNode = Object.values(graph.resources).find((node) => node.type === "backup");
|
|
298
344
|
if (backupNode === undefined) {
|
|
299
345
|
throw new Error("no backup resource in the artifact — declare one with i.have.backup and apply it first");
|
|
@@ -327,7 +373,7 @@ const restore = buildCommand({
|
|
|
327
373
|
snapshot: flags.snapshot ?? "latest",
|
|
328
374
|
scope: scope,
|
|
329
375
|
log: out.log,
|
|
330
|
-
executor:
|
|
376
|
+
executor: ssh,
|
|
331
377
|
});
|
|
332
378
|
out.result({ snapshot: flags.snapshot ?? "latest", scope });
|
|
333
379
|
},
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SshExecutor, SshTarget } from "@intentic/providers";
|
|
2
|
+
export interface ApplyLock {
|
|
3
|
+
readonly verify: () => Promise<void>;
|
|
4
|
+
readonly renew: () => Promise<void>;
|
|
5
|
+
readonly release: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare const acquireApplyLock: (executor: SshExecutor, targets: readonly SshTarget[], options?: {
|
|
8
|
+
readonly ttlSeconds?: number;
|
|
9
|
+
readonly holder?: string;
|
|
10
|
+
readonly log?: (message: string) => void;
|
|
11
|
+
}) => Promise<ApplyLock>;
|
|
12
|
+
//# sourceMappingURL=apply-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-lock.d.ts","sourceRoot":"","sources":["../src/apply-lock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAa,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAe7E,MAAM,WAAW,SAAS;IAEtB,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAoED,eAAO,MAAM,gBAAgB,GACzB,UAAU,WAAW,EACrB,SAAS,SAAS,SAAS,EAAE,EAC7B,UAAS;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,KACnH,OAAO,CAAC,SAAS,CAuDnB,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { hostname } from "node:os";
|
|
3
|
+
const LOCK_DIR = "/opt/intentic/apply.lock.d";
|
|
4
|
+
const DEFAULT_TTL_SECONDS = 30 * 60;
|
|
5
|
+
const lockKey = (target) => `${target.address}:${target.port}`;
|
|
6
|
+
const orderedHosts = (targets) => {
|
|
7
|
+
const byKey = new Map();
|
|
8
|
+
for (const target of targets) {
|
|
9
|
+
byKey.set(lockKey(target), target);
|
|
10
|
+
}
|
|
11
|
+
return [...byKey.values()].sort((a, b) => lockKey(a).localeCompare(lockKey(b)));
|
|
12
|
+
};
|
|
13
|
+
const defaultHolder = () => `${hostname()}:${process.pid}`.replace(/[^A-Za-z0-9_.:@-]/g, "-");
|
|
14
|
+
const header = (op, nonce, ttl) => `#APPLYLOCK ${op} ${nonce} ${ttl}\n`;
|
|
15
|
+
const acquireScript = (holder, nonce, ttl) => `${header("acquire", nonce, ttl)}mkdir -p /opt/intentic
|
|
16
|
+
LOCK=${LOCK_DIR}
|
|
17
|
+
META=$LOCK/meta.json
|
|
18
|
+
write() {
|
|
19
|
+
printf '{"holder":"%s","nonce":"%s","expiresAt":%s}\\n' '${holder}' '${nonce}' "$(( $(date +%s) + ${ttl} ))" > "$META"
|
|
20
|
+
chmod 600 "$META" 2>/dev/null || true
|
|
21
|
+
}
|
|
22
|
+
if mkdir "$LOCK" 2>/dev/null; then write; echo ACQUIRED; exit 0; fi
|
|
23
|
+
NOW=$(date +%s)
|
|
24
|
+
EXP=$(sed -n 's/.*"expiresAt":\\([0-9]*\\).*/\\1/p' "$META" 2>/dev/null); [ -z "$EXP" ] && EXP=0
|
|
25
|
+
CUR=$(sed -n 's/.*"holder":"\\([^"]*\\)".*/\\1/p' "$META" 2>/dev/null)
|
|
26
|
+
if [ "$NOW" -ge "$EXP" ]; then write; echo TOOKOVER; exit 0; fi
|
|
27
|
+
echo "HELD $CUR"; exit 1`;
|
|
28
|
+
const verifyScript = (nonce, ttl) => `${header("verify", nonce, ttl)}CUR=$(sed -n 's/.*"nonce":"\\([^"]*\\)".*/\\1/p' ${LOCK_DIR}/meta.json 2>/dev/null)
|
|
29
|
+
[ "$CUR" = '${nonce}' ] && echo OK || echo "LOST $CUR"`;
|
|
30
|
+
const renewScript = (holder, nonce, ttl) => `${header("renew", nonce, ttl)}LOCK=${LOCK_DIR}
|
|
31
|
+
META=$LOCK/meta.json
|
|
32
|
+
CUR=$(sed -n 's/.*"nonce":"\\([^"]*\\)".*/\\1/p' "$META" 2>/dev/null)
|
|
33
|
+
if [ "$CUR" = '${nonce}' ]; then printf '{"holder":"%s","nonce":"%s","expiresAt":%s}\\n' '${holder}' '${nonce}' "$(( $(date +%s) + ${ttl} ))" > "$META"; echo OK; else echo "LOST $CUR"; fi`;
|
|
34
|
+
const releaseScript = (nonce, ttl) => `${header("release", nonce, ttl)}LOCK=${LOCK_DIR}
|
|
35
|
+
META=$LOCK/meta.json
|
|
36
|
+
CUR=$(sed -n 's/.*"nonce":"\\([^"]*\\)".*/\\1/p' "$META" 2>/dev/null)
|
|
37
|
+
if [ "$CUR" = '${nonce}' ]; then rm -f "$META"; rmdir "$LOCK" 2>/dev/null; echo RELEASED; else echo "SKIP $CUR"; fi`;
|
|
38
|
+
const run = async (executor, target, command) => {
|
|
39
|
+
const session = await executor.connect(target);
|
|
40
|
+
try {
|
|
41
|
+
return await session.exec(command);
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
await session.dispose();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
export const acquireApplyLock = async (executor, targets, options = {}) => {
|
|
48
|
+
const ttl = options.ttlSeconds ?? DEFAULT_TTL_SECONDS;
|
|
49
|
+
const holder = options.holder ?? defaultHolder();
|
|
50
|
+
const nonce = randomBytes(16).toString("hex");
|
|
51
|
+
const log = options.log ?? (() => { });
|
|
52
|
+
const held = [];
|
|
53
|
+
const releaseAll = async () => {
|
|
54
|
+
for (const target of held) {
|
|
55
|
+
try {
|
|
56
|
+
await run(executor, target, releaseScript(nonce, ttl));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
log(`apply-lock: failed to release ${lockKey(target)} (it frees after its TTL): ${String(error)}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
for (const target of orderedHosts(targets)) {
|
|
64
|
+
let result;
|
|
65
|
+
try {
|
|
66
|
+
result = await run(executor, target, acquireScript(holder, nonce, ttl));
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
log(`apply-lock: ${lockKey(target)} is not reachable, skipping its lock: ${String(error)}`);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const outcome = result.stdout.trim();
|
|
73
|
+
if (outcome.startsWith("ACQUIRED") || outcome.startsWith("TOOKOVER")) {
|
|
74
|
+
held.push(target);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
await releaseAll();
|
|
78
|
+
const who = outcome.replace(/^HELD\s*/, "");
|
|
79
|
+
throw new Error(`another intentic run holds the apply lock on ${lockKey(target)}${who !== "" ? ` (held by ${who})` : ""} — wait for it to finish, or if it crashed the lock frees after its TTL`);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
verify: async () => {
|
|
83
|
+
for (const target of held) {
|
|
84
|
+
const result = await run(executor, target, verifyScript(nonce, ttl));
|
|
85
|
+
if (!result.stdout.trim().startsWith("OK")) {
|
|
86
|
+
throw new Error(`apply lock on ${lockKey(target)} was taken over by another run — aborting before mutating to avoid concurrent writers`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
renew: async () => {
|
|
91
|
+
for (const target of held) {
|
|
92
|
+
await run(executor, target, renewScript(holder, nonce, ttl));
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
release: releaseAll,
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=apply-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-lock.js","sourceRoot":"","sources":["../src/apply-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYnC,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAE9C,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,CAAC;AAWpC,MAAM,OAAO,GAAG,CAAC,MAAiB,EAAU,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;AAIlF,MAAM,YAAY,GAAG,CAAC,OAA6B,EAAe,EAAE;IAChE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC3C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC,CAAC;AAIF,MAAM,aAAa,GAAG,GAAW,EAAE,CAAC,GAAG,QAAQ,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;AAItG,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,KAAa,EAAE,GAAW,EAAU,EAAE,CAAC,cAAc,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;AAIxG,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,KAAa,EAAE,GAAW,EAAU,EAAE,CACzE,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC;OAC7B,QAAQ;;;6DAG8C,MAAM,MAAM,KAAK,wBAAwB,GAAG;;;;;;;;yBAQhF,CAAC;AAE1B,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,GAAW,EAAU,EAAE,CACxD,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,oDAAoD,QAAQ;cACjF,KAAK,oCAAoC,CAAC;AAExD,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,KAAa,EAAE,GAAW,EAAU,EAAE,CACvE,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,QAAQ;;;iBAGjC,KAAK,sEAAsE,MAAM,MAAM,KAAK,wBAAwB,GAAG,oDAAoD,CAAC;AAE7L,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,GAAW,EAAU,EAAE,CACzD,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,QAAQ;;;iBAGnC,KAAK,8FAA8F,CAAC;AAErH,MAAM,GAAG,GAAG,KAAK,EAAE,QAAqB,EAAE,MAAiB,EAAE,OAAe,EAAsB,EAAE;IAChG,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC;QACD,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;AACL,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACjC,QAAqB,EACrB,OAA6B,EAC7B,UAAgH,EAAE,EAChG,EAAE;IACpB,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtC,MAAM,IAAI,GAAgB,EAAE,CAAC;IAE7B,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;QACzC,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC;gBACD,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,GAAG,CAAC,iCAAiC,OAAO,CAAC,MAAM,CAAC,8BAA8B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvG,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,IAAI,MAAiB,CAAC;QACtB,IAAI,CAAC;YACD,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,eAAe,OAAO,CAAC,MAAM,CAAC,yCAAyC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5F,SAAS;QACb,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClB,SAAS;QACb,CAAC;QACD,MAAM,UAAU,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,IAAI,KAAK,CACX,gDAAgD,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,yEAAyE,CACnL,CAAC;IACN,CAAC;IAED,OAAO;QACH,MAAM,EAAE,KAAK,IAAI,EAAE;YACf,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBACrE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzC,MAAM,IAAI,KAAK,CACX,iBAAiB,OAAO,CAAC,MAAM,CAAC,uFAAuF,CAC1H,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YACd,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YACjE,CAAC;QACL,CAAC;QACD,OAAO,EAAE,UAAU;KACtB,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { SecretStore } from "./secret-store.js";
|
|
1
2
|
type MutableEnv = Record<string, string | undefined>;
|
|
2
|
-
export declare const ensureGeneratedSecrets: (
|
|
3
|
+
export declare const ensureGeneratedSecrets: (store: SecretStore, keys: readonly string[], env: MutableEnv) => Promise<void>;
|
|
3
4
|
export declare const readGeneratedSecrets: (dir: string) => Promise<Record<string, string>>;
|
|
4
5
|
export {};
|
|
5
6
|
//# sourceMappingURL=generated-secrets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated-secrets.d.ts","sourceRoot":"","sources":["../src/generated-secrets.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generated-secrets.d.ts","sourceRoot":"","sources":["../src/generated-secrets.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAcrD,eAAO,MAAM,sBAAsB,GAAU,OAAO,WAAW,EAAE,MAAM,SAAS,MAAM,EAAE,EAAE,KAAK,UAAU,KAAG,OAAO,CAAC,IAAI,CAcvH,CAAC;AAKF,eAAO,MAAM,oBAAoB,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGtF,CAAC"}
|
|
@@ -1,31 +1,26 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
|
-
import { readFile
|
|
3
|
+
import { readFile } from "node:fs/promises";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { SECRETS_FILE } from "./artifact.js";
|
|
6
6
|
const generate = () => randomBytes(16).toString("hex");
|
|
7
|
-
const
|
|
8
|
-
const readStore = async (path) => existsSync(path) ? JSON.parse(await readFile(path, "utf8")) : {};
|
|
9
|
-
export const ensureGeneratedSecrets = async (dir, keys, env) => {
|
|
10
|
-
if (keys.length === 0) {
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
const path = secretsPath(dir);
|
|
14
|
-
const store = await readStore(path);
|
|
15
|
-
let dirty = false;
|
|
7
|
+
export const ensureGeneratedSecrets = async (store, keys, env) => {
|
|
16
8
|
for (const key of keys) {
|
|
17
9
|
if (env[key] !== undefined && env[key] !== "") {
|
|
18
10
|
continue;
|
|
19
11
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
12
|
+
const existing = await store.get(key);
|
|
13
|
+
if (existing !== undefined) {
|
|
14
|
+
env[key] = existing;
|
|
15
|
+
continue;
|
|
23
16
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
await writeFile(path, `${JSON.stringify(store, undefined, 4)}\n`, { mode: 0o600 });
|
|
17
|
+
const value = generate();
|
|
18
|
+
await store.set(key, value);
|
|
19
|
+
env[key] = value;
|
|
28
20
|
}
|
|
29
21
|
};
|
|
30
|
-
export const readGeneratedSecrets = (dir) =>
|
|
22
|
+
export const readGeneratedSecrets = async (dir) => {
|
|
23
|
+
const path = join(dir, SECRETS_FILE);
|
|
24
|
+
return existsSync(path) ? JSON.parse(await readFile(path, "utf8")) : {};
|
|
25
|
+
};
|
|
31
26
|
//# sourceMappingURL=generated-secrets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated-secrets.js","sourceRoot":"","sources":["../src/generated-secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"generated-secrets.js","sourceRoot":"","sources":["../src/generated-secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAO7C,MAAM,QAAQ,GAAG,GAAW,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAU/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,KAAkB,EAAE,IAAuB,EAAE,GAAe,EAAiB,EAAE;IACxH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;YAC5C,SAAS;QACb,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YACpB,SAAS;QACb,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;AACL,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,GAAW,EAAmC,EAAE;IACvF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;AACxG,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { DesiredStateGraph, ResourceNode } from "@intentic/graph";
|
|
2
|
+
import { type SshExecutor } from "@intentic/providers";
|
|
3
|
+
export interface HostMove {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly oldNode: ResourceNode;
|
|
6
|
+
readonly newNode: ResourceNode;
|
|
7
|
+
readonly oldAddress: string;
|
|
8
|
+
readonly newAddress: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const detectHostMoves: (previous: DesiredStateGraph, next: DesiredStateGraph) => HostMove[];
|
|
11
|
+
interface MigrateArgs {
|
|
12
|
+
readonly next: DesiredStateGraph;
|
|
13
|
+
readonly ssh: SshExecutor;
|
|
14
|
+
readonly env: Record<string, string | undefined>;
|
|
15
|
+
readonly tmpDir: string;
|
|
16
|
+
readonly log: (message: string) => void;
|
|
17
|
+
}
|
|
18
|
+
export declare const migrateHosts: (moves: readonly HostMove[], args: MigrateArgs) => Promise<void>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAOH,KAAK,WAAW,EAInB,MAAM,qBAAqB,CAAC;AAK7B,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC/B;AAID,eAAO,MAAM,eAAe,GAAI,UAAU,iBAAiB,EAAE,MAAM,iBAAiB,KAAG,QAAQ,EAqB9F,CAAC;AAEF,UAAU,WAAW;IACjB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAuGD,eAAO,MAAM,YAAY,GAAU,OAAO,SAAS,QAAQ,EAAE,EAAE,MAAM,WAAW,KAAG,OAAO,CAAC,IAAI,CAI9F,CAAC"}
|
package/dist/migrate.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { rm } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { createStore, resolveInputs } from "@intentic/engine";
|
|
4
|
+
import { hostTarget, isLocalRepo, managedContainers, quiesceHost, restoreBackup, snapshotNow, streamRepoVolume, } from "@intentic/providers";
|
|
5
|
+
export const detectHostMoves = (previous, next) => {
|
|
6
|
+
const moves = [];
|
|
7
|
+
for (const [id, newNode] of Object.entries(next.resources)) {
|
|
8
|
+
if (newNode.type !== "host") {
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
const oldNode = previous.resources[id];
|
|
12
|
+
if (oldNode === undefined || oldNode.type !== "host") {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const oldAddress = oldNode.inputs["address"];
|
|
16
|
+
const newAddress = newNode.inputs["address"];
|
|
17
|
+
if (typeof oldAddress !== "string" || typeof newAddress !== "string") {
|
|
18
|
+
throw new Error(`host "${id}" address is not a literal string; a host migration needs a literal address on both sides`);
|
|
19
|
+
}
|
|
20
|
+
if (oldAddress === newAddress) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
moves.push({ id, oldNode, newNode, oldAddress, newAddress });
|
|
24
|
+
}
|
|
25
|
+
return moves;
|
|
26
|
+
};
|
|
27
|
+
const backupFor = (move, args) => {
|
|
28
|
+
const node = Object.values(args.next.resources).find((n) => n.type === "backup" && n.inputs["address"] === move.newAddress);
|
|
29
|
+
if (node === undefined) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
const resolved = resolveInputs(node.inputs, createStore(), args.env, { lenient: false });
|
|
33
|
+
const { repo, password, image } = resolved;
|
|
34
|
+
if (typeof repo !== "string" || typeof password !== "string" || typeof image !== "string") {
|
|
35
|
+
throw new Error(`backup for host "${move.id}" is missing its repo/password/image inputs`);
|
|
36
|
+
}
|
|
37
|
+
const credentials = {};
|
|
38
|
+
const credsRaw = resolved["credentials"];
|
|
39
|
+
if (typeof credsRaw === "object" && credsRaw !== null) {
|
|
40
|
+
for (const [key, value] of Object.entries(credsRaw)) {
|
|
41
|
+
if (typeof value === "string") {
|
|
42
|
+
credentials[key] = value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { repo, password, image, credentials };
|
|
47
|
+
};
|
|
48
|
+
const migrateHost = async (move, args) => {
|
|
49
|
+
const backup = backupFor(move, args);
|
|
50
|
+
if (backup === undefined) {
|
|
51
|
+
args.log(`host "${move.id}" moved ${move.oldAddress} → ${move.newAddress} but runs no control plane; its data is not migrated (apps are recreated on the new host)`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const newTarget = hostTarget(resolveInputs(move.newNode.inputs, createStore(), args.env, { lenient: false }));
|
|
55
|
+
const oldTarget = hostTarget(resolveInputs(move.oldNode.inputs, createStore(), args.env, { lenient: false }));
|
|
56
|
+
const local = isLocalRepo(backup.repo);
|
|
57
|
+
let oldSession;
|
|
58
|
+
try {
|
|
59
|
+
oldSession = await args.ssh.connect(oldTarget);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (local) {
|
|
63
|
+
throw new Error(`host "${move.id}" moved to ${move.newAddress}, but its old machine ${move.oldAddress} is unreachable and the restic repo lives on it — bring the old host back to migrate its data: ${String(error)}`);
|
|
64
|
+
}
|
|
65
|
+
args.log(`old host ${move.oldAddress} unreachable; restoring "${move.id}" on ${move.newAddress} from the latest snapshot in ${backup.repo} (data is as of the last scheduled backup)`);
|
|
66
|
+
}
|
|
67
|
+
if (oldSession !== undefined) {
|
|
68
|
+
try {
|
|
69
|
+
const managed = await managedContainers(oldSession);
|
|
70
|
+
if (managed.length === 0) {
|
|
71
|
+
args.log(`old host ${move.oldAddress} has no intentic-managed containers; nothing to migrate for "${move.id}"`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
args.log(`migrating host "${move.id}" ${move.oldAddress} → ${move.newAddress} (${managed.length} managed container(s))`);
|
|
75
|
+
await quiesceHost(oldSession);
|
|
76
|
+
await snapshotNow(oldSession, args.log);
|
|
77
|
+
await oldSession.exec("docker stop intentic-backup 2>/dev/null || true");
|
|
78
|
+
if (local) {
|
|
79
|
+
const tarPath = join(args.tmpDir, `intentic-migrate-${move.id}.tgz`);
|
|
80
|
+
const newSession = await args.ssh.connect(newTarget);
|
|
81
|
+
try {
|
|
82
|
+
await streamRepoVolume(oldSession, newSession, backup.image, tarPath, args.log);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
await newSession.dispose();
|
|
86
|
+
await rm(tarPath, { force: true });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await oldSession.dispose();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
await restoreBackup({
|
|
95
|
+
target: newTarget,
|
|
96
|
+
image: backup.image,
|
|
97
|
+
repo: backup.repo,
|
|
98
|
+
password: backup.password,
|
|
99
|
+
credentials: backup.credentials,
|
|
100
|
+
snapshot: "latest",
|
|
101
|
+
scope: "all",
|
|
102
|
+
log: args.log,
|
|
103
|
+
executor: args.ssh,
|
|
104
|
+
});
|
|
105
|
+
args.log(`restored "${move.id}" data onto ${move.newAddress}; reconcile will bring its services up next`);
|
|
106
|
+
};
|
|
107
|
+
export const migrateHosts = async (moves, args) => {
|
|
108
|
+
for (const move of moves) {
|
|
109
|
+
await migrateHost(move, args);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SshExecutor, SshTarget } from "@intentic/providers";
|
|
2
|
+
export interface SecretStore {
|
|
3
|
+
readonly get: (key: string) => Promise<string | undefined>;
|
|
4
|
+
readonly set: (key: string, value: string) => Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export declare const createLocalSecretStore: (dir: string) => SecretStore;
|
|
7
|
+
export declare const createHostSecretStore: (target: SshTarget, executor: SshExecutor) => SecretStore;
|
|
8
|
+
export declare const createLayeredSecretStore: (layers: readonly SecretStore[], options: {
|
|
9
|
+
readonly backfill: boolean;
|
|
10
|
+
readonly log?: (message: string) => void;
|
|
11
|
+
}) => SecretStore;
|
|
12
|
+
//# sourceMappingURL=secret-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-store.d.ts","sourceRoot":"","sources":["../src/secret-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOlE,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3D,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAID,eAAO,MAAM,sBAAsB,GAAI,KAAK,MAAM,KAAG,WAYpD,CAAC;AAOF,eAAO,MAAM,qBAAqB,GAAI,QAAQ,SAAS,EAAE,UAAU,WAAW,KAAG,WAiChF,CAAC;AAOF,eAAO,MAAM,wBAAwB,GACjC,QAAQ,SAAS,WAAW,EAAE,EAC9B,SAAS;IAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,KAClF,WA2CF,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { SECRETS_FILE } from "./artifact.js";
|
|
5
|
+
export const createLocalSecretStore = (dir) => {
|
|
6
|
+
const path = join(dir, SECRETS_FILE);
|
|
7
|
+
const read = async () => existsSync(path) ? JSON.parse(await readFile(path, "utf8")) : {};
|
|
8
|
+
return {
|
|
9
|
+
get: async (key) => (await read())[key],
|
|
10
|
+
set: async (key, value) => {
|
|
11
|
+
const store = await read();
|
|
12
|
+
store[key] = value;
|
|
13
|
+
await writeFile(path, `${JSON.stringify(store, undefined, 4)}\n`, { mode: 0o600 });
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
const HOST_SECRETS_PATH = "/opt/intentic/secrets.json";
|
|
18
|
+
export const createHostSecretStore = (target, executor) => {
|
|
19
|
+
let cache;
|
|
20
|
+
const load = async () => {
|
|
21
|
+
if (cache !== undefined) {
|
|
22
|
+
return cache;
|
|
23
|
+
}
|
|
24
|
+
const session = await executor.connect(target);
|
|
25
|
+
try {
|
|
26
|
+
const result = await session.exec(`cat ${HOST_SECRETS_PATH} 2>/dev/null || echo '{}'`);
|
|
27
|
+
cache = JSON.parse(result.stdout.trim() || "{}");
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
await session.dispose();
|
|
31
|
+
}
|
|
32
|
+
return cache;
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
get: async (key) => (await load())[key],
|
|
36
|
+
set: async (key, value) => {
|
|
37
|
+
const store = await load();
|
|
38
|
+
store[key] = value;
|
|
39
|
+
const json = JSON.stringify(store, undefined, 4);
|
|
40
|
+
const session = await executor.connect(target);
|
|
41
|
+
try {
|
|
42
|
+
await session.exec(`mkdir -p /opt/intentic && cat > ${HOST_SECRETS_PATH}.tmp <<'INTENTIC_SECRETS_EOF'\n${json}\nINTENTIC_SECRETS_EOF\nchmod 600 ${HOST_SECRETS_PATH}.tmp && mv ${HOST_SECRETS_PATH}.tmp ${HOST_SECRETS_PATH}`);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await session.dispose();
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
export const createLayeredSecretStore = (layers, options) => {
|
|
51
|
+
const log = options.log ?? (() => { });
|
|
52
|
+
return {
|
|
53
|
+
get: async (key) => {
|
|
54
|
+
const values = [];
|
|
55
|
+
for (const layer of layers) {
|
|
56
|
+
try {
|
|
57
|
+
values.push(await layer.get(key));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
log(`secret-store: a layer's read of "${key}" failed, skipping it: ${String(error)}`);
|
|
61
|
+
values.push(undefined);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const result = values.find((value) => value !== undefined);
|
|
65
|
+
if (result !== undefined && options.backfill) {
|
|
66
|
+
for (const [i, layer] of layers.entries()) {
|
|
67
|
+
if (values[i] === result) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
await layer.set(key, result);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
log(`secret-store: failed to backfill "${key}" into a layer: ${String(error)}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
},
|
|
80
|
+
set: async (key, value) => {
|
|
81
|
+
let persisted = false;
|
|
82
|
+
for (const layer of layers) {
|
|
83
|
+
try {
|
|
84
|
+
await layer.set(key, value);
|
|
85
|
+
persisted = true;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
log(`secret-store: a layer's write of "${key}" failed: ${String(error)}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (!persisted) {
|
|
92
|
+
throw new Error(`failed to persist generated secret "${key}" to any store`);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=secret-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-store.js","sourceRoot":"","sources":["../src/secret-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intentic/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.24.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -35,11 +35,11 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@stricli/core": "1.2.8",
|
|
37
37
|
"tslib": "2.8.1",
|
|
38
|
-
"@intentic/
|
|
39
|
-
"@intentic/
|
|
40
|
-
"@intentic/
|
|
41
|
-
"@intentic/providers": "1.
|
|
42
|
-
"@intentic/state-resolver": "1.
|
|
38
|
+
"@intentic/engine": "1.24.0",
|
|
39
|
+
"@intentic/need-resolver": "1.24.0",
|
|
40
|
+
"@intentic/graph": "1.24.0",
|
|
41
|
+
"@intentic/providers": "1.24.0",
|
|
42
|
+
"@intentic/state-resolver": "1.24.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/node": "24.13.2",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"typescript": "5.9.3",
|
|
50
50
|
"vitest": "4.1.9",
|
|
51
51
|
"@intentic/tsconfig": "0.0.0",
|
|
52
|
-
"@intentic/sdk": "1.
|
|
52
|
+
"@intentic/sdk": "1.24.0"
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
55
|
"build": "tsc",
|