@calltelemetry/ct-lab-mcp 0.8.104 → 0.8.106

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +13 -3
  2. package/assets/stig/SHA256SUMS +1 -0
  3. package/assets/stig/image/verify-image.sh +28 -0
  4. package/dist/src/generated-version.d.ts +1 -1
  5. package/dist/src/generated-version.js +1 -1
  6. package/dist/src/stig/dist.d.ts +121 -0
  7. package/dist/src/stig/dist.d.ts.map +1 -0
  8. package/dist/src/stig/dist.js +234 -0
  9. package/dist/src/stig/dist.js.map +1 -0
  10. package/dist/src/stig/distribution.d.ts +80 -0
  11. package/dist/src/stig/distribution.d.ts.map +1 -0
  12. package/dist/src/stig/distribution.js +335 -0
  13. package/dist/src/stig/distribution.js.map +1 -0
  14. package/dist/src/stig/live.d.ts +56 -4
  15. package/dist/src/stig/live.d.ts.map +1 -1
  16. package/dist/src/stig/live.js +188 -5
  17. package/dist/src/stig/live.js.map +1 -1
  18. package/dist/src/stig/model.d.ts +2 -1
  19. package/dist/src/stig/model.d.ts.map +1 -1
  20. package/dist/src/stig/model.js +7 -2
  21. package/dist/src/stig/model.js.map +1 -1
  22. package/dist/src/stig/nodes.d.ts +52 -12
  23. package/dist/src/stig/nodes.d.ts.map +1 -1
  24. package/dist/src/stig/nodes.js +90 -11
  25. package/dist/src/stig/nodes.js.map +1 -1
  26. package/dist/src/stig/ports.d.ts +64 -2
  27. package/dist/src/stig/ports.d.ts.map +1 -1
  28. package/dist/src/stig/pve.d.ts +21 -0
  29. package/dist/src/stig/pve.d.ts.map +1 -0
  30. package/dist/src/stig/pve.js +26 -0
  31. package/dist/src/stig/pve.js.map +1 -0
  32. package/dist/src/stig/runner.d.ts +30 -9
  33. package/dist/src/stig/runner.d.ts.map +1 -1
  34. package/dist/src/stig/runner.js +98 -78
  35. package/dist/src/stig/runner.js.map +1 -1
  36. package/dist/src/tools/claimed-import-qcow.d.ts.map +1 -1
  37. package/dist/src/tools/claimed-import-qcow.js +9 -1
  38. package/dist/src/tools/claimed-import-qcow.js.map +1 -1
  39. package/dist/src/tools/import-qcow.d.ts +14 -3
  40. package/dist/src/tools/import-qcow.d.ts.map +1 -1
  41. package/dist/src/tools/import-qcow.js +45 -15
  42. package/dist/src/tools/import-qcow.js.map +1 -1
  43. package/dist/src/tools/slot-tools.d.ts +4 -4
  44. package/dist/src/tools/stig-tools.d.ts +26 -8
  45. package/dist/src/tools/stig-tools.d.ts.map +1 -1
  46. package/dist/src/tools/stig-tools.js +66 -21
  47. package/dist/src/tools/stig-tools.js.map +1 -1
  48. package/package.json +1 -1
