@homeflare/alchemy 0.54.0 → 0.56.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.
Files changed (62) hide show
  1. package/dist/ceph/ceph-argv-config.d.ts +6 -3
  2. package/dist/ceph/ceph-argv-config.d.ts.map +1 -1
  3. package/dist/ceph/ceph-argv.d.ts +8 -0
  4. package/dist/ceph/ceph-argv.d.ts.map +1 -1
  5. package/dist/ceph/ceph-config-option-form.d.ts +48 -0
  6. package/dist/ceph/ceph-config-option-form.d.ts.map +1 -0
  7. package/dist/ceph/ceph-config-option-reconcile.d.ts +22 -0
  8. package/dist/ceph/ceph-config-option-reconcile.d.ts.map +1 -0
  9. package/dist/ceph/ceph-config-options.d.ts +15 -6
  10. package/dist/ceph/ceph-config-options.d.ts.map +1 -1
  11. package/dist/ceph/config-option.d.ts +10 -0
  12. package/dist/ceph/config-option.d.ts.map +1 -0
  13. package/dist/ceph/index.d.ts +7 -3
  14. package/dist/ceph/index.d.ts.map +1 -1
  15. package/dist/ceph/index.js +363 -8
  16. package/dist/ceph/index.js.map +17 -7
  17. package/dist/launchd/index.js +4 -2
  18. package/dist/launchd/index.js.map +3 -3
  19. package/dist/launchd/sudo-guard-mode.d.ts +10 -4
  20. package/dist/launchd/sudo-guard-mode.d.ts.map +1 -1
  21. package/dist/linux/fake-sudo-root.d.ts.map +1 -1
  22. package/dist/linux/fake-sudo.d.ts +9 -1
  23. package/dist/linux/fake-sudo.d.ts.map +1 -1
  24. package/dist/linux/index.js +47 -9
  25. package/dist/linux/index.js.map +6 -6
  26. package/dist/linux/sudo-guard.d.ts +10 -1
  27. package/dist/linux/sudo-guard.d.ts.map +1 -1
  28. package/dist/linux/sudo-runner.d.ts +15 -1
  29. package/dist/linux/sudo-runner.d.ts.map +1 -1
  30. package/dist/linux/sudo-write.d.ts +4 -1
  31. package/dist/linux/sudo-write.d.ts.map +1 -1
  32. package/dist/proxmox/index.d.ts +1 -0
  33. package/dist/proxmox/index.d.ts.map +1 -1
  34. package/dist/proxmox/index.js +101 -1
  35. package/dist/proxmox/index.js.map +5 -4
  36. package/dist/proxmox/scoped-api.d.ts +49 -0
  37. package/dist/proxmox/scoped-api.d.ts.map +1 -0
  38. package/docs/linux-sudo-review-2026-09-23.md +27 -0
  39. package/docs/linux-sudo.md +28 -40
  40. package/docs/pve-scoped-api.md +23 -0
  41. package/package.json +1 -1
  42. package/src/ceph/ceph-argv-config.ts +27 -19
  43. package/src/ceph/ceph-argv.test.ts +37 -1
  44. package/src/ceph/ceph-argv.ts +25 -0
  45. package/src/ceph/ceph-config-option-form.ts +73 -0
  46. package/src/ceph/ceph-config-option-reconcile.ts +88 -0
  47. package/src/ceph/ceph-config-option.test.ts +213 -0
  48. package/src/ceph/ceph-config-options.test.ts +28 -11
  49. package/src/ceph/ceph-config-options.ts +29 -8
  50. package/src/ceph/config-option.ts +112 -0
  51. package/src/ceph/index.ts +7 -3
  52. package/src/launchd/sudo-guard-mode.ts +11 -3
  53. package/src/linux/fake-sudo-root.ts +15 -0
  54. package/src/linux/fake-sudo.ts +20 -1
  55. package/src/linux/sudo-guard.ts +22 -1
  56. package/src/linux/sudo-runner-privileged-read.test.ts +200 -0
  57. package/src/linux/sudo-runner.ts +59 -4
  58. package/src/linux/sudo-write.ts +5 -1
  59. package/src/proxmox/index.ts +13 -0
  60. package/src/proxmox/scoped-api.test.ts +52 -0
  61. package/src/proxmox/scoped-api.ts +148 -0
  62. package/src/talos/talosctl.test.ts +6 -4
