@homeflare/alchemy 0.15.0 → 0.19.1

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 (516) hide show
  1. package/README.md +29 -0
  2. package/dist/linux/directory-lifecycle.d.ts +50 -0
  3. package/dist/linux/directory-lifecycle.d.ts.map +1 -0
  4. package/dist/linux/directory.d.ts +19 -0
  5. package/dist/linux/directory.d.ts.map +1 -0
  6. package/dist/linux/fake-linux-host.d.ts +35 -0
  7. package/dist/linux/fake-linux-host.d.ts.map +1 -0
  8. package/dist/linux/fake-systemd.d.ts +34 -0
  9. package/dist/linux/fake-systemd.d.ts.map +1 -0
  10. package/dist/linux/index.d.ts +27 -0
  11. package/dist/linux/index.d.ts.map +1 -0
  12. package/dist/linux/index.js +1575 -0
  13. package/dist/linux/index.js.map +38 -0
  14. package/dist/linux/providers.d.ts +17 -0
  15. package/dist/linux/providers.d.ts.map +1 -0
  16. package/dist/linux/region.d.ts +43 -0
  17. package/dist/linux/region.d.ts.map +1 -0
  18. package/dist/linux/remote-file-form.d.ts +47 -0
  19. package/dist/linux/remote-file-form.d.ts.map +1 -0
  20. package/dist/linux/remote-file-lifecycle.d.ts +36 -0
  21. package/dist/linux/remote-file-lifecycle.d.ts.map +1 -0
  22. package/dist/linux/remote-file-plan.d.ts +33 -0
  23. package/dist/linux/remote-file-plan.d.ts.map +1 -0
  24. package/dist/linux/remote-file.d.ts +28 -0
  25. package/dist/linux/remote-file.d.ts.map +1 -0
  26. package/dist/linux/ssh-command.d.ts +68 -0
  27. package/dist/linux/ssh-command.d.ts.map +1 -0
  28. package/dist/linux/ssh-runner.d.ts +22 -0
  29. package/dist/linux/ssh-runner.d.ts.map +1 -0
  30. package/dist/linux/ssh-scripts.d.ts +27 -0
  31. package/dist/linux/ssh-scripts.d.ts.map +1 -0
  32. package/dist/linux/systemctl.d.ts +67 -0
  33. package/dist/linux/systemctl.d.ts.map +1 -0
  34. package/dist/linux/unit-form.d.ts +78 -0
  35. package/dist/linux/unit-form.d.ts.map +1 -0
  36. package/dist/linux/unit-handlers.d.ts +15 -0
  37. package/dist/linux/unit-handlers.d.ts.map +1 -0
  38. package/dist/linux/unit-lifecycle.d.ts +40 -0
  39. package/dist/linux/unit-lifecycle.d.ts.map +1 -0
  40. package/dist/linux/unit-preflight.d.ts +41 -0
  41. package/dist/linux/unit-preflight.d.ts.map +1 -0
  42. package/dist/linux/unit-settle.d.ts +31 -0
  43. package/dist/linux/unit-settle.d.ts.map +1 -0
  44. package/dist/linux/unit.d.ts +35 -0
  45. package/dist/linux/unit.d.ts.map +1 -0
  46. package/dist/netbox/client.d.ts +52 -0
  47. package/dist/netbox/client.d.ts.map +1 -0
  48. package/dist/netbox/constraint-guard.d.ts +26 -0
  49. package/dist/netbox/constraint-guard.d.ts.map +1 -0
  50. package/dist/netbox/constraints.d.ts +76 -0
  51. package/dist/netbox/constraints.d.ts.map +1 -0
  52. package/dist/netbox/generated/constraints/index.d.ts +19 -0
  53. package/dist/netbox/generated/constraints/index.d.ts.map +1 -0
  54. package/dist/netbox/generated/constraints/netbox-ipam.d.ts +21 -0
  55. package/dist/netbox/generated/constraints/netbox-ipam.d.ts.map +1 -0
  56. package/dist/netbox/index.d.ts +17 -0
  57. package/dist/netbox/index.d.ts.map +1 -0
  58. package/dist/netbox/index.js +331 -0
  59. package/dist/netbox/index.js.map +18 -0
  60. package/dist/netbox/prefix-form.d.ts +54 -0
  61. package/dist/netbox/prefix-form.d.ts.map +1 -0
  62. package/dist/netbox/prefix.d.ts +80 -0
  63. package/dist/netbox/prefix.d.ts.map +1 -0
  64. package/dist/netbox/resource.d.ts +94 -0
  65. package/dist/netbox/resource.d.ts.map +1 -0
  66. package/dist/netbox/values.d.ts +24 -0
  67. package/dist/netbox/values.d.ts.map +1 -0
  68. package/dist/proxmox/api-token-form.d.ts.map +1 -1
  69. package/dist/proxmox/apply-endpoints.d.ts +30 -0
  70. package/dist/proxmox/apply-endpoints.d.ts.map +1 -0
  71. package/dist/proxmox/ceph-daemon-form.d.ts +29 -1
  72. package/dist/proxmox/ceph-daemon-form.d.ts.map +1 -1
  73. package/dist/proxmox/ceph-daemon.d.ts.map +1 -1
  74. package/dist/proxmox/ceph-flag.d.ts.map +1 -1
  75. package/dist/proxmox/ceph-fs.d.ts.map +1 -1
  76. package/dist/proxmox/ceph-osd-write.d.ts +19 -0
  77. package/dist/proxmox/ceph-osd-write.d.ts.map +1 -1
  78. package/dist/proxmox/ceph-pool.d.ts.map +1 -1
  79. package/dist/proxmox/constraints.d.ts +28 -5
  80. package/dist/proxmox/constraints.d.ts.map +1 -1
  81. package/dist/proxmox/generated/constraints/index.d.ts +1 -1
  82. package/dist/proxmox/generated/constraints/index.d.ts.map +1 -1
  83. package/dist/proxmox/generated/constraints/pbs-config.d.ts +6 -1
  84. package/dist/proxmox/generated/constraints/pbs-config.d.ts.map +1 -1
  85. package/dist/proxmox/generated/constraints/pve-access.d.ts +6 -1
  86. package/dist/proxmox/generated/constraints/pve-access.d.ts.map +1 -1
  87. package/dist/proxmox/generated/constraints/pve-cluster-backup.d.ts +23 -0
  88. package/dist/proxmox/generated/constraints/pve-cluster-backup.d.ts.map +1 -0
  89. package/dist/proxmox/generated/constraints/pve-cluster-ceph.d.ts +23 -0
  90. package/dist/proxmox/generated/constraints/pve-cluster-ceph.d.ts.map +1 -0
  91. package/dist/proxmox/generated/constraints/pve-cluster-firewall.d.ts +23 -0
  92. package/dist/proxmox/generated/constraints/pve-cluster-firewall.d.ts.map +1 -0
  93. package/dist/proxmox/generated/constraints/pve-cluster-ha.d.ts +23 -0
  94. package/dist/proxmox/generated/constraints/pve-cluster-ha.d.ts.map +1 -0
  95. package/dist/proxmox/generated/constraints/pve-cluster-metrics.d.ts +23 -0
  96. package/dist/proxmox/generated/constraints/pve-cluster-metrics.d.ts.map +1 -0
  97. package/dist/proxmox/generated/constraints/pve-cluster-notifications.d.ts +23 -0
  98. package/dist/proxmox/generated/constraints/pve-cluster-notifications.d.ts.map +1 -0
  99. package/dist/proxmox/generated/constraints/pve-cluster-replication.d.ts +23 -0
  100. package/dist/proxmox/generated/constraints/pve-cluster-replication.d.ts.map +1 -0
  101. package/dist/proxmox/generated/constraints/pve-cluster-sdn.d.ts +23 -0
  102. package/dist/proxmox/generated/constraints/pve-cluster-sdn.d.ts.map +1 -0
  103. package/dist/proxmox/generated/constraints/pve-nodes-ceph.d.ts +23 -0
  104. package/dist/proxmox/generated/constraints/pve-nodes-ceph.d.ts.map +1 -0
  105. package/dist/proxmox/generated/constraints/pve-nodes-disks.d.ts +23 -0
  106. package/dist/proxmox/generated/constraints/pve-nodes-disks.d.ts.map +1 -0
  107. package/dist/proxmox/generated/constraints/pve-nodes-lxc.d.ts +23 -0
  108. package/dist/proxmox/generated/constraints/pve-nodes-lxc.d.ts.map +1 -0
  109. package/dist/proxmox/generated/constraints/pve-nodes-network.d.ts +23 -0
  110. package/dist/proxmox/generated/constraints/pve-nodes-network.d.ts.map +1 -0
  111. package/dist/proxmox/generated/constraints/pve-nodes-qemu.d.ts +23 -0
  112. package/dist/proxmox/generated/constraints/pve-nodes-qemu.d.ts.map +1 -0
  113. package/dist/proxmox/generated/constraints/pve-pools.d.ts +6 -1
  114. package/dist/proxmox/generated/constraints/pve-pools.d.ts.map +1 -1
  115. package/dist/proxmox/generated/constraints/pve-storage.d.ts +6 -1
  116. package/dist/proxmox/generated/constraints/pve-storage.d.ts.map +1 -1
  117. package/dist/proxmox/generated/pbs/access-users.d.ts +137 -0
  118. package/dist/proxmox/generated/pbs/access-users.d.ts.map +1 -0
  119. package/dist/proxmox/generated/pbs/access.d.ts +171 -0
  120. package/dist/proxmox/generated/pbs/access.d.ts.map +1 -0
  121. package/dist/proxmox/generated/pbs/admin-datastore-store.d.ts +252 -0
  122. package/dist/proxmox/generated/pbs/admin-datastore-store.d.ts.map +1 -0
  123. package/dist/proxmox/generated/pbs/admin-metrics.d.ts +147 -0
  124. package/dist/proxmox/generated/pbs/admin-metrics.d.ts.map +1 -0
  125. package/dist/proxmox/generated/pbs/admin.d.ts +217 -0
  126. package/dist/proxmox/generated/pbs/admin.d.ts.map +1 -0
  127. package/dist/proxmox/generated/pbs/backup.d.ts +114 -0
  128. package/dist/proxmox/generated/pbs/backup.d.ts.map +1 -0
  129. package/dist/proxmox/generated/pbs/config-access-pam.d.ts +218 -0
  130. package/dist/proxmox/generated/pbs/config-access-pam.d.ts.map +1 -0
  131. package/dist/proxmox/generated/pbs/config-access.d.ts +203 -0
  132. package/dist/proxmox/generated/pbs/config-access.d.ts.map +1 -0
  133. package/dist/proxmox/generated/pbs/config-datastore.d.ts +195 -0
  134. package/dist/proxmox/generated/pbs/config-datastore.d.ts.map +1 -0
  135. package/dist/proxmox/generated/pbs/config-media-pool.d.ts +207 -0
  136. package/dist/proxmox/generated/pbs/config-media-pool.d.ts.map +1 -0
  137. package/dist/proxmox/generated/pbs/config-notifications-matchers.d.ts +159 -0
  138. package/dist/proxmox/generated/pbs/config-notifications-matchers.d.ts.map +1 -0
  139. package/dist/proxmox/generated/pbs/config-notifications.d.ts +199 -0
  140. package/dist/proxmox/generated/pbs/config-notifications.d.ts.map +1 -0
  141. package/dist/proxmox/generated/pbs/config-remote.d.ts +175 -0
  142. package/dist/proxmox/generated/pbs/config-remote.d.ts.map +1 -0
  143. package/dist/proxmox/generated/pbs/config-sync.d.ts +145 -0
  144. package/dist/proxmox/generated/pbs/config-sync.d.ts.map +1 -0
  145. package/dist/proxmox/generated/pbs/config-tape.d.ts +200 -0
  146. package/dist/proxmox/generated/pbs/config-tape.d.ts.map +1 -0
  147. package/dist/proxmox/generated/pbs/config-verify.d.ts +77 -0
  148. package/dist/proxmox/generated/pbs/config-verify.d.ts.map +1 -0
  149. package/dist/proxmox/generated/pbs/config.d.ts +119 -0
  150. package/dist/proxmox/generated/pbs/config.d.ts.map +1 -0
  151. package/dist/proxmox/generated/pbs/nodes-node-dns.d.ts +178 -0
  152. package/dist/proxmox/generated/pbs/nodes-node-dns.d.ts.map +1 -0
  153. package/dist/proxmox/generated/pbs/nodes-node-services.d.ts +205 -0
  154. package/dist/proxmox/generated/pbs/nodes-node-services.d.ts.map +1 -0
  155. package/dist/proxmox/generated/pbs/nodes-node.d.ts +166 -0
  156. package/dist/proxmox/generated/pbs/nodes-node.d.ts.map +1 -0
  157. package/dist/proxmox/generated/pbs/nodes.d.ts +171 -0
  158. package/dist/proxmox/generated/pbs/nodes.d.ts.map +1 -0
  159. package/dist/proxmox/generated/pbs/ping.d.ts +18 -0
  160. package/dist/proxmox/generated/pbs/ping.d.ts.map +1 -0
  161. package/dist/proxmox/generated/pbs/pull.d.ts +37 -0
  162. package/dist/proxmox/generated/pbs/pull.d.ts.map +1 -0
  163. package/dist/proxmox/generated/pbs/push.d.ts +36 -0
  164. package/dist/proxmox/generated/pbs/push.d.ts.map +1 -0
  165. package/dist/proxmox/generated/pbs/reader.d.ts +41 -0
  166. package/dist/proxmox/generated/pbs/reader.d.ts.map +1 -0
  167. package/dist/proxmox/generated/pbs/root.d.ts +16 -0
  168. package/dist/proxmox/generated/pbs/root.d.ts.map +1 -0
  169. package/dist/proxmox/generated/pbs/status.d.ts +54 -0
  170. package/dist/proxmox/generated/pbs/status.d.ts.map +1 -0
  171. package/dist/proxmox/generated/pbs/tape-drive.d.ts +181 -0
  172. package/dist/proxmox/generated/pbs/tape-drive.d.ts.map +1 -0
  173. package/dist/proxmox/generated/pbs/tape-media.d.ts +126 -0
  174. package/dist/proxmox/generated/pbs/tape-media.d.ts.map +1 -0
  175. package/dist/proxmox/generated/pbs/tape.d.ts +90 -0
  176. package/dist/proxmox/generated/pbs/tape.d.ts.map +1 -0
  177. package/dist/proxmox/generated/pbs/version.d.ts +20 -0
  178. package/dist/proxmox/generated/pbs/version.d.ts.map +1 -0
  179. package/dist/proxmox/generated/pbs.d.ts +44 -662
  180. package/dist/proxmox/generated/pbs.d.ts.map +1 -1
  181. package/dist/proxmox/generated/pve/access-roles.d.ts +164 -0
  182. package/dist/proxmox/generated/pve/access-roles.d.ts.map +1 -0
  183. package/dist/proxmox/generated/pve/access-users.d.ts +152 -0
  184. package/dist/proxmox/generated/pve/access-users.d.ts.map +1 -0
  185. package/dist/proxmox/generated/pve/access.d.ts +221 -0
  186. package/dist/proxmox/generated/pve/access.d.ts.map +1 -0
  187. package/dist/proxmox/generated/pve/cluster-acme-plugins-id.d.ts +45 -0
  188. package/dist/proxmox/generated/pve/cluster-acme-plugins-id.d.ts.map +1 -0
  189. package/dist/proxmox/generated/pve/cluster-acme-plugins.d.ts +47 -0
  190. package/dist/proxmox/generated/pve/cluster-acme-plugins.d.ts.map +1 -0
  191. package/dist/proxmox/generated/pve/cluster-acme-tos.d.ts +240 -0
  192. package/dist/proxmox/generated/pve/cluster-acme-tos.d.ts.map +1 -0
  193. package/dist/proxmox/generated/pve/cluster-bulk-action.d.ts +200 -0
  194. package/dist/proxmox/generated/pve/cluster-bulk-action.d.ts.map +1 -0
  195. package/dist/proxmox/generated/pve/cluster-firewall-refs.d.ts +109 -0
  196. package/dist/proxmox/generated/pve/cluster-firewall-refs.d.ts.map +1 -0
  197. package/dist/proxmox/generated/pve/cluster-firewall.d.ts +225 -0
  198. package/dist/proxmox/generated/pve/cluster-firewall.d.ts.map +1 -0
  199. package/dist/proxmox/generated/pve/cluster-ha.d.ts +199 -0
  200. package/dist/proxmox/generated/pve/cluster-ha.d.ts.map +1 -0
  201. package/dist/proxmox/generated/pve/cluster-jobs.d.ts +183 -0
  202. package/dist/proxmox/generated/pve/cluster-jobs.d.ts.map +1 -0
  203. package/dist/proxmox/generated/pve/cluster-metrics.d.ts +110 -0
  204. package/dist/proxmox/generated/pve/cluster-metrics.d.ts.map +1 -0
  205. package/dist/proxmox/generated/pve/cluster-notifications-endpoints.d.ts +224 -0
  206. package/dist/proxmox/generated/pve/cluster-notifications-endpoints.d.ts.map +1 -0
  207. package/dist/proxmox/generated/pve/cluster-notifications.d.ts +91 -0
  208. package/dist/proxmox/generated/pve/cluster-notifications.d.ts.map +1 -0
  209. package/dist/proxmox/generated/pve/cluster-options.d.ts +85 -0
  210. package/dist/proxmox/generated/pve/cluster-options.d.ts.map +1 -0
  211. package/dist/proxmox/generated/pve/cluster-qemu-custom-cpu-models-cputype.d.ts +48 -0
  212. package/dist/proxmox/generated/pve/cluster-qemu-custom-cpu-models-cputype.d.ts.map +1 -0
  213. package/dist/proxmox/generated/pve/cluster-qemu-custom-cpu-models.d.ts +45 -0
  214. package/dist/proxmox/generated/pve/cluster-qemu-custom-cpu-models.d.ts.map +1 -0
  215. package/dist/proxmox/generated/pve/cluster-replication.d.ts +130 -0
  216. package/dist/proxmox/generated/pve/cluster-replication.d.ts.map +1 -0
  217. package/dist/proxmox/generated/pve/cluster-sdn-fabrics.d.ts +220 -0
  218. package/dist/proxmox/generated/pve/cluster-sdn-fabrics.d.ts.map +1 -0
  219. package/dist/proxmox/generated/pve/cluster-sdn-ipams.d.ts +229 -0
  220. package/dist/proxmox/generated/pve/cluster-sdn-ipams.d.ts.map +1 -0
  221. package/dist/proxmox/generated/pve/cluster-sdn-vnets-vnet.d.ts +229 -0
  222. package/dist/proxmox/generated/pve/cluster-sdn-vnets-vnet.d.ts.map +1 -0
  223. package/dist/proxmox/generated/pve/cluster-sdn-vnets.d.ts +51 -0
  224. package/dist/proxmox/generated/pve/cluster-sdn-vnets.d.ts.map +1 -0
  225. package/dist/proxmox/generated/pve/cluster-sdn-zones.d.ts +225 -0
  226. package/dist/proxmox/generated/pve/cluster-sdn-zones.d.ts.map +1 -0
  227. package/dist/proxmox/generated/pve/cluster-sdn.d.ts +202 -0
  228. package/dist/proxmox/generated/pve/cluster-sdn.d.ts.map +1 -0
  229. package/dist/proxmox/generated/pve/cluster.d.ts +69 -0
  230. package/dist/proxmox/generated/pve/cluster.d.ts.map +1 -0
  231. package/dist/proxmox/generated/pve/nodes-node-ceph.d.ts +167 -0
  232. package/dist/proxmox/generated/pve/nodes-node-ceph.d.ts.map +1 -0
  233. package/dist/proxmox/generated/pve/nodes-node-config.d.ts +43 -0
  234. package/dist/proxmox/generated/pve/nodes-node-config.d.ts.map +1 -0
  235. package/dist/proxmox/generated/pve/nodes-node-disks.d.ts +225 -0
  236. package/dist/proxmox/generated/pve/nodes-node-disks.d.ts.map +1 -0
  237. package/dist/proxmox/generated/pve/nodes-node-firewall.d.ts +145 -0
  238. package/dist/proxmox/generated/pve/nodes-node-firewall.d.ts.map +1 -0
  239. package/dist/proxmox/generated/pve/nodes-node-hardware.d.ts +195 -0
  240. package/dist/proxmox/generated/pve/nodes-node-hardware.d.ts.map +1 -0
  241. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-firewall.d.ts +191 -0
  242. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-firewall.d.ts.map +1 -0
  243. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-move-volume.d.ts +33 -0
  244. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-move-volume.d.ts.map +1 -0
  245. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-mtunnel.d.ts +56 -0
  246. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-mtunnel.d.ts.map +1 -0
  247. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-resize.d.ts +28 -0
  248. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-resize.d.ts.map +1 -0
  249. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-rrd.d.ts +186 -0
  250. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-rrd.d.ts.map +1 -0
  251. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid.d.ts +191 -0
  252. package/dist/proxmox/generated/pve/nodes-node-lxc-vmid.d.ts.map +1 -0
  253. package/dist/proxmox/generated/pve/nodes-node-network.d.ts +150 -0
  254. package/dist/proxmox/generated/pve/nodes-node-network.d.ts.map +1 -0
  255. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-config.d.ts +301 -0
  256. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-config.d.ts.map +1 -0
  257. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-dbus-vmstate.d.ts +170 -0
  258. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-dbus-vmstate.d.ts.map +1 -0
  259. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-firewall-rules.d.ts +144 -0
  260. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-firewall-rules.d.ts.map +1 -0
  261. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-move-disk.d.ts +34 -0
  262. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-move-disk.d.ts.map +1 -0
  263. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-mtunnel.d.ts +137 -0
  264. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-mtunnel.d.ts.map +1 -0
  265. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-status.d.ts +179 -0
  266. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-status.d.ts.map +1 -0
  267. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid.d.ts +143 -0
  268. package/dist/proxmox/generated/pve/nodes-node-qemu-vmid.d.ts.map +1 -0
  269. package/dist/proxmox/generated/pve/nodes-node-qemu.d.ts +158 -0
  270. package/dist/proxmox/generated/pve/nodes-node-qemu.d.ts.map +1 -0
  271. package/dist/proxmox/generated/pve/nodes-node-replication.d.ts +187 -0
  272. package/dist/proxmox/generated/pve/nodes-node-replication.d.ts.map +1 -0
  273. package/dist/proxmox/generated/pve/nodes-node-services.d.ts +115 -0
  274. package/dist/proxmox/generated/pve/nodes-node-services.d.ts.map +1 -0
  275. package/dist/proxmox/generated/pve/nodes-node-storage-storage.d.ts +202 -0
  276. package/dist/proxmox/generated/pve/nodes-node-storage-storage.d.ts.map +1 -0
  277. package/dist/proxmox/generated/pve/nodes-node-storage.d.ts +40 -0
  278. package/dist/proxmox/generated/pve/nodes-node-storage.d.ts.map +1 -0
  279. package/dist/proxmox/generated/pve/nodes-node-subscription.d.ts +173 -0
  280. package/dist/proxmox/generated/pve/nodes-node-subscription.d.ts.map +1 -0
  281. package/dist/proxmox/generated/pve/nodes-node-vzdump.d.ts +97 -0
  282. package/dist/proxmox/generated/pve/nodes-node-vzdump.d.ts.map +1 -0
  283. package/dist/proxmox/generated/pve/nodes-node.d.ts +207 -0
  284. package/dist/proxmox/generated/pve/nodes-node.d.ts.map +1 -0
  285. package/dist/proxmox/generated/pve/nodes.d.ts +236 -0
  286. package/dist/proxmox/generated/pve/nodes.d.ts.map +1 -0
  287. package/dist/proxmox/generated/pve/pools.d.ts +82 -0
  288. package/dist/proxmox/generated/pve/pools.d.ts.map +1 -0
  289. package/dist/proxmox/generated/pve/storage.d.ts +159 -0
  290. package/dist/proxmox/generated/pve/storage.d.ts.map +1 -0
  291. package/dist/proxmox/generated/pve/version.d.ts +21 -0
  292. package/dist/proxmox/generated/pve/version.d.ts.map +1 -0
  293. package/dist/proxmox/generated/pve.d.ts +69 -4766
  294. package/dist/proxmox/generated/pve.d.ts.map +1 -1
  295. package/dist/proxmox/index.js +996 -372
  296. package/dist/proxmox/index.js.map +48 -32
  297. package/dist/proxmox/lxc-lifecycle.d.ts.map +1 -1
  298. package/dist/proxmox/metric-server-form.d.ts +11 -0
  299. package/dist/proxmox/metric-server-form.d.ts.map +1 -1
  300. package/dist/proxmox/metric-server.d.ts.map +1 -1
  301. package/dist/proxmox/network-apply.d.ts.map +1 -1
  302. package/dist/proxmox/node-network-form.d.ts +15 -0
  303. package/dist/proxmox/node-network-form.d.ts.map +1 -1
  304. package/dist/proxmox/node-network.d.ts.map +1 -1
  305. package/dist/proxmox/notification-target-endpoint.d.ts +26 -0
  306. package/dist/proxmox/notification-target-endpoint.d.ts.map +1 -0
  307. package/dist/proxmox/notification-target-form.d.ts +7 -0
  308. package/dist/proxmox/notification-target-form.d.ts.map +1 -1
  309. package/dist/proxmox/notification-target.d.ts.map +1 -1
  310. package/dist/proxmox/pbs-notification-target-endpoint.d.ts +29 -0
  311. package/dist/proxmox/pbs-notification-target-endpoint.d.ts.map +1 -0
  312. package/dist/proxmox/pbs-notification-target-lifecycle.d.ts.map +1 -1
  313. package/dist/proxmox/qemu.d.ts +10 -0
  314. package/dist/proxmox/qemu.d.ts.map +1 -1
  315. package/dist/proxmox/resource-guard.d.ts +15 -0
  316. package/dist/proxmox/resource-guard.d.ts.map +1 -0
  317. package/dist/proxmox/resource-spec.d.ts +15 -4
  318. package/dist/proxmox/resource-spec.d.ts.map +1 -1
  319. package/dist/proxmox/resource.d.ts +8 -0
  320. package/dist/proxmox/resource.d.ts.map +1 -1
  321. package/dist/proxmox/sdn-apply.d.ts.map +1 -1
  322. package/dist/proxmox/sdn-subnet.d.ts.map +1 -1
  323. package/dist/proxmox/zfs-pool-write.d.ts +11 -0
  324. package/dist/proxmox/zfs-pool-write.d.ts.map +1 -1
  325. package/dist/proxmox/zfs-pool.d.ts.map +1 -1
  326. package/docs/linux-host-measured.md +56 -0
  327. package/docs/linux-host.md +192 -0
  328. package/docs/netbox.md +103 -0
  329. package/package.json +9 -1
  330. package/src/linux/directory-lifecycle.ts +220 -0
  331. package/src/linux/directory.test.ts +132 -0
  332. package/src/linux/directory.ts +71 -0
  333. package/src/linux/fake-linux-host.ts +197 -0
  334. package/src/linux/fake-systemd.ts +103 -0
  335. package/src/linux/index.ts +32 -0
  336. package/src/linux/providers.ts +26 -0
  337. package/src/linux/region.test.ts +89 -0
  338. package/src/linux/region.ts +118 -0
  339. package/src/linux/remote-file-form.ts +96 -0
  340. package/src/linux/remote-file-lifecycle.test.ts +191 -0
  341. package/src/linux/remote-file-lifecycle.ts +161 -0
  342. package/src/linux/remote-file-plan.ts +154 -0
  343. package/src/linux/remote-file.ts +88 -0
  344. package/src/linux/ssh-command.test.ts +140 -0
  345. package/src/linux/ssh-command.ts +99 -0
  346. package/src/linux/ssh-runner.ts +188 -0
  347. package/src/linux/ssh-scripts.ts +105 -0
  348. package/src/linux/systemctl.ts +145 -0
  349. package/src/linux/unit-form.ts +183 -0
  350. package/src/linux/unit-handlers.ts +73 -0
  351. package/src/linux/unit-lifecycle.test.ts +220 -0
  352. package/src/linux/unit-lifecycle.ts +175 -0
  353. package/src/linux/unit-preflight.test.ts +128 -0
  354. package/src/linux/unit-preflight.ts +100 -0
  355. package/src/linux/unit-settle.ts +110 -0
  356. package/src/linux/unit.ts +81 -0
  357. package/src/netbox/client.test.ts +67 -0
  358. package/src/netbox/client.ts +146 -0
  359. package/src/netbox/constraint-guard.ts +57 -0
  360. package/src/netbox/constraints.test.ts +114 -0
  361. package/src/netbox/constraints.ts +152 -0
  362. package/src/netbox/generated/constraints/index.ts +23 -0
  363. package/src/netbox/generated/constraints/netbox-ipam.ts +32 -0
  364. package/src/netbox/index.ts +34 -0
  365. package/src/netbox/prefix-form.test.ts +127 -0
  366. package/src/netbox/prefix-form.ts +84 -0
  367. package/src/netbox/prefix.ts +136 -0
  368. package/src/netbox/resource.ts +208 -0
  369. package/src/netbox/values.test.ts +66 -0
  370. package/src/netbox/values.ts +40 -0
  371. package/src/proxmox/api-token-form.ts +5 -0
  372. package/src/proxmox/apply-endpoints.ts +34 -0
  373. package/src/proxmox/ceph-daemon-form.ts +56 -2
  374. package/src/proxmox/ceph-daemon.ts +10 -21
  375. package/src/proxmox/ceph-flag.ts +1 -0
  376. package/src/proxmox/ceph-fs.ts +1 -0
  377. package/src/proxmox/ceph-osd-write.ts +30 -4
  378. package/src/proxmox/ceph-pool.ts +10 -0
  379. package/src/proxmox/constraints-dialect.test.ts +165 -0
  380. package/src/proxmox/constraints-forms.test.ts +228 -0
  381. package/src/proxmox/constraints-host-forms.test.ts +132 -0
  382. package/src/proxmox/constraints-live.test.ts +155 -0
  383. package/src/proxmox/constraints-node-forms.test.ts +197 -0
  384. package/src/proxmox/constraints-required.test.ts +172 -0
  385. package/src/proxmox/constraints.test.ts +8 -63
  386. package/src/proxmox/constraints.ts +31 -6
  387. package/src/proxmox/generated/constraints/index.ts +27 -3
  388. package/src/proxmox/generated/constraints/pbs-config.ts +63 -1
  389. package/src/proxmox/generated/constraints/pve-access.ts +15 -3
  390. package/src/proxmox/generated/constraints/pve-cluster-backup.ts +74 -0
  391. package/src/proxmox/generated/constraints/pve-cluster-ceph.ts +27 -0
  392. package/src/proxmox/generated/constraints/pve-cluster-firewall.ts +35 -0
  393. package/src/proxmox/generated/constraints/pve-cluster-ha.ts +55 -0
  394. package/src/proxmox/generated/constraints/pve-cluster-metrics.ts +59 -0
  395. package/src/proxmox/generated/constraints/pve-cluster-notifications.ts +80 -0
  396. package/src/proxmox/generated/constraints/pve-cluster-replication.ts +43 -0
  397. package/src/proxmox/generated/constraints/pve-cluster-sdn.ts +90 -0
  398. package/src/proxmox/generated/constraints/pve-nodes-ceph.ts +57 -0
  399. package/src/proxmox/generated/constraints/pve-nodes-disks.ts +31 -0
  400. package/src/proxmox/generated/constraints/pve-nodes-lxc.ts +82 -0
  401. package/src/proxmox/generated/constraints/pve-nodes-network.ts +77 -0
  402. package/src/proxmox/generated/constraints/pve-nodes-qemu.ts +125 -0
  403. package/src/proxmox/generated/constraints/pve-pools.ts +6 -1
  404. package/src/proxmox/generated/constraints/pve-storage.ts +8 -3
  405. package/src/proxmox/generated/pbs/access-users.ts +137 -0
  406. package/src/proxmox/generated/pbs/access.ts +232 -0
  407. package/src/proxmox/generated/pbs/admin-datastore-store.ts +238 -0
  408. package/src/proxmox/generated/pbs/admin-metrics.ts +147 -0
  409. package/src/proxmox/generated/pbs/admin.ts +225 -0
  410. package/src/proxmox/generated/pbs/backup.ts +121 -0
  411. package/src/proxmox/generated/pbs/config-access-pam.ts +228 -0
  412. package/src/proxmox/generated/pbs/config-access.ts +228 -0
  413. package/src/proxmox/generated/pbs/config-datastore.ts +217 -0
  414. package/src/proxmox/generated/pbs/config-media-pool.ts +232 -0
  415. package/src/proxmox/generated/pbs/config-notifications-matchers.ts +187 -0
  416. package/src/proxmox/generated/pbs/config-notifications.ts +221 -0
  417. package/src/proxmox/generated/pbs/config-remote.ts +192 -0
  418. package/src/proxmox/generated/pbs/config-sync.ts +167 -0
  419. package/src/proxmox/generated/pbs/config-tape.ts +226 -0
  420. package/src/proxmox/generated/pbs/config-verify.ts +87 -0
  421. package/src/proxmox/generated/pbs/config.ts +135 -0
  422. package/src/proxmox/generated/pbs/nodes-node-dns.ts +229 -0
  423. package/src/proxmox/generated/pbs/nodes-node-services.ts +181 -0
  424. package/src/proxmox/generated/pbs/nodes-node.ts +244 -0
  425. package/src/proxmox/generated/pbs/nodes.ts +160 -0
  426. package/src/proxmox/generated/pbs/ping.ts +16 -0
  427. package/src/proxmox/generated/pbs/pull.ts +37 -0
  428. package/src/proxmox/generated/pbs/push.ts +36 -0
  429. package/src/proxmox/generated/pbs/reader.ts +41 -0
  430. package/src/proxmox/generated/pbs/root.ts +16 -0
  431. package/src/proxmox/generated/pbs/status.ts +50 -0
  432. package/src/proxmox/generated/pbs/tape-drive.ts +220 -0
  433. package/src/proxmox/generated/pbs/tape-media.ts +133 -0
  434. package/src/proxmox/generated/pbs/tape.ts +92 -0
  435. package/src/proxmox/generated/pbs/version.ts +16 -0
  436. package/src/proxmox/generated/pbs.ts +44 -787
  437. package/src/proxmox/generated/pve/access-roles.ts +168 -0
  438. package/src/proxmox/generated/pve/access-users.ts +155 -0
  439. package/src/proxmox/generated/pve/access.ts +217 -0
  440. package/src/proxmox/generated/pve/cluster-acme-plugins-id.ts +367 -0
  441. package/src/proxmox/generated/pve/cluster-acme-plugins.ts +366 -0
  442. package/src/proxmox/generated/pve/cluster-acme-tos.ts +232 -0
  443. package/src/proxmox/generated/pve/cluster-bulk-action.ts +227 -0
  444. package/src/proxmox/generated/pve/cluster-firewall-refs.ts +110 -0
  445. package/src/proxmox/generated/pve/cluster-firewall.ts +236 -0
  446. package/src/proxmox/generated/pve/cluster-ha.ts +203 -0
  447. package/src/proxmox/generated/pve/cluster-jobs.ts +190 -0
  448. package/src/proxmox/generated/pve/cluster-metrics.ts +116 -0
  449. package/src/proxmox/generated/pve/cluster-notifications-endpoints.ts +244 -0
  450. package/src/proxmox/generated/pve/cluster-notifications.ts +99 -0
  451. package/src/proxmox/generated/pve/cluster-options.ts +189 -0
  452. package/src/proxmox/generated/pve/cluster-qemu-custom-cpu-models-cputype.ts +272 -0
  453. package/src/proxmox/generated/pve/cluster-qemu-custom-cpu-models.ts +268 -0
  454. package/src/proxmox/generated/pve/cluster-replication.ts +127 -0
  455. package/src/proxmox/generated/pve/cluster-sdn-fabrics.ts +218 -0
  456. package/src/proxmox/generated/pve/cluster-sdn-ipams.ts +229 -0
  457. package/src/proxmox/generated/pve/cluster-sdn-vnets-vnet.ts +245 -0
  458. package/src/proxmox/generated/pve/cluster-sdn-vnets.ts +49 -0
  459. package/src/proxmox/generated/pve/cluster-sdn-zones.ts +224 -0
  460. package/src/proxmox/generated/pve/cluster-sdn.ts +201 -0
  461. package/src/proxmox/generated/pve/cluster.ts +71 -0
  462. package/src/proxmox/generated/pve/nodes-node-ceph.ts +167 -0
  463. package/src/proxmox/generated/pve/nodes-node-config.ts +56 -0
  464. package/src/proxmox/generated/pve/nodes-node-disks.ts +237 -0
  465. package/src/proxmox/generated/pve/nodes-node-firewall.ts +239 -0
  466. package/src/proxmox/generated/pve/nodes-node-hardware.ts +215 -0
  467. package/src/proxmox/generated/pve/nodes-node-lxc-vmid-firewall.ts +232 -0
  468. package/src/proxmox/generated/pve/nodes-node-lxc-vmid-move-volume.ts +1059 -0
  469. package/src/proxmox/generated/pve/nodes-node-lxc-vmid-mtunnel.ts +49 -0
  470. package/src/proxmox/generated/pve/nodes-node-lxc-vmid-resize.ts +285 -0
  471. package/src/proxmox/generated/pve/nodes-node-lxc-vmid-rrd.ts +184 -0
  472. package/src/proxmox/generated/pve/nodes-node-lxc-vmid.ts +240 -0
  473. package/src/proxmox/generated/pve/nodes-node-network.ts +234 -0
  474. package/src/proxmox/generated/pve/nodes-node-qemu-vmid-config.ts +441 -0
  475. package/src/proxmox/generated/pve/nodes-node-qemu-vmid-dbus-vmstate.ts +215 -0
  476. package/src/proxmox/generated/pve/nodes-node-qemu-vmid-firewall-rules.ts +145 -0
  477. package/src/proxmox/generated/pve/nodes-node-qemu-vmid-move-disk.ts +664 -0
  478. package/src/proxmox/generated/pve/nodes-node-qemu-vmid-mtunnel.ts +188 -0
  479. package/src/proxmox/generated/pve/nodes-node-qemu-vmid-status.ts +233 -0
  480. package/src/proxmox/generated/pve/nodes-node-qemu-vmid.ts +187 -0
  481. package/src/proxmox/generated/pve/nodes-node-qemu.ts +204 -0
  482. package/src/proxmox/generated/pve/nodes-node-replication.ts +187 -0
  483. package/src/proxmox/generated/pve/nodes-node-services.ts +221 -0
  484. package/src/proxmox/generated/pve/nodes-node-storage-storage.ts +226 -0
  485. package/src/proxmox/generated/pve/nodes-node-storage.ts +40 -0
  486. package/src/proxmox/generated/pve/nodes-node-subscription.ts +168 -0
  487. package/src/proxmox/generated/pve/nodes-node-vzdump.ts +96 -0
  488. package/src/proxmox/generated/pve/nodes-node.ts +211 -0
  489. package/src/proxmox/generated/pve/nodes.ts +235 -0
  490. package/src/proxmox/generated/pve/pools.ts +78 -0
  491. package/src/proxmox/generated/pve/storage.ts +213 -0
  492. package/src/proxmox/generated/pve/version.ts +21 -0
  493. package/src/proxmox/generated/pve.ts +69 -7403
  494. package/src/proxmox/lxc-interior.test.ts +17 -1
  495. package/src/proxmox/lxc-lifecycle.ts +48 -9
  496. package/src/proxmox/metric-server-form.ts +10 -0
  497. package/src/proxmox/metric-server.ts +11 -2
  498. package/src/proxmox/network-apply.ts +4 -0
  499. package/src/proxmox/node-network-form.ts +19 -0
  500. package/src/proxmox/node-network.ts +9 -3
  501. package/src/proxmox/notification-target-endpoint.ts +46 -0
  502. package/src/proxmox/notification-target-form.ts +11 -0
  503. package/src/proxmox/notification-target.ts +5 -2
  504. package/src/proxmox/pbs-notification-target-endpoint.ts +45 -0
  505. package/src/proxmox/pbs-notification-target-lifecycle.ts +16 -14
  506. package/src/proxmox/qemu.ts +9 -1
  507. package/src/proxmox/resource-guard.ts +61 -0
  508. package/src/proxmox/resource-spec.ts +16 -4
  509. package/src/proxmox/resource.ts +27 -27
  510. package/src/proxmox/sdn-apply.ts +4 -0
  511. package/src/proxmox/sdn-subnet.ts +5 -0
  512. package/src/proxmox/zfs-pool-write.ts +12 -0
  513. package/src/proxmox/zfs-pool.ts +2 -1
  514. package/dist/proxmox/generated/constraints/pve-cluster.d.ts +0 -18
  515. package/dist/proxmox/generated/constraints/pve-cluster.d.ts.map +0 -1
  516. package/src/proxmox/generated/constraints/pve-cluster.ts +0 -174