@@ -1,14 +1,93 @@
1
- export const STIG_NODE_NAMES = ["minis", "ibm64", "proxmox"];
2
- export const STIG_NODES = Object.freeze({
3
- minis: { claimNode: "minis", hostAssetId: "proxmox-minis-lab", pveNode: "minis", pveHost: "192.168.123.178", vlan: 126 },
4
- ibm64: { claimNode: "ibm64", hostAssetId: "proxmox-ibm64", pveNode: "prox-ibm64", pveHost: "192.168.123.176", vlan: 126 },
5
- proxmox: { claimNode: "proxmox", hostAssetId: "proxmox-lab", pveNode: "proxmox", pveHost: "192.168.123.177", vlan: null },
1
+ /**
2
+ * STIG node map: the single source of per-node host, claim node, thin storage, bridge and VLAN for the three
3
+ * standalone Proxmox nodes, plus the constants of the shared image store. Same values as `nodes.conf` in the
4
+ * ct-meta `rhel8-stig-template` skill (tools/stig-parity.mjs `dist` diffs them).
5
+ *
6
+ * Any field can be overridden for one process with STIG_NODE_<FIELD>_<NODE> (NODE upper-cased, `-` as `_`), for
7
+ * example STIG_NODE_VLAN_PROXMOX= for untagged, or STIG_NODE_HOST_MINIS=... Fields: HOST CLAIM_NODE THIN BRIDGE VLAN.
8
+ * The legacy CT_LAB_STIG_PVE_HOST still selects the minis (build node) host.
9
+ */
10
+ export const STIG_NODE_NAMES = ["minis", "proxmox", "prox-ibm64"];
11
+ /** Names accepted on input and mapped to the canonical node (`ibm64` is the ApplianceClaim node name of prox-ibm64). */
12
+ export const STIG_NODE_ALIASES = Object.freeze({ ibm64: "prox-ibm64" });
13
+ export const STIG_NODE_INPUT_NAMES = [...STIG_NODE_NAMES, ...Object.keys(STIG_NODE_ALIASES)];
14
+ export const STIG_BUILD_NODE = "minis";
15
+ /** The bridge the canonical `lab-inventory stig clone` puts clones on; a node whose clone bridge differs uses the root-SSH path. */
16
+ export const STIG_PROVIDER_BRIDGE = "vmbr0";
17
+ export const STIG_STORE = Object.freeze({
18
+ name: "ct-stig-images",
19
+ server: "192.168.68.125",
20
+ export: "/volume2/sftp/ct-stig-images",
21
+ mount: "/mnt/pve/ct-stig-images",
6
22
  });
7
- export function stigNode(name) {
8
- const n = (name ?? "minis");
9
- const cfg = STIG_NODES[n];
10
- if (!cfg)
11
- throw new Error(`unknown node '${name}'; use one of ${STIG_NODE_NAMES.join(", ")}`);
12
- return cfg;
23
+ export const STIG_EVIDENCE_FPR = "2FE4453D39CA4DE01FD688924E47BB3A054E8D86";
24
+ export const STIG_IMAGE_KEEP_VERSIONS = 3;
25
+ export const STIG_SIGNING_SECRET = "STIG_EVIDENCE_SIGNING_KEY";
26
+ /** minis: vmbr0. proxmox (.177): vmbr1 is the VLAN-aware bridge every guest and the host IP use; its vmbr0 uplink carries no VLAN 126. */
27
+ export const STIG_NODE_MAP = Object.freeze({
28
+ minis: Object.freeze({ name: "minis", host: "192.168.123.178", claimNode: "minis", hostAssetId: "proxmox-minis-lab", thin: "local-lvm", bridge: "vmbr0", vlan: 126, storeOptions: "vers=3" }),
29
+ proxmox: Object.freeze({ name: "proxmox", host: "192.168.123.177", claimNode: "proxmox", hostAssetId: "proxmox-lab", thin: "local-lvm", bridge: "vmbr1", vlan: 126, storeOptions: "vers=3,ro" }),
30
+ "prox-ibm64": Object.freeze({ name: "prox-ibm64", host: "192.168.123.176", claimNode: "ibm64", hostAssetId: "proxmox-ibm64", thin: "local-lvm", bridge: "vmbr0", vlan: 126, storeOptions: "vers=3,ro" }),
31
+ });
32
+ const HOST_RE = /^[A-Za-z0-9]([A-Za-z0-9.-]{0,251}[A-Za-z0-9])?$/;
33
+ const LABEL_RE = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,62}$/;
34
+ export function isStigNodeName(value) {
35
+ return typeof value === "string" && STIG_NODE_NAMES.includes(value);
36
+ }
37
+ /** `ibm64` -> `prox-ibm64`; a canonical name is returned as is; anything else is undefined. */
38
+ export function canonicalNodeName(value) {
39
+ if (isStigNodeName(value))
40
+ return value;
41
+ return typeof value === "string" && Object.hasOwn(STIG_NODE_ALIASES, value) ? STIG_NODE_ALIASES[value] : undefined;
42
+ }
43
+ /** The node with environment overrides applied. Values land in shell command lines, so each is validated. */
44
+ export function resolveStigNode(input, env = process.env) {
45
+ const name = canonicalNodeName(input);
46
+ if (!name)
47
+ throw new Error(`unknown node '${input}' (one of: ${STIG_NODE_NAMES.join(", ")})`);
48
+ const base = STIG_NODE_MAP[name];
49
+ const key = name.toUpperCase().replace(/-/g, "_");
50
+ const ov = (field) => env[`STIG_NODE_${field}_${key}`];
51
+ const pick = (field, dflt, re) => {
52
+ const v = ov(field);
53
+ if (v === undefined)
54
+ return dflt;
55
+ if (!re.test(v))
56
+ throw new Error(`STIG_NODE_${field}_${key} is not a valid ${field.toLowerCase().replace("_", " ")}`);
57
+ return v;
58
+ };
59
+ const legacyHost = name === STIG_BUILD_NODE ? env.CT_LAB_STIG_PVE_HOST?.trim() || undefined : undefined;
60
+ const vlanRaw = ov("VLAN");
61
+ let vlan = base.vlan;
62
+ if (vlanRaw !== undefined) {
63
+ if (vlanRaw === "")
64
+ vlan = null;
65
+ else if (/^\d{1,4}$/.test(vlanRaw) && Number(vlanRaw) >= 1 && Number(vlanRaw) <= 4094)
66
+ vlan = Number(vlanRaw);
67
+ else
68
+ throw new Error(`STIG_NODE_VLAN_${key} must be empty or 1-4094`);
69
+ }
70
+ return {
71
+ ...base,
72
+ host: pick("HOST", legacyHost ?? base.host, HOST_RE),
73
+ claimNode: pick("CLAIM_NODE", base.claimNode, LABEL_RE),
74
+ thin: pick("THIN", base.thin, LABEL_RE),
75
+ bridge: pick("BRIDGE", base.bridge, LABEL_RE),
76
+ vlan,
77
+ };
78
+ }
79
+ /** `bridge=vmbr0,tag=126` (tag omitted when untagged). */
80
+ export const bridgeSpec = (node) => `bridge=${node.bridge}${node.vlan === null ? "" : `,tag=${node.vlan}`}`;
81
+ /** The node whose ApplianceClaim spec.node matches; a claim without spec.node is a minis claim. */
82
+ export function nodeForClaimNode(claimNode, env = process.env) {
83
+ const want = typeof claimNode === "string" && claimNode ? claimNode : "minis";
84
+ for (const n of STIG_NODE_NAMES) {
85
+ const node = resolveStigNode(n, env);
86
+ if (node.claimNode === want)
87
+ return node;
88
+ }
89
+ return null;
13
90
  }
91
+ /** Claim name of a synced (or built) template: tpl-<template> on the build node, tpl-<template>-<node> elsewhere. */
92
+ export const templateClaimName = (template, node) => (node === STIG_BUILD_NODE ? `tpl-${template}` : `tpl-${template}-${node}`);
14
93
  //# sourceMappingURL=nodes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/stig/nodes.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAalF,MAAM,CAAC,MAAM,UAAU,GAA+C,MAAM,CAAC,MAAM,CAAC;IAClF,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE;IACxH,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE;IACzH,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE;CAC1H,CAAC,CAAC;AAEH,MAAM,UAAU,QAAQ,CAAC,IAAwB;IAC/C,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAa,CAAC;IACxC,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,iBAAiB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9F,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/stig/nodes.ts"],"names":[],"mappings":"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"}
@@ -60,7 +60,7 @@ export interface ClaimPort {
60
60
  vmName: string;
61
61
  ttlHours: number;
62
62
  node: string;
63
- stig: Record<string, unknown>;
63
+ stig?: Record<string, unknown>;
64
64
  }): Promise<ClaimRecord>;
65
65
  /** Blocks until an operator reconciled the claim to Ready, or throws. */
66
66
  waitReady(name: string): Promise<ClaimRecord>;
@@ -132,10 +132,72 @@ export interface StigProvider {
132
132
  }): Promise<void>;