@@ -31,6 +31,15 @@ export declare const assertGuardedChain: (base: HostRunner, prefix: string, path
31
31
  * The mode/owner and read-back checks for a file write under `prefix`, plus the path chain.
32
32
  * ★ Reads only, as the operator — the same checks run at plan time (`checkWrite`) and before the
33
33
  * install/mv pair. `expect` is `'file-or-absent'`: a write may create or replace.
34
+ * ★ `privilegedReads` is the runner's exact-path elevated-read set (sudo-runner.ts): a file on it
35
+ * is read back through `sudo -n base64`, so it cannot be stranded by its own mode — every
36
+ * other refusal below applies to it unchanged.
37
+ * ⛔ A LISTED FILE MAY NEVER BE HANDED TO A NON-ROOT UID, whatever its mode: its read back is
38
+ * the elevated one, which refuses anything but a root-owned regular file, so a handoff with
39
+ * operator-readable other bits (0644 uid 1001) would sail through the plain read-back check,
40
+ * land, and die at EVERY later read — the stranding this guard exists to prevent (glm seat
41
+ * round, 2026-10-18). Refused up front instead. An omitted owner is root under a prefix, so
42
+ * plain root writes are untouched.
34
43
  */
35
- export declare const assertInstallable: (base: HostRunner, prefix: string, path: string, options: WriteOptions, groups: readonly number[] | undefined) => Promise<void>;
44
+ export declare const assertInstallable: (base: HostRunner, prefix: string, path: string, options: WriteOptions, groups: readonly number[] | undefined, privilegedReads?: ReadonlySet<string>) => Promise<void>;
36
45
  //# sourceMappingURL=sudo-guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sudo-guard.d.ts","sourceRoot":"","sources":["../../src/linux/sudo-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,OAAO,EACP,WAAW,EACX,cAAc,EACf,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AAgB5F,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,gBAAgB,GAAG,WAAW,GAAG,QAAQ,CAAC;AAmB7E;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,SACvB,UAAU,UACR,MAAM,QACR,MAAM,UACJ,WAAW,KAClB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAyC9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SACtB,UAAU,UACR,MAAM,QACR,MAAM,WACH,YAAY,UACb,SAAS,MAAM,EAAE,GAAG,SAAS,KACpC,OAAO,CAAC,IAAI,CAWd,CAAC"}
1
+ {"version":3,"file":"sudo-guard.d.ts","sourceRoot":"","sources":["../../src/linux/sudo-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,OAAO,EACP,WAAW,EACX,cAAc,EACf,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AAgB5F,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,gBAAgB,GAAG,WAAW,GAAG,QAAQ,CAAC;AAmB7E;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,SACvB,UAAU,UACR,MAAM,QACR,MAAM,UACJ,WAAW,KAClB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAyC9B,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,SACtB,UAAU,UACR,MAAM,QACR,MAAM,WACH,YAAY,UACb,SAAS,MAAM,EAAE,GAAG,SAAS,oBACnB,WAAW,CAAC,MAAM,CAAC,KACpC,OAAO,CAAC,IAAI,CAsBd,CAAC"}
@@ -8,7 +8,9 @@
8
8
  * is the "no silent sudo" failure this exists to prevent.
9
9
  * ⛔ EVERY PRIVILEGED ARGV IS LOGGED BEFORE IT RUNS, and a file's bytes never reach argv or the
10
10
  * log: they travel through the staged file (sudo-stage.ts) alone.
11
- * ⛔ A PLAN NEVER ELEVATES. `checkWrite` and every read run through `base` — the plain
11
+ * ⛔ A PLAN ELEVATES EXACTLY ONE KIND OF CALL: the `privilegedReads` file's own read (below) —
12
+ * the read a plan diff needs on a declared root-owned file. Every other read, and every
13
+ * `checkWrite` host probe (`id -G`, `ls`, `stat`), runs through `base` — the plain
12
14
  * `sshRunner()` — never through sudo. Nothing here probes sudo at construction.
13
15
  * ★ PROMISES, NOT EFFECTS, ON PURPOSE — the same divergence `../launchd/runner.ts` documents
14
16
  * (H3 in the provider-standard skill): a consumer's own runner is a plain async implementation.
@@ -23,6 +25,14 @@ export type SshSudoRunnerOptions = SshRunnerOptions & {
23
25
  readonly prefixes: readonly string[];
24
26
  /** One line per privileged argv, before it runs. @default a line on stderr */
25
27
  readonly log?: (line: string) => void;
28
+ /**
29
+ * ★ Exact absolute paths of root-owned files the operator cannot read but a plan must diff
30
+ * (a declared 0600 file). Each is read with `sudo -n -- /usr/bin/base64 -- <path>`, and ONLY
31
+ * when it is the exact string listed here, a regular file (lstat: never a symlink) and owned
32
+ * by uid 0. ⛔ Not a prefix and not a pattern: a general sudo read would be a root-read
33
+ * primitive reaching every credential on the host, so each file is named one by one.
34
+ */
35
+ readonly privilegedReads?: readonly string[];
26
36
  };
27
37
  /** What a sudo runner is built from. ★ Split out so the tests swap the host, never the logic. */
28
38
  export type SshSudoDeps = {
@@ -30,7 +40,11 @@ export type SshSudoDeps = {
30
40
  readonly base: HostRunner;
31
41
  readonly stage: (bytes: Uint8Array) => Promise<Staged>;
32
42
  readonly log: (line: string) => void;
43
+ readonly privilegedReads?: readonly string[];
33
44
  };
45
+ export declare const BASE64 = "/usr/bin/base64";
46
+ /** Refuses anything but a normalized absolute path: no `.`/`..` segment, no `//`, no trailing `/`. */
47
+ export declare const checkPrivilegedReads: (paths?: readonly string[]) => ReadonlySet<string>;
34
48
  export declare const makeSshSudoRunner: (prefixList: readonly string[], deps: SshSudoDeps) => HostRunner;
35
49
  /** The real sudo runner: `sshRunner()` for everything, `/usr/bin/sudo -n` for the allowlist. */
36
50
  export declare const sshSudoRunner: (options: SshSudoRunnerOptions) => Promise<HostRunner>;
@@ -1 +1 @@
1
- {"version":3,"file":"sudo-runner.d.ts","sourceRoot":"","sources":["../../src/linux/sudo-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,KAAK,gBAAgB,EAAa,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAUL,gBAAgB,EAKjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,MAAM,EAAe,MAAM,iBAAiB,CAAC;AAG3D,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IACpD,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,WAAW,GAAG;IACxB,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,CAAC;AAeF,eAAO,MAAM,iBAAiB,eAAgB,SAAS,MAAM,EAAE,QAAQ,WAAW,KAAG,UA8DpF,CAAC;AAsBF,gGAAgG;AAChG,eAAO,MAAM,aAAa,YAAmB,oBAAoB,KAAG,OAAO,CAAC,UAAU,CAYrF,CAAC"}
1
+ {"version":3,"file":"sudo-runner.d.ts","sourceRoot":"","sources":["../../src/linux/sudo-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,KAAK,gBAAgB,EAAa,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAUL,gBAAgB,EAKjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,MAAM,EAAe,MAAM,iBAAiB,CAAC;AAG3D,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IACpD,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,WAAW,GAAG;IACxB,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C,CAAC;AAEF,eAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,sGAAsG;AACtG,eAAO,MAAM,oBAAoB,WAAW,SAAS,MAAM,EAAE,KAAQ,WAAW,CAAC,MAAM,CActF,CAAC;AAkBF,eAAO,MAAM,iBAAiB,eAAgB,SAAS,MAAM,EAAE,QAAQ,WAAW,KAAG,UAmFpF,CAAC;AAsBF,gGAAgG;AAChG,eAAO,MAAM,aAAa,YAAmB,oBAAoB,KAAG,OAAO,CAAC,UAAU,CAarF,CAAC"}
@@ -11,8 +11,11 @@ export type Elevate = (argv: readonly string[], context?: {
11
11
  * Plan-time and write-time share this: valid mode, the path chain, mode/owner refusals and the
12
12
  * read-back — everything a write can be refused for before anything is staged or run as root.
13
13
  * `undefined` outside every prefix, where the caller falls back to `base` directly.
14
+ * ★ `privilegedReads` is the runner's exact-path elevated-read set: a file on it is read back as
15
+ * root (sudo-runner.ts's readFile), so the read-back refusal does not apply to it — the other
16
+ * checks in assertInstallable still do.
14
17
  */
15
- export declare const vetWrite: (base: HostRunner, prefixes: readonly string[], path: string, options: WriteOptions) => Promise<{
18
+ export declare const vetWrite: (base: HostRunner, prefixes: readonly string[], path: string, options: WriteOptions, privilegedReads?: ReadonlySet<string>) => Promise<{
16
19
  readonly mode: string;
17
20
  readonly prefix: string;
18
21
  } | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"sudo-write.d.ts","sourceRoot":"","sources":["../../src/linux/sudo-write.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAK9C,4FAA4F;AAC5F,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MACoC,CAAC;AAgC/E,oGAAoG;AACpG,MAAM,MAAM,OAAO,GAAG,CACpB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9D,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAC5B,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB;;;;GAIG;AACH,eAAO,MAAM,QAAQ,SACb,UAAU,YACN,SAAS,MAAM,EAAE,QACrB,MAAM,WACH,YAAY,KACpB,OAAO,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CASxE,CAAC;AAsBF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,SACrB,UAAU,WACP,OAAO,SACT,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,QACvC,MAAM,SACL,UAAU,WACR,YAAY,QACf,MAAM,KACX,OAAO,CAAC,IAAI,CAyCd,CAAC"}
1
+ {"version":3,"file":"sudo-write.d.ts","sourceRoot":"","sources":["../../src/linux/sudo-write.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAK9C,4FAA4F;AAC5F,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MACoC,CAAC;AAgC/E,oGAAoG;AACpG,MAAM,MAAM,OAAO,GAAG,CACpB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9D,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAC5B,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,SACb,UAAU,YACN,SAAS,MAAM,EAAE,QACrB,MAAM,WACH,YAAY,oBACH,WAAW,CAAC,MAAM,CAAC,KACpC,OAAO,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CASxE,CAAC;AAsBF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,SACrB,UAAU,WACP,OAAO,SACT,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,QACvC,MAAM,SACL,UAAU,WACR,YAAY,QACf,MAAM,KACX,OAAO,CAAC,IAAI,CAyCd,CAAC"}
@@ -97,4 +97,5 @@ export { ProxmoxStorage, ProxmoxStorageProvider } from './storage.ts';
97
97
  export { ProxmoxUser, ProxmoxUserProvider } from './user.ts';
98
98
  export { type FromEnv } from '../secrets/write-only.ts';
99
99
  export { ProxmoxZfsPool, ProxmoxZfsPoolProvider } from './zfs-pool.ts';
100
+ export { CEPH_FLAGS, CT_CONFIG_KEYS, type CephFlag, type CtConfigPatch, type ScopedCall, type ScopedTier, pveScoped, scopedCalls, scopedTarget, } from './scoped-api.ts';
100
101
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxmox/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxmox/index.ts"],"names":[],"mappings":"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"}
@@ -7383,7 +7383,104 @@ var ProxmoxZfsPoolProvider = () => Provider36.effect(ProxmoxZfsPool, Effect103.s
7383
7383
  yield* destroyPool(olds);
7384
7384
  })
7385
7385
  })));
7386
+ // src/proxmox/scoped-api.ts
7387
+ var scopedTarget = (target, tier) => ({
7388
+ ...target,
7389
+ roles: { read: tier, provision: tier }
7390
+ });
7391
+ var NODE = /^[a-z0-9][a-z0-9-]{0,62}$/;
7392
+ var need = (ok, what) => {
7393
+ if (!ok)
7394
+ throw new Error(`pveScoped: invalid ${what}`);
7395
+ };
7396
+ var node = (n) => (need(NODE.test(n), "node name"), n);
7397
+ var vmid = (v) => (need(Number.isInteger(v) && v >= 100 && v <= 999999999, "vmid"), String(v));
7398
+ var osd = (o) => (need(Number.isInteger(o) && o >= 0 && o < 1e5, "osd id"), String(o));
7399
+ var CEPH_FLAGS = [
7400
+ "noout",
7401
+ "norebalance",
7402
+ "norecover",
7403
+ "nobackfill",
7404
+ "noscrub",
7405
+ "nodeep-scrub"
7406
+ ];
7407
+ var CT_CONFIG_KEYS = [
7408
+ "cores",
7409
+ "cpulimit",
7410
+ "memory",
7411
+ "swap",
7412
+ "onboot",
7413
+ "description",
7414
+ "tags"
7415
+ ];
7416
+ var scopedCalls = {
7417
+ cephStatus: () => ({
7418
+ tier: "ceph-ops",
7419
+ role: "read",
7420
+ method: "GET",
7421
+ path: "/cluster/ceph/status"
7422
+ }),
7423
+ cephFlags: () => ({
7424
+ tier: "ceph-ops",
7425
+ role: "read",
7426
+ method: "GET",
7427
+ path: "/cluster/ceph/flags"
7428
+ }),
7429
+ cephSetFlag: (flag2, on) => {
7430
+ need(CEPH_FLAGS.includes(flag2), "ceph flag");
7431
+ return {
7432
+ tier: "ceph-ops",
7433
+ role: "provision",
7434
+ method: "PUT",
7435
+ path: `/cluster/ceph/flags/${flag2}`,
7436
+ form: { value: on ? "1" : "0" }
7437
+ };
7438
+ },
7439
+ cephOsd: (n, id, to) => {
7440
+ need(to === "in" || to === "out", "osd direction");
7441
+ return {
7442
+ tier: "ceph-ops",
7443
+ role: "provision",
7444
+ method: "POST",
7445
+ path: `/nodes/${node(n)}/ceph/osd/${osd(id)}/${to}`
7446
+ };
7447
+ },
7448
+ ctConfig: (n, id) => ({
7449
+ tier: "ct-config",
7450
+ role: "read",
7451
+ method: "GET",
7452
+ path: `/nodes/${node(n)}/lxc/${vmid(id)}/config`
7453
+ }),
7454
+ ctSetConfig: (n, id, patch) => {
7455
+ const keys = Object.keys(patch);
7456
+ need(keys.length > 0, "empty config patch");
7457
+ for (const k of keys)
7458
+ need(CT_CONFIG_KEYS.includes(k), `config key ${k}`);
7459
+ const form2 = {};
7460
+ for (const [k, v] of Object.entries(patch))
7461
+ form2[k] = typeof v === "boolean" ? v ? "1" : "0" : String(v);
7462
+ return {
7463
+ tier: "ct-config",
7464
+ role: "provision",
7465
+ method: "PUT",
7466
+ path: `/nodes/${node(n)}/lxc/${vmid(id)}/config`,
7467
+ form: form2
7468
+ };
7469
+ },
7470
+ ctPower: (n, id, action) => {
7471
+ need(["start", "shutdown", "reboot"].includes(action), "power action");
7472
+ return {
7473
+ tier: "ct-config",
7474
+ role: "provision",
7475
+ method: "POST",
7476
+ path: `/nodes/${node(n)}/lxc/${vmid(id)}/status/${action}`
7477
+ };
7478
+ }
7479
+ };
7480
+ var pveScoped = (target, call) => pve(scopedTarget(target, call.tier), call.role, call.method, call.path, call.form);
7386
7481
  export {
7482
+ CEPH_FLAGS,
7483
+ CT_CONFIG_KEYS,
7387
7484
  PROVISION_DEFAULTS,
7388
7485
  PROVISION_PRIVILEGES,
7389
7486
  PbsDatastore,
@@ -7460,8 +7557,11 @@ export {
7460
7557
  formViolations,
7461
7558
  provisionBaseline,
7462
7559
  provisionBootstrap,
7560
+ pveScoped,
7561
+ scopedCalls,
7562
+ scopedTarget,
7463
7563
  violations
7464
7564
  };
7465
7565
 
7466
- //# debugId=35034B7C4FF7C46964756E2164756E21
7566
+ //# debugId=5BBCD08A51EE945964756E2164756E21
7467
7567
  //# sourceMappingURL=index.js.map