@@ -14,13 +14,11 @@
14
14
  import { describe, expect, test } from 'bun:test';
15
15
  import * as Layer from 'effect/Layer';
16
16
  import { engineOver } from '../verify/fake-engine.ts';
17
+ // ⚠️ The estate's own declarations live in constraints-live.test.ts — split at the 250-line cap.
17
18
  import { constraintsFor, formViolations } from './constraint-guard.ts';
18
19
  import { type EndpointConstraints, refusal, violations } from './constraints.ts';
19
20
  import type { PbsTarget } from './credentials.ts';
20
21
  import { fakePve, withoutBao } from './fake-pve.ts';
21
- import { createForm as datastoreCreateForm } from './pbs-datastore-form.ts';
22
- import { createBody as pruneCreateBody } from './pbs-prune-job-form.ts';
23
- import { createBody as syncCreateBody } from './pbs-sync-job-form.ts';
24
22
  import { PROXMOX_CONSTRAINTS, PROXMOX_CONSTRAINTS_DIGEST } from './generated/constraints/index.ts';
25
23
  import { PbsVerifyJob, PbsVerifyJobProvider } from './pbs-verify-job.ts';
26
24
 
@@ -71,11 +69,14 @@ describe('the v-r2-offsite failure, refused at plan instead of by the server', (
71
69
  // ⛔ THE ASSERTION THE INCIDENT IS ABOUT. A refusal after the POST is the server's own 400.
72
70
  expect(writes).toEqual([]);
73
71
  /**
74
- * ⚠️ ONE CALL IS MADE, AND IT IS A GET. Measured 2026-09-22: Alchemy runs the provider's
75
- * `read` handler before `diff`, so the plan has already asked PBS whether the job exists by
76
- * the time the constraint is checked. Every call is a read; nothing is created or changed.
72
+ * ⚠️ EVERY CALL IS A READ, AND THERE ARE NOW TWO OF THEM. Measured 2026-09-22: Alchemy runs
73
+ * the provider's `read` handler first, and `reconcile` reads again — the guard moved to
74
+ * AFTER that second read the same day, because the read is the only thing that says whether
75
+ * a create or an update is about to be made, and demanding the create form's required
76
+ * parameters on an update refuses edits that were always legal (resource-guard.ts).
77
+ * ⛔ THE COUNT IS NOT THE ASSERTION; THE METHOD IS. Nothing is created or changed.
77
78
  */
78
- expect(calls.map((call) => call.method)).toEqual(['GET']);
79
+ expect(calls.map((call) => call.method)).toEqual(['GET', 'GET']);
79
80
  });