133
133
  guestIp(vmid: number, hostAssetId: string): Promise<string>;
134
134
  }
135
+ /** Thin-pool facts of one storage on one node. */
136
+ export interface StoragePort {
137
+ /** `pvesm status --storage`: the storage type (lvmthin is required) and the integer percent used. */
138
+ status(host: string, storage: string): Promise<{
139
+ type: string;
140
+ percent: number;
141
+ }>;
142
+ /** Mapped (allocated) bytes of a template's base LV. Activates it read-only with -K only if inactive, then restores. */
143
+ mappedBytes(host: string, vmid: number): Promise<{
144
+ lvSizeBytes: number;
145
+ mappedPercent: number;
146
+ }>;
147
+ }
148
+ export interface DetachedRun {
149
+ state: "done" | "running" | "failed";
150
+ log: string;
151
+ }
152
+ /**
153
+ * The shared image store (Proxmox storage `ct-stig-images`, read-write on the build node, read-only elsewhere) as seen
154
+ * from one node. Paths are absolute on that node. Every method is a root-SSH fallback (the canonical lab-inventory
155
+ * CLI has no image-store verb).
156
+ */
157
+ export interface ImageStorePort {
158
+ /** true when the store is mounted read-write on the node. */
159
+ isWritable(host: string): Promise<boolean>;
160
+ /** null only when the file is confirmed absent; any other failure throws. */
161
+ readText(host: string, path: string): Promise<string | null>;
162
+ writeText(host: string, path: string, content: string): Promise<void>;
163
+ /** Copies a (large) file from the node to a local path, for signing. */
164
+ fetchFile(host: string, path: string, localFile: string): Promise<void>;
165
+ fileSize(host: string, path: string): Promise<number>;
166
+ /** Runs the script detached (nohup) under `name` unless one is already running; polls until its done marker, failure, or the poll budget. */
167
+ runDetached(host: string, a: {
168
+ name: string;
169
+ script: string;
170
+ doneMarker: string;
171
+ polls: number;
172
+ intervalMs: number;
173
+ }): Promise<DetachedRun>;
174
+ exec(host: string, script: string): Promise<ShellResult>;
175
+ /** true when any process on the node is importing `import/<template>.qcow2`. */
176
+ importing(host: string, template: string): Promise<boolean>;
177
+ /** Runs the pinned verify-image.sh on the node: fingerprint, index.json, template.json and qcow2 sha256 + signatures. Throws on any mismatch. */
178
+ verify(host: string, template: string, fingerprint: string): Promise<{
179
+ qcow2Sha256: string;
180
+ templateJsonSha256: string;
181
+ }>;
182
+ }
183
+ /** Detached GPG signatures with the evidence key (Doppler STIG_EVIDENCE_SIGNING_KEY into an ephemeral GNUPGHOME, SHA-512). Never exposes the key. */
184
+ export interface GpgPort {
185
+ /** Writes `<file>.asc` beside each file; throws unless the signing key is the pinned fingerprint. Returns the public key (armored). */
186
+ signDetached(files: string[], fingerprint: string): Promise<{
187
+ fingerprint: string;
188
+ publicKey: string;
189
+ }>;
190
+ }
135
191
  export interface StigDeps {
136
- /** Canonical provider for guest mutations; absent means the root-SSH `qm` fallback. */
192
+ /** Canonical provider for guest mutations; absent means the root-SSH `qm` fallback. Clones on a node whose clone bridge is not the provider's (vmbr0) also use the fallback. */
137
193
  provider?: StigProvider;
194
+ /** root shell on the build node (minis). */
138
195
  pve: PveShell;
196
+ /** root shell on any node's host (the node map). */
197
+ pveFor: (host: string) => PveShell;
198
+ storage: StoragePort;
199
+ store: ImageStorePort;
200
+ gpg: GpgPort;
139
201
  guest: GuestShell;
140
202
  secrets: SecretStore;
141
203
  claims: ClaimPort;
@@ -1 +1 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/stig/ports.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/stig/ports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /** Small Proxmox helpers shared by the STIG runner and the image distribution (no side effects of their own). */
2
+ import type { ClaimRecord, PveShell } from "./ports.js";
3
+ export type Guest = {
4
+ vmid: number;
5
+ name: string;
6
+ template?: number;
7
+ };
8
+ export declare const VMID_RANGE: {
9
+ readonly min: 8100;
10
+ readonly max: 8899;
11
+ };
12
+ export declare const shq: (s: string) => string;
13
+ export declare function listGuests(shell: PveShell): Promise<Guest[]>;
14
+ /** Lowest free VMID in 8100-8899 that is neither a live guest on the node nor named by any claim. */
15
+ export declare function lowestFreeVmid(guests: Guest[], claims: ClaimRecord[], min?: 8100): number;
16
+ /** `pvesm status --storage X` output: type and the integer percent used (NaN when unreadable). */
17
+ export declare function parsePvesmStatus(stdout: string): {
18
+ type: string;
19
+ percent: number;
20
+ };
21
+ //# sourceMappingURL=pve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pve.d.ts","sourceRoot":"","sources":["../../../src/stig/pve.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,eAAO,MAAM,UAAU;;;CAAoC,CAAC;AAC5D,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,KAAG,MAAyC,CAAC;AAE1E,wBAAsB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAIlE;AAED,qGAAqG;AACrG,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,OAAiB,GAAG,MAAM,CAKnG;AAED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAIlF"}
@@ -0,0 +1,26 @@
1
+ export const VMID_RANGE = { min: 8100, max: 8899 };
2
+ export const shq = (s) => `'${s.replace(/'/g, `'\\''`)}'`;
3
+ export async function listGuests(shell) {
4
+ const r = await shell.run("pvesh get /cluster/resources --type vm --output-format json");
5
+ if (r.code !== 0)
6
+ throw new Error("could not list Proxmox guests");
7
+ return JSON.parse(r.stdout);
8
+ }
9
+ /** Lowest free VMID in 8100-8899 that is neither a live guest on the node nor named by any claim. */
10
+ export function lowestFreeVmid(guests, claims, min = VMID_RANGE.min) {
11
+ const used = new Set(guests.map((g) => g.vmid));
12
+ for (const c of claims)
13
+ if (Number.isInteger(c.spec?.vmid))
14
+ used.add(c.spec.vmid);
15
+ for (let v = min; v <= VMID_RANGE.max; v++)
16
+ if (!used.has(v))
17
+ return v;
18
+ throw new Error(`no free VMID in ${min}-${VMID_RANGE.max}`);
19
+ }
20
+ /** `pvesm status --storage X` output: type and the integer percent used (NaN when unreadable). */
21
+ export function parsePvesmStatus(stdout) {
22
+ const row = (stdout.split("\n")[1] ?? "").trim().split(/\s+/);
23
+ const n = Number.parseFloat((row[row.length - 1] ?? "").replace("%", ""));
24
+ return { type: row[1] ?? "", percent: Number.isFinite(n) ? Math.floor(n) : Number.NaN };
25
+ }
26
+ //# sourceMappingURL=pve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pve.js","sourceRoot":"","sources":["../../../src/stig/pve.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAC5D,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAe;IAC9C,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IACzF,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAY,CAAC;AACzC,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,cAAc,CAAC,MAAe,EAAE,MAAqB,EAAE,GAAG,GAAG,UAAU,CAAC,GAAG;IACzF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClF,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACvE,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1E,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;AAC1F,CAAC"}
@@ -1,20 +1,19 @@
1
1
  import { type StigCounts, type StigDescriptor, type StigReceiptSummary, stigStatusPreview } from "./model.js";
2
- import { type StigNode, type StigNodeConfig } from "./nodes.js";
3
2
  import type { ClaimRecord, StigDeps } from "./ports.js";
3
+ import { type StigNode, type StigNodeName } from "./nodes.js";
4
+ import { VMID_RANGE } from "./pve.js";
5
+ export declare const STIG_NODE_ANNOTATION = "calltelemetry.com/stig-node";
6
+ export { VMID_RANGE };
4
7
  export declare const BUILD_CLAIM_TTL_HOURS = 6;
5
8
  export declare const DEFAULT_CLONE_TTL_HOURS = 48;
6
- export declare const VMID_RANGE: {
7
- readonly min: 8100;
8
- readonly max: 8899;
9
- };
10
9
  export interface ClonePlan {
11
10
  mode: "plan";
12
- node: StigNode;
13
11
  recreate?: {
14
12
  claim: string;
15
13
  uid: string;
16
14
  vmid: number;
17
15
  };
16
+ untagged: boolean;
18
17
  cloneName: string;
19
18
  claim: string;
20
19
  vmid: number;
@@ -22,6 +21,12 @@ export interface ClonePlan {
22
21
  ref: string;
23
22
  vmid: number;
24
23
  };
24
+ node: StigNodeName;
25
+ host: string;
26
+ claimNode: string;
27
+ thin: string;
28
+ bridge: string;
29
+ vlan: number | null;
25
30
  ttlHours: number;
26
31
  poolPercent: number;
27
32
  poolMaxPercent: number;
@@ -47,19 +52,30 @@ export interface BuildPlan {
47
52
  }
48
53
  export declare class StigRunner {
49
54
  private readonly d;
50
- private static reencrypting;
51
- readonly node: StigNodeConfig;
52
- constructor(d: StigDeps, node?: StigNode);
55
+ /** Nodes with a clone re-encrypting in this process: one per node, nodes are independent. */
56
+ private static readonly reencrypting;
57
+ private readonly defaultNode;
58
+ /** `node` is the default for calls that do not name one (create_stig_claim's own `node` argument wins). */
59
+ constructor(d: StigDeps, node?: string);
60
+ get node(): StigNode;
53
61
  private log;
62
+ private sh;
54
63
  private listGuests;
64
+ /** VMIDs are per node: a live guest on the node, or a claim on the node's claim node, occupies one. */
55
65
  private pickVmid;
66
+ /** The canonical lab-inventory clone puts guests on vmbr0; nodes that clone onto another bridge use the root-SSH path. */
67
+ private providerFor;
56
68
  private poolPercent;
69
+ /** The node a claim lives on: its spec.node, which an explicit `node` argument must agree with. */
70
+ private nodeOfClaim;
57
71
  private newestTemplate;
58
72
  private step;
59
73
  private ensureDir;
60
74
  private writeSecretFile;
75
+ private buildNode;
61
76
  planClone(i: {
62
77
  cloneName: string;
78
+ node?: string;
63
79
  templateRef?: string;
64
80
  ttlHours?: number;
65
81
  dns?: string[];
@@ -70,6 +86,7 @@ export declare class StigRunner {
70
86
  }): Promise<ClonePlan>;
71
87
  createClone(i: {
72
88
  cloneName: string;
89
+ node?: string;
73
90
  apply?: boolean;
74
91
  planDigest?: string;
75
92
  templateRef?: string;
@@ -106,18 +123,22 @@ export declare class StigRunner {
106
123
  private annotateSummary;
107
124
  validate(i: {
108
125
  cloneName: string;
126
+ node?: string;
109
127
  requireDisa?: boolean;
110
128
  }): Promise<any>;
111
129
  getReceipt(i: {
112
130
  claim: string;
131
+ node?: string;
113
132
  }): Promise<{
114
133
  claim: string;
134
+ node: StigNodeName;
115
135
  descriptor: Record<string, any> | null;
116
136
  summary: StigReceiptSummary | null;
117
137
  statusPreview: ReturnType<typeof stigStatusPreview>;
118
138
  }>;
119
139
  releaseTemplate(i: {
120
140
  claim: string;
141
+ node?: string;
121
142
  confirmDestroy: boolean;
122
143
  }): Promise<any>;
123
144
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/stig/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/stig/runner.ts"],"names":[],"mappings":"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"}