80
81
 
81
82
  test('128 characters is accepted and the create goes through', async () => {
@@ -202,59 +203,3 @@ describe('every rule kind, at and past its boundary', () => {
202
203
  expect(refusal(VERIFY, ['comment: at most 128 characters'])).toContain('generated/constraints');
203
204
  });
204
205
  });
205
-
206
- /**
207
- * ★ THE OTHER THREE PBS FAMILIES, WITH THE ESTATE'S OWN DECLARATIONS, AGAINST THEIR CREATE TABLE.
208
- * The risk this feature carries is not the one it fixes: a table that refuses a declaration the
209
- * vendor would have ACCEPTED blocks a deploy that was always legal, and the operator cannot tell
210
- * that from a genuine violation. These are the jobs `homeflare-proxmox` actually declares
211
- * (`prune-cluster-all`, `sync-all-to-r2`, the `r2-offsite` datastore), so a false positive in the
212
- * presence check or a mistranslated pattern fails here rather than on a Sunday morning.
213
- */
214
- describe('the live PBS declarations pass their own create tables', () => {
215
- test('prune, sync and datastore create forms have no violations', () => {
216
- expect(
217
- formViolations(
218
- 'pbs:POST /config/prune',
219
- pruneCreateBody({
220
- comment: 'cluster retention',
221
- id: 'prune-cluster-all',
222
- 'keep-daily': 7,
223
- 'keep-last': 3,
224
- 'keep-monthly': 6,
225
- 'keep-weekly': 4,
226
- schedule: 'sat 03:00',
227
- store: 'cluster',
228
- target: PBS,
229
- }),
230
- true,
231
- ),
232
- ).toEqual([]);
233
- expect(
234
- formViolations(
235
- 'pbs:POST /config/sync',
236
- syncCreateBody({
237
- comment: 'offsite copy to R2',
238
- id: 'sync-all-to-r2',
239
- 'remote-store': 'r2-offsite',
240
- schedule: 'mon 08:30',
241
- store: 'cluster',
242
- target: PBS,
243
- }),
244
- true,
245
- ),
246
- ).toEqual([]);
247
- expect(
248
- formViolations(
249
- 'pbs:POST /config/datastore',
250
- datastoreCreateForm({
251
- comment: 'offsite',
252
- name: 'r2-offsite',
253
- path: '/mnt/datastore/r2-offsite',
254
- target: PBS,
255
- }),
256
- true,
257
- ),
258
- ).toEqual([]);
259
- });
260
- });
@@ -18,13 +18,20 @@
18
18
  * field. A props-level check would pass values the form then mangles, and would have to be
19
19
  * written once per family — which is how the copy that forgets a field gets written.
20
20
  *
21
- * ⚠️ WHAT IT DELIBERATELY DOES NOT ENFORCE, so nobody reads a green plan as more than it is:
22
- * - a `format` NAME (PVE's `pve-calendar-event`, `pve-node`, 216 of them): the name is a
21
+ * ⚠️ WHAT IT DELIBERATELY DOES NOT ENFORCE, so nobody reads a green plan as more than it is. The
22
+ * full kind-by-kind table, with the counts measured over the 37 tabled endpoints, is in
23
+ * codegen/README.md. The short version:
24
+ * - a `format` NAME (PVE's `pve-calendar-event`, `pve-node`; 105 parameters here): the name is a
23
25
  * validator PVE implements server-side and publishes nothing about. Recorded, never checked.
26
+ * - a `format` OBJECT — PBS's `notify`, `tuning`, `maintenance-mode`, PVE's `bwlimit`; 10
27
+ * parameters. It is a sub-schema for the inside of a PROPERTY STRING, and the packed keys
28
+ * carry their own limits. Not flattened, because a rule about `notify` is not a rule about
29
+ * `notify.gc`. ⛔ This is the largest remaining gap and it is a gap on purpose.
30
+ * - `requires` (8 parameters): "this one needs that one". A dependency, not a value rule.
31
+ * - `typetext` with nothing else, such as PBS `schedule`'s `<calendar-event>` (21 parameters).
32
+ * The schema states a syntax it does not describe; a malformed schedule still reaches PBS.
24
33
  * - a pattern the generator could not translate faithfully (codegen/pattern.ts). Recorded
25
34
  * verbatim as `patternSource`, never checked.
26
- * - PBS `schedule`, which carries `typetext: <calendar-event>` and NO pattern and NO maxLength.
27
- * The schema cannot help there; a malformed schedule still reaches PBS.
28
35
  * Each of those is a fact in the table rather than a guess, which is the rule this follows:
29
36
  * if the vendor did not state it, it is not enforced and the table says so.
30
37
  */
@@ -39,13 +46,29 @@ export interface ParamConstraint {
39
46
  readonly minimum?: number;
40
47
  readonly maximum?: number;
41
48
  readonly enum?: readonly string[];
42
- /** A JavaScript-safe translation. Absent when the vendor's dialect could not be carried over. */
49
+ /**
50
+ * A JavaScript-safe EQUIVALENT. Absent when the vendor's dialect could not be carried over.
51
+ *
52
+ * ⛔ NOT THE VENDOR'S SPELLING, AND FOR PVE NOT EVEN THE SAME SHAPE. PVE publishes the inside of
53
+ * an anchored match and applies `m/^$pattern$/` itself (MEASURED in JSONSchema.pm), so the
54
+ * generator anchors it here. Quote `patternSource` at a human, never this.
55
+ */
43
56
  readonly pattern?: string;
57
+ /** `m` when the vendor asked for multi-line. ⚠️ Dropping it enforces the wrong semantics. */
58
+ readonly patternFlags?: string;
44
59
  /** The vendor's own spelling, always — what a violation message quotes, and the audit trail. */
45
60
  readonly patternSource?: string;
46
61
  /** PVE's server-side validator name. Recorded so a reader knows what is NOT checked here. */
47
62
  readonly format?: string;
48
63
  readonly default?: string;
64
+ /**
65
+ * The value rules describe each ELEMENT of a repeated key, not one joined string.
66
+ *
67
+ * ⚠️ RECORDED, NOT BRANCHED ON. `violations` already checks every element of an array value, so
68
+ * this changes no behaviour — it tells a reader of the generated table why a `maxLength` of 32
69
+ * sits on a parameter that carries a list.
70
+ */
71
+ readonly each?: true;
49
72
  }
50
73
 
51
74
  export type EndpointConstraints = Readonly<Record<string, ParamConstraint>>;
@@ -82,7 +105,9 @@ const checkValue = (name: string, value: string, rule: ParamConstraint): string[
82
105
  if (rule.enum !== undefined && !rule.enum.includes(value)) {
83
106
  out.push(`${name}: must be one of ${rule.enum.join(', ')}`);
84
107
  }
85
- if (rule.pattern !== undefined && !new RegExp(rule.pattern).test(value)) {
108
+ // ⚠️ `patternFlags` IS PASSED, NOT IGNORED. It carries the vendor's own `(?m)`; enforcing a
109
+ // multi-line rule with single-line semantics refuses values the vendor accepts.
110
+ if (rule.pattern !== undefined && !new RegExp(rule.pattern, rule.patternFlags).test(value)) {
86
111
  out.push(`${name}: must match ${rule.patternSource ?? rule.pattern}`);
87
112
  }
88
113
  // ⚠️ NUMBER-NESS IS NOT CHECKED, ONLY THE BOUND. The form is strings by construction and a
@@ -9,14 +9,38 @@
9
9
  */
10
10
  import type { EndpointConstraints } from '../../constraints.ts';
11
11
  import { PVE_ACCESS_CONSTRAINTS } from './pve-access.ts';
12
- import { PVE_CLUSTER_CONSTRAINTS } from './pve-cluster.ts';
12
+ import { PVE_CLUSTER_BACKUP_CONSTRAINTS } from './pve-cluster-backup.ts';
13
+ import { PVE_CLUSTER_CEPH_CONSTRAINTS } from './pve-cluster-ceph.ts';
14
+ import { PVE_CLUSTER_FIREWALL_CONSTRAINTS } from './pve-cluster-firewall.ts';
15
+ import { PVE_CLUSTER_HA_CONSTRAINTS } from './pve-cluster-ha.ts';
16
+ import { PVE_CLUSTER_METRICS_CONSTRAINTS } from './pve-cluster-metrics.ts';
17
+ import { PVE_CLUSTER_NOTIFICATIONS_CONSTRAINTS } from './pve-cluster-notifications.ts';
18
+ import { PVE_CLUSTER_REPLICATION_CONSTRAINTS } from './pve-cluster-replication.ts';
19
+ import { PVE_CLUSTER_SDN_CONSTRAINTS } from './pve-cluster-sdn.ts';
20
+ import { PVE_NODES_CEPH_CONSTRAINTS } from './pve-nodes-ceph.ts';
21
+ import { PVE_NODES_DISKS_CONSTRAINTS } from './pve-nodes-disks.ts';
22
+ import { PVE_NODES_LXC_CONSTRAINTS } from './pve-nodes-lxc.ts';
23
+ import { PVE_NODES_NETWORK_CONSTRAINTS } from './pve-nodes-network.ts';
24
+ import { PVE_NODES_QEMU_CONSTRAINTS } from './pve-nodes-qemu.ts';
13
25
  import { PVE_POOLS_CONSTRAINTS } from './pve-pools.ts';
14
26
  import { PVE_STORAGE_CONSTRAINTS } from './pve-storage.ts';
15
27
  import { PBS_CONFIG_CONSTRAINTS } from './pbs-config.ts';
16
28
 
17
29
  export const PROXMOX_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>> = {
18
30
  ...PVE_ACCESS_CONSTRAINTS,
19
- ...PVE_CLUSTER_CONSTRAINTS,
31
+ ...PVE_CLUSTER_BACKUP_CONSTRAINTS,
32
+ ...PVE_CLUSTER_CEPH_CONSTRAINTS,
33
+ ...PVE_CLUSTER_FIREWALL_CONSTRAINTS,
34
+ ...PVE_CLUSTER_HA_CONSTRAINTS,
35
+ ...PVE_CLUSTER_METRICS_CONSTRAINTS,
36
+ ...PVE_CLUSTER_NOTIFICATIONS_CONSTRAINTS,
37
+ ...PVE_CLUSTER_REPLICATION_CONSTRAINTS,
38
+ ...PVE_CLUSTER_SDN_CONSTRAINTS,
39
+ ...PVE_NODES_CEPH_CONSTRAINTS,
40
+ ...PVE_NODES_DISKS_CONSTRAINTS,
41
+ ...PVE_NODES_LXC_CONSTRAINTS,
42
+ ...PVE_NODES_NETWORK_CONSTRAINTS,
43
+ ...PVE_NODES_QEMU_CONSTRAINTS,
20
44
  ...PVE_POOLS_CONSTRAINTS,
21
45
  ...PVE_STORAGE_CONSTRAINTS,
22
46
  ...PBS_CONFIG_CONSTRAINTS,
@@ -28,4 +52,4 @@ export const PROXMOX_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>>
28
52
  * ★ A DIGEST OF THE DATA, NOT OF THE FILE TEXT, so reformatting is not a stale generation while
29
53
  * changing a 128 to a 129 by hand is. `tests/schema-manifest.test.ts` recomputes it.
30
54
  */
31
- export const PROXMOX_CONSTRAINTS_DIGEST = '03f403e0c6b3cf7d';
55
+ export const PROXMOX_CONSTRAINTS_DIGEST = '33b42b52d396c9e0';
@@ -6,12 +6,17 @@
6
6
  * sha256 274ab9f6fc075aea, read on a PBS host from
7
7
  * /usr/share/doc/proxmox-backup/html/api-viewer/apidoc.js
8
8
  *
9
- * 10 of this product's 144 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 16 of this product's 144 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
13
13
  * ⚠️ A `patternSource` with no `pattern` beside it is a rule that could NOT be carried into a
14
14
  * JavaScript RegExp faithfully (codegen/pattern.ts). It is recorded and NOT enforced.
15
+ * ⚠️ `pattern` IS NOT THE VENDOR'S SPELLING. For PVE it is anchored, because PVE applies
16
+ * `m/^$pattern$/` itself (JSONSchema.pm); for PBS it is the vendor's own, which already
17
+ * carries its anchors. `patternSource` is the spelling to quote at a human — param-rules.ts.
18
+ * ⚠️ `each: true` means the value rules describe every ELEMENT of a repeated key, because the
19
+ * parameter is an array and stated its limits on `items`.
15
20
  */
16
21
  import type { EndpointConstraints } from '../../constraints.ts';
17
22
 
@@ -30,11 +35,37 @@ export const PBS_CONFIG_CONSTRAINTS: Readonly<Record<string, EndpointConstraints
30
35
  "notify-user": {"maxLength":64,"minLength":3,"pattern":"^(?:[^\\s:/\\x00-\\x1f\\x7f]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[^\\s:/[:cntrl:]]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
31
36
  "path": {"maxLength":4096,"minLength":1,"required":true,"type":"string"},
32
37
  },
38
+ "pbs:POST /config/notifications/endpoints/sendmail": {
39
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
40
+ "mailto": {"each":true,"maxLength":64,"minLength":2,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"array"},
41
+ "mailto-user": {"each":true,"maxLength":64,"minLength":2,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"array"},
42
+ "name": {"maxLength":32,"minLength":2,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
43
+ "origin": {"enum":["user-created","builtin","modified-builtin"],"type":"string"},
44
+ },
45
+ "pbs:POST /config/notifications/endpoints/smtp": {
46
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
47
+ "from-address": {"required":true,"type":"string"},
48
+ "mailto": {"each":true,"maxLength":64,"minLength":2,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"array"},
49
+ "mailto-user": {"each":true,"maxLength":64,"minLength":2,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"array"},
50
+ "mode": {"default":"tls","enum":["insecure","starttls","tls"],"type":"string"},
51
+ "name": {"maxLength":32,"minLength":2,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
52
+ "origin": {"enum":["user-created","builtin","modified-builtin"],"type":"string"},
53
+ "port": {"maximum":65535,"minimum":0,"type":"integer"},
54
+ "server": {"required":true,"type":"string"},
55
+ },
56
+ "pbs:POST /config/notifications/endpoints/webhook": {
57
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
58
+ "method": {"default":"post","enum":["post","put","get"],"required":true,"type":"string"},
59
+ "name": {"maxLength":32,"minLength":2,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
60
+ "origin": {"enum":["user-created","builtin","modified-builtin"],"type":"string"},
61
+ "url": {"pattern":"^https?://(?:(?:(?:(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?)\\.)*(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?))|(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|\\[(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){6})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:::(?:(?:[0-9a-fA-F]{1,4}):){5})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){4})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,1}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){3})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,2}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){2})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,3}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){1})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,4}(?:[0-9a-fA-F]{1,4}))?::)(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,5}(?:[0-9a-fA-F]{1,4}))?::)(?:[0-9a-fA-F]{1,4}))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,6}(?:[0-9a-fA-F]{1,4}))?::))))\\]))(?::(?:[0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?)|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){6})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:::(?:(?:[0-9a-fA-F]{1,4}):){5})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){4})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,1}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){3})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,2}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){2})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,3}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){1})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,4}(?:[0-9a-fA-F]{1,4}))?::)(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,5}(?:[0-9a-fA-F]{1,4}))?::)(?:[0-9a-fA-F]{1,4}))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,6}(?:[0-9a-fA-F]{1,4}))?::))))(?:/[^\u0000-\u001f]*)?$","patternSource":"/^https?://(?:(?:(?:(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?)\\.)*(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?))|(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|\\[(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){6})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:::(?:(?:[0-9a-fA-F]{1,4}):){5})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){4})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,1}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){3})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,2}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){2})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,3}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){1})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,4}(?:[0-9a-fA-F]{1,4}))?::)(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,5}(?:[0-9a-fA-F]{1,4}))?::)(?:[0-9a-fA-F]{1,4}))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,6}(?:[0-9a-fA-F]{1,4}))?::))))\\]))(?::(?:[0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?)|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){6})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:::(?:(?:[0-9a-fA-F]{1,4}):){5})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){4})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,1}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){3})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,2}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){2})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,3}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){1})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,4}(?:[0-9a-fA-F]{1,4}))?::)(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,5}(?:[0-9a-fA-F]{1,4}))?::)(?:[0-9a-fA-F]{1,4}))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,6}(?:[0-9a-fA-F]{1,4}))?::))))(?:/[^\u0000-\u001f]*)?$/","required":true,"type":"string"},
62
+ },
33
63
  "pbs:POST /config/notifications/matchers": {
34
64
  "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
35
65
  "mode": {"default":"all","enum":["all","any"],"type":"string"},
36
66
  "name": {"maxLength":32,"minLength":2,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
37
67
  "origin": {"enum":["user-created","builtin","modified-builtin"],"type":"string"},
68
+ "target": {"each":true,"maxLength":32,"minLength":2,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"array"},
38
69
  },
39
70
  "pbs:POST /config/prune": {
40
71
  "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
@@ -52,6 +83,7 @@ export const PBS_CONFIG_CONSTRAINTS: Readonly<Record<string, EndpointConstraints
52
83
  },
53
84
  "pbs:POST /config/sync": {
54
85
  "active-encryption-key": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
86
+ "associated-key": {"each":true,"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"array"},
55
87
  "burst-in": {"maxLength":64,"minLength":1,"type":"string"},
56
88
  "burst-out": {"maxLength":64,"minLength":1,"type":"string"},
57
89
  "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
@@ -81,6 +113,7 @@ export const PBS_CONFIG_CONSTRAINTS: Readonly<Record<string, EndpointConstraints
81
113
  },
82
114
  "pbs:PUT /config/datastore/{name}": {
83
115
  "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
116
+ "delete": {"each":true,"enum":["comment","gc-schedule","gc-on-unmount","prune-schedule","keep-last","keep-hourly","keep-daily","keep-weekly","keep-monthly","keep-yearly","verify-new","notify-user","notify","notification-mode","tuning","maintenance-mode","notification-thresholds","counter-reset-schedule"],"type":"array"},
84
117
  "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
85
118
  "keep-daily": {"minimum":1,"type":"integer"},
86
119
  "keep-hourly": {"minimum":1,"type":"integer"},
@@ -91,13 +124,39 @@ export const PBS_CONFIG_CONSTRAINTS: Readonly<Record<string, EndpointConstraints
91
124
  "notification-mode": {"default":"notification-system","enum":["legacy-sendmail","notification-system"],"type":"string"},
92
125
  "notify-user": {"maxLength":64,"minLength":3,"pattern":"^(?:[^\\s:/\\x00-\\x1f\\x7f]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[^\\s:/[:cntrl:]]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
93
126
  },
127
+ "pbs:PUT /config/notifications/endpoints/sendmail/{name}": {
128
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
129
+ "delete": {"each":true,"enum":["author","comment","disable","from-address","mailto","mailto-user"],"type":"array"},
130
+ "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
131
+ "mailto": {"each":true,"maxLength":64,"minLength":2,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"array"},
132
+ "mailto-user": {"each":true,"maxLength":64,"minLength":2,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"array"},
133
+ },
134
+ "pbs:PUT /config/notifications/endpoints/smtp/{name}": {
135
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
136
+ "delete": {"each":true,"enum":["author","comment","disable","mailto","mailto-user","password","port","username"],"type":"array"},
137
+ "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
138
+ "mailto": {"each":true,"maxLength":64,"minLength":2,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"array"},
139
+ "mailto-user": {"each":true,"maxLength":64,"minLength":2,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"array"},
140
+ "mode": {"default":"tls","enum":["insecure","starttls","tls"],"type":"string"},
141
+ "port": {"maximum":65535,"minimum":0,"type":"integer"},
142
+ },
143
+ "pbs:PUT /config/notifications/endpoints/webhook/{name}": {
144
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
145
+ "delete": {"each":true,"enum":["comment","disable","header","body","secret"],"type":"array"},
146
+ "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
147
+ "method": {"default":"post","enum":["post","put","get"],"type":"string"},
148
+ "url": {"pattern":"^https?://(?:(?:(?:(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?)\\.)*(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?))|(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|\\[(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){6})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:::(?:(?:[0-9a-fA-F]{1,4}):){5})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){4})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,1}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){3})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,2}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){2})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,3}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){1})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,4}(?:[0-9a-fA-F]{1,4}))?::)(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,5}(?:[0-9a-fA-F]{1,4}))?::)(?:[0-9a-fA-F]{1,4}))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,6}(?:[0-9a-fA-F]{1,4}))?::))))\\]))(?::(?:[0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?)|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){6})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:::(?:(?:[0-9a-fA-F]{1,4}):){5})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){4})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,1}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){3})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,2}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){2})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,3}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){1})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,4}(?:[0-9a-fA-F]{1,4}))?::)(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,5}(?:[0-9a-fA-F]{1,4}))?::)(?:[0-9a-fA-F]{1,4}))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,6}(?:[0-9a-fA-F]{1,4}))?::))))(?:/[^\u0000-\u001f]*)?$","patternSource":"/^https?://(?:(?:(?:(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?)\\.)*(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?))|(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|\\[(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){6})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:::(?:(?:[0-9a-fA-F]{1,4}):){5})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){4})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,1}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){3})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,2}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){2})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,3}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){1})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,4}(?:[0-9a-fA-F]{1,4}))?::)(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,5}(?:[0-9a-fA-F]{1,4}))?::)(?:[0-9a-fA-F]{1,4}))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,6}(?:[0-9a-fA-F]{1,4}))?::))))\\]))(?::(?:[0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?)|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){6})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:::(?:(?:[0-9a-fA-F]{1,4}):){5})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){4})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,1}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){3})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,2}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){2})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,3}(?:[0-9a-fA-F]{1,4}))?::(?:(?:[0-9a-fA-F]{1,4}):){1})(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,4}(?:[0-9a-fA-F]{1,4}))?::)(?:(?:(?:(?:(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])\\.){3}(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9]))|(?:[0-9a-fA-F]{1,4}):(?:[0-9a-fA-F]{1,4}))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,5}(?:[0-9a-fA-F]{1,4}))?::)(?:[0-9a-fA-F]{1,4}))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4}):){0,6}(?:[0-9a-fA-F]{1,4}))?::))))(?:/[^\u0000-\u001f]*)?$/","type":"string"},
149
+ },
94
150
  "pbs:PUT /config/notifications/matchers/{name}": {
95
151
  "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
152
+ "delete": {"each":true,"enum":["comment","disable","invert-match","match-calendar","match-field","match-severity","mode","target"],"type":"array"},
96
153
  "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
97
154
  "mode": {"default":"all","enum":["all","any"],"type":"string"},
155
+ "target": {"each":true,"maxLength":32,"minLength":2,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"array"},
98
156
  },
99
157
  "pbs:PUT /config/prune/{id}": {
100
158
  "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
159
+ "delete": {"each":true,"enum":["comment","disable","ns","max-depth","keep-last","keep-hourly","keep-daily","keep-weekly","keep-monthly","keep-yearly"],"type":"array"},
101
160
  "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
102
161
  "keep-daily": {"minimum":1,"type":"integer"},
103
162
  "keep-hourly": {"minimum":1,"type":"integer"},
@@ -111,9 +170,11 @@ export const PBS_CONFIG_CONSTRAINTS: Readonly<Record<string, EndpointConstraints
111
170
  },
112
171
  "pbs:PUT /config/sync/{id}": {
113
172
  "active-encryption-key": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
173
+ "associated-key": {"each":true,"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"array"},
114
174
  "burst-in": {"maxLength":64,"minLength":1,"type":"string"},
115
175
  "burst-out": {"maxLength":64,"minLength":1,"type":"string"},
116
176
  "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
177
+ "delete": {"each":true,"enum":["remote","owner","comment","schedule","remove-vanished","group-filter","rate-in","burst-in","rate-out","burst-out","ns","remote-ns","max-depth","transfer-last","encrypted-only","verified-only","run-on-mount","unmount-on-done","sync-direction","worker-threads","active-encryption-key","associated-key"],"type":"array"},
117
178
  "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
118
179
  "max-depth": {"maximum":7,"minimum":0,"type":"integer"},
119
180
  "ns": {"maxLength":256,"pattern":"^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$","patternSource":"/^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$/","type":"string"},
@@ -130,6 +191,7 @@ export const PBS_CONFIG_CONSTRAINTS: Readonly<Record<string, EndpointConstraints
130
191
  },
131
192
  "pbs:PUT /config/verify/{id}": {
132
193
  "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
194
+ "delete": {"each":true,"enum":["ignore-verified","comment","schedule","outdated-after","ns","max-depth","read-threads","verify-threads"],"type":"array"},
133
195
  "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
134
196
  "max-depth": {"default":"7","maximum":7,"minimum":0,"type":"integer"},
135
197
  "ns": {"maxLength":256,"pattern":"^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$","patternSource":"/^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$/","type":"string"},
@@ -6,12 +6,17 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 27 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
13
13
  * ⚠️ A `patternSource` with no `pattern` beside it is a rule that could NOT be carried into a
14
14
  * JavaScript RegExp faithfully (codegen/pattern.ts). It is recorded and NOT enforced.
15
+ * ⚠️ `pattern` IS NOT THE VENDOR'S SPELLING. For PVE it is anchored, because PVE applies
16
+ * `m/^$pattern$/` itself (JSONSchema.pm); for PBS it is the vendor's own, which already
17
+ * carries its anchors. `patternSource` is the spelling to quote at a human — param-rules.ts.
18
+ * ⚠️ `each: true` means the value rules describe every ELEMENT of a repeated key, because the
19
+ * parameter is an array and stated its limits on `items`.
15
20
  */
16
21
  import type { EndpointConstraints } from '../../constraints.ts';
17
22
 
@@ -29,11 +34,14 @@ export const PVE_ACCESS_CONSTRAINTS: Readonly<Record<string, EndpointConstraints
29
34
  "expire": {"minimum":0,"type":"integer"},
30
35
  "firstname": {"maxLength":1024,"type":"string"},
31
36
  "groups": {"format":"pve-groupid-list","type":"string"},
32
- "keys": {"pattern":"[0-9a-zA-Z!=]{0,4096}","patternSource":"[0-9a-zA-Z!=]{0,4096}","type":"string"},
37
+ "keys": {"pattern":"^[0-9a-zA-Z!=]{0,4096}\\n?$","patternSource":"[0-9a-zA-Z!=]{0,4096}","type":"string"},
33
38
  "lastname": {"maxLength":1024,"type":"string"},
34
39
  "password": {"maxLength":64,"minLength":8,"type":"string"},
35
40
  "userid": {"format":"pve-userid","maxLength":64,"required":true,"type":"string"},
36
41
  },
42
+ "pve:POST /access/users/{userid}/token/{tokenid}": {
43
+ "expire": {"default":"same as user","minimum":0,"type":"integer"},
44
+ },
37
45
  "pve:PUT /access/acl": {
38
46
  "groups": {"format":"pve-groupid-list","type":"string"},
39
47
  "path": {"required":true,"type":"string"},
@@ -51,7 +59,11 @@ export const PVE_ACCESS_CONSTRAINTS: Readonly<Record<string, EndpointConstraints
51
59
  "expire": {"minimum":0,"type":"integer"},
52
60
  "firstname": {"maxLength":1024,"type":"string"},
53
61
  "groups": {"format":"pve-groupid-list","type":"string"},
54
- "keys": {"pattern":"[0-9a-zA-Z!=]{0,4096}","patternSource":"[0-9a-zA-Z!=]{0,4096}","type":"string"},
62
+ "keys": {"pattern":"^[0-9a-zA-Z!=]{0,4096}\\n?$","patternSource":"[0-9a-zA-Z!=]{0,4096}","type":"string"},
55
63
  "lastname": {"maxLength":1024,"type":"string"},
56
64
  },
65
+ "pve:PUT /access/users/{userid}/token/{tokenid}": {
66
+ "delete": {"format":"pve-configid-list","type":"string"},
67
+ "expire": {"default":"same as user","minimum":0,"type":"integer"},
68
+ },
57
69
  };
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Generated pve-manager parameter constraints for `/cluster/backup` — DO NOT EDIT BY HAND.
3
+ *
4
+ * Run: bun codegen/constraints.ts
5
+ * Manifest entry: `pve-apidoc` — pve-manager 9.2.11/f6997e698c7933ea
6
+ * sha256 9def8f13611184ee, read on a PVE cluster node from
7
+ * /usr/share/pve-docs/api-viewer/apidoc.js
8
+ *
9
+ * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
+ * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
+ * and therefore unchecked at plan time.
12
+ *
13
+ * ⚠️ A `patternSource` with no `pattern` beside it is a rule that could NOT be carried into a
14
+ * JavaScript RegExp faithfully (codegen/pattern.ts). It is recorded and NOT enforced.
15
+ * ⚠️ `pattern` IS NOT THE VENDOR'S SPELLING. For PVE it is anchored, because PVE applies
16
+ * `m/^$pattern$/` itself (JSONSchema.pm); for PBS it is the vendor's own, which already
17
+ * carries its anchors. `patternSource` is the spelling to quote at a human — param-rules.ts.
18
+ * ⚠️ `each: true` means the value rules describe every ELEMENT of a repeated key, because the
19
+ * parameter is an array and stated its limits on `items`.
20
+ */
21
+ import type { EndpointConstraints } from '../../constraints.ts';
22
+
23
+ export const PVE_CLUSTER_BACKUP_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>> = {
24
+ "pve:POST /cluster/backup": {
25
+ "bwlimit": {"default":"0","minimum":0,"type":"integer"},
26
+ "comment": {"maxLength":512,"type":"string"},
27
+ "compress": {"default":"0","enum":["0","1","gzip","lzo","zstd"],"type":"string"},
28
+ "dow": {"default":"mon,tue,wed,thu,fri,sat,sun","format":"pve-day-of-week-list","type":"string"},
29
+ "exclude": {"format":"pve-vmid-list","type":"string"},
30
+ "fleecing": {"format":"backup-fleecing","type":"string"},
31
+ "id": {"format":"pve-configid","type":"string"},
32
+ "ionice": {"default":"7","maximum":8,"minimum":0,"type":"integer"},
33
+ "lockwait": {"default":"180","minimum":0,"type":"integer"},
34
+ "mailnotification": {"default":"always","enum":["always","failure"],"type":"string"},
35
+ "mailto": {"format":"email-or-username-list","type":"string"},
36
+ "mode": {"default":"snapshot","enum":["snapshot","suspend","stop"],"type":"string"},
37
+ "node": {"format":"pve-node","type":"string"},
38
+ "notes-template": {"maxLength":1024,"type":"string"},
39
+ "notification-mode": {"default":"auto","enum":["auto","legacy-sendmail","notification-system"],"type":"string"},
40
+ "pbs-change-detection-mode": {"enum":["legacy","data","metadata"],"type":"string"},
41
+ "performance": {"format":"backup-performance","type":"string"},
42
+ "prune-backups": {"default":"keep-all=1","format":"prune-backups","type":"string"},
43
+ "schedule": {"format":"pve-calendar-event","maxLength":128,"type":"string"},
44
+ "starttime": {"pattern":"^\\d{1,2}:\\d{1,2}\\n?$","patternSource":"\\d{1,2}:\\d{1,2}","type":"string"},
45
+ "stopwait": {"default":"10","minimum":0,"type":"integer"},
46
+ "storage": {"format":"pve-storage-id","type":"string"},
47
+ "vmid": {"format":"pve-vmid-list","type":"string"},
48
+ },
49
+ "pve:PUT /cluster/backup/{id}": {
50
+ "bwlimit": {"default":"0","minimum":0,"type":"integer"},
51
+ "comment": {"maxLength":512,"type":"string"},
52
+ "compress": {"default":"0","enum":["0","1","gzip","lzo","zstd"],"type":"string"},
53
+ "delete": {"format":"pve-configid-list","type":"string"},
54
+ "dow": {"format":"pve-day-of-week-list","type":"string"},
55
+ "exclude": {"format":"pve-vmid-list","type":"string"},
56
+ "fleecing": {"format":"backup-fleecing","type":"string"},
57
+ "ionice": {"default":"7","maximum":8,"minimum":0,"type":"integer"},
58
+ "lockwait": {"default":"180","minimum":0,"type":"integer"},
59
+ "mailnotification": {"default":"always","enum":["always","failure"],"type":"string"},
60
+ "mailto": {"format":"email-or-username-list","type":"string"},
61
+ "mode": {"default":"snapshot","enum":["snapshot","suspend","stop"],"type":"string"},
62
+ "node": {"format":"pve-node","type":"string"},
63
+ "notes-template": {"maxLength":1024,"type":"string"},
64
+ "notification-mode": {"default":"auto","enum":["auto","legacy-sendmail","notification-system"],"type":"string"},
65
+ "pbs-change-detection-mode": {"enum":["legacy","data","metadata"],"type":"string"},
66
+ "performance": {"format":"backup-performance","type":"string"},
67
+ "prune-backups": {"default":"keep-all=1","format":"prune-backups","type":"string"},
68
+ "schedule": {"format":"pve-calendar-event","maxLength":128,"type":"string"},
69
+ "starttime": {"pattern":"^\\d{1,2}:\\d{1,2}\\n?$","patternSource":"\\d{1,2}:\\d{1,2}","type":"string"},
70
+ "stopwait": {"default":"10","minimum":0,"type":"integer"},
71
+ "storage": {"format":"pve-storage-id","type":"string"},
72
+ "vmid": {"format":"pve-vmid-list","type":"string"},
73
+ },
74
+ };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Generated pve-manager parameter constraints for `/cluster/ceph` — DO NOT EDIT BY HAND.
3
+ *
4
+ * Run: bun codegen/constraints.ts
5
+ * Manifest entry: `pve-apidoc` — pve-manager 9.2.11/f6997e698c7933ea
6
+ * sha256 9def8f13611184ee, read on a PVE cluster node from
7
+ * /usr/share/pve-docs/api-viewer/apidoc.js
8
+ *
9
+ * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
+ * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
+ * and therefore unchecked at plan time.
12
+ *
13
+ * ⚠️ A `patternSource` with no `pattern` beside it is a rule that could NOT be carried into a
14
+ * JavaScript RegExp faithfully (codegen/pattern.ts). It is recorded and NOT enforced.
15
+ * ⚠️ `pattern` IS NOT THE VENDOR'S SPELLING. For PVE it is anchored, because PVE applies
16
+ * `m/^$pattern$/` itself (JSONSchema.pm); for PBS it is the vendor's own, which already
17
+ * carries its anchors. `patternSource` is the spelling to quote at a human — param-rules.ts.
18
+ * ⚠️ `each: true` means the value rules describe every ELEMENT of a repeated key, because the
19
+ * parameter is an array and stated its limits on `items`.
20
+ */
21
+ import type { EndpointConstraints } from '../../constraints.ts';
22
+
23
+ export const PVE_CLUSTER_CEPH_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>> = {
24
+ "pve:PUT /cluster/ceph/flags/{flag}": {
25
+ "value": {"required":true,"type":"boolean"},
26
+ },
27
+ };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Generated pve-manager parameter constraints for `/cluster/firewall` — DO NOT EDIT BY HAND.
3
+ *
4
+ * Run: bun codegen/constraints.ts
5
+ * Manifest entry: `pve-apidoc` — pve-manager 9.2.11/f6997e698c7933ea
6
+ * sha256 9def8f13611184ee, read on a PVE cluster node from
7
+ * /usr/share/pve-docs/api-viewer/apidoc.js
8
+ *
9
+ * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
+ * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
+ * and therefore unchecked at plan time.
12
+ *
13
+ * ⚠️ A `patternSource` with no `pattern` beside it is a rule that could NOT be carried into a
14
+ * JavaScript RegExp faithfully (codegen/pattern.ts). It is recorded and NOT enforced.
15
+ * ⚠️ `pattern` IS NOT THE VENDOR'S SPELLING. For PVE it is anchored, because PVE applies
16
+ * `m/^$pattern$/` itself (JSONSchema.pm); for PBS it is the vendor's own, which already
17
+ * carries its anchors. `patternSource` is the spelling to quote at a human — param-rules.ts.
18
+ * ⚠️ `each: true` means the value rules describe every ELEMENT of a repeated key, because the
19
+ * parameter is an array and stated its limits on `items`.
20
+ */
21
+ import type { EndpointConstraints } from '../../constraints.ts';
22
+
23
+ export const PVE_CLUSTER_FIREWALL_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>> = {
24
+ "pve:POST /cluster/firewall/aliases": {
25
+ "cidr": {"format":"IPorCIDR","required":true,"type":"string"},
26
+ "comment": {"format":"pve-fw-comment-spec","type":"string"},
27
+ "name": {"maxLength":64,"minLength":2,"pattern":"^[A-Za-z][A-Za-z0-9\\-\\_]+\\n?$","patternSource":"[A-Za-z][A-Za-z0-9\\-\\_]+","required":true,"type":"string"},
28
+ },
29
+ "pve:PUT /cluster/firewall/aliases/{name}": {
30
+ "cidr": {"format":"IPorCIDR","required":true,"type":"string"},
31
+ "comment": {"format":"pve-fw-comment-spec","type":"string"},
32
+ "digest": {"maxLength":64,"type":"string"},
33
+ "rename": {"maxLength":64,"minLength":2,"pattern":"^[A-Za-z][A-Za-z0-9\\-\\_]+\\n?$","patternSource":"[A-Za-z][A-Za-z0-9\\-\\_]+","type":"string"},
34
+ },
35
+ };