@dsh-enhanced/plugin-control-plane 0.1.48 → 0.1.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +187 -15
- package/bin/dsh-live-qualification-authority.js +15 -0
- package/bin/dsh-local-release-adapter.js +331 -9
- package/bin/dsh-systemd-host-attestor.js +359 -9
- package/bin/dsh-systemd-host-authority.js +12 -0
- package/lib/adoption-coordinator.d.ts +3 -1
- package/lib/adoption-coordinator.d.ts.map +1 -1
- package/lib/adoption-coordinator.js +24 -9
- package/lib/adoption-coordinator.js.map +1 -1
- package/lib/cli.d.ts.map +1 -1
- package/lib/cli.js +33 -14
- package/lib/cli.js.map +1 -1
- package/lib/creation-capability-feedback.d.ts +23 -0
- package/lib/creation-capability-feedback.d.ts.map +1 -0
- package/lib/creation-capability-feedback.js +132 -0
- package/lib/creation-capability-feedback.js.map +1 -0
- package/lib/creation-capability-journal.d.ts +66 -0
- package/lib/creation-capability-journal.d.ts.map +1 -0
- package/lib/creation-capability-journal.js +775 -0
- package/lib/creation-capability-journal.js.map +1 -0
- package/lib/creation-capability-runtime.d.ts +63 -0
- package/lib/creation-capability-runtime.d.ts.map +1 -0
- package/lib/creation-capability-runtime.js +578 -0
- package/lib/creation-capability-runtime.js.map +1 -0
- package/lib/creation-capability-source.d.ts +37 -0
- package/lib/creation-capability-source.d.ts.map +1 -0
- package/lib/creation-capability-source.js +328 -0
- package/lib/creation-capability-source.js.map +1 -0
- package/lib/creation-capability-types.d.ts +265 -0
- package/lib/creation-capability-types.d.ts.map +1 -0
- package/lib/creation-capability-types.js +2 -0
- package/lib/creation-capability-types.js.map +1 -0
- package/lib/deployment-readiness.d.ts +16 -0
- package/lib/deployment-readiness.d.ts.map +1 -1
- package/lib/deployment-readiness.js +48 -1
- package/lib/deployment-readiness.js.map +1 -1
- package/lib/effect-blocked-replay.js +2 -2
- package/lib/effect-blocked-replay.js.map +1 -1
- package/lib/foreground-deployment-runtime.d.ts +3 -0
- package/lib/foreground-deployment-runtime.d.ts.map +1 -1
- package/lib/foreground-deployment-runtime.js +55 -13
- package/lib/foreground-deployment-runtime.js.map +1 -1
- package/lib/foreground-deployment.d.ts.map +1 -1
- package/lib/foreground-deployment.js +5 -0
- package/lib/foreground-deployment.js.map +1 -1
- package/lib/host-attestor.d.ts +2 -0
- package/lib/host-attestor.d.ts.map +1 -1
- package/lib/host-attestor.js +8 -1
- package/lib/host-attestor.js.map +1 -1
- package/lib/host-inputs.d.ts +13 -0
- package/lib/host-inputs.d.ts.map +1 -0
- package/lib/host-inputs.js +162 -0
- package/lib/host-inputs.js.map +1 -0
- package/lib/host-maintenance.d.ts +61 -0
- package/lib/host-maintenance.d.ts.map +1 -0
- package/lib/host-maintenance.js +158 -0
- package/lib/host-maintenance.js.map +1 -0
- package/lib/host-readiness.d.ts +5 -0
- package/lib/host-readiness.d.ts.map +1 -0
- package/lib/host-readiness.js +22 -0
- package/lib/host-readiness.js.map +1 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -1
- package/lib/live-qualification-authority.d.ts +32 -0
- package/lib/live-qualification-authority.d.ts.map +1 -0
- package/lib/live-qualification-authority.js +280 -0
- package/lib/live-qualification-authority.js.map +1 -0
- package/lib/live-qualification-client.d.ts +4 -0
- package/lib/live-qualification-client.d.ts.map +1 -0
- package/lib/live-qualification-client.js +22 -0
- package/lib/live-qualification-client.js.map +1 -0
- package/lib/live-qualification-runtime.d.ts +78 -0
- package/lib/live-qualification-runtime.d.ts.map +1 -0
- package/lib/live-qualification-runtime.js +367 -0
- package/lib/live-qualification-runtime.js.map +1 -0
- package/lib/live-qualification.d.ts +73 -0
- package/lib/live-qualification.d.ts.map +1 -0
- package/lib/live-qualification.js +164 -0
- package/lib/live-qualification.js.map +1 -0
- package/lib/native-source-build-worker.d.ts +4 -0
- package/lib/native-source-build-worker.d.ts.map +1 -0
- package/lib/native-source-build-worker.js +87 -0
- package/lib/native-source-build-worker.js.map +1 -0
- package/lib/native-source-build.d.ts +36 -0
- package/lib/native-source-build.d.ts.map +1 -0
- package/lib/native-source-build.js +143 -0
- package/lib/native-source-build.js.map +1 -0
- package/lib/native-source-pack.d.ts +11 -0
- package/lib/native-source-pack.d.ts.map +1 -0
- package/lib/native-source-pack.js +83 -0
- package/lib/native-source-pack.js.map +1 -0
- package/lib/owner-task-gaps.d.ts +2 -0
- package/lib/owner-task-gaps.d.ts.map +1 -1
- package/lib/owner-task-gaps.js +9 -1
- package/lib/owner-task-gaps.js.map +1 -1
- package/lib/runtime-epoch.d.ts +69 -0
- package/lib/runtime-epoch.d.ts.map +1 -0
- package/lib/runtime-epoch.js +139 -0
- package/lib/runtime-epoch.js.map +1 -0
- package/lib/runtime-observer-protocol.d.ts +3 -3
- package/lib/runtime-observer-protocol.js +5 -5
- package/lib/runtime-observer-protocol.js.map +1 -1
- package/lib/runtime-observer.d.ts.map +1 -1
- package/lib/runtime-observer.js +42 -6
- package/lib/runtime-observer.js.map +1 -1
- package/lib/service.d.ts +248 -4
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +1431 -64
- package/lib/service.js.map +1 -1
- package/lib/source-adoption-authority.d.ts +3 -0
- package/lib/source-adoption-authority.d.ts.map +1 -1
- package/lib/source-adoption-authority.js +13 -3
- package/lib/source-adoption-authority.js.map +1 -1
- package/lib/source-adoption-runner.d.ts +3 -0
- package/lib/source-adoption-runner.d.ts.map +1 -1
- package/lib/source-adoption-runner.js +16 -4
- package/lib/source-adoption-runner.js.map +1 -1
- package/lib/source-approval-authority.d.ts.map +1 -1
- package/lib/source-approval-authority.js +1 -0
- package/lib/source-approval-authority.js.map +1 -1
- package/lib/source-baseline.d.ts +37 -0
- package/lib/source-baseline.d.ts.map +1 -0
- package/lib/source-baseline.js +250 -0
- package/lib/source-baseline.js.map +1 -0
- package/lib/source-build.d.ts +43 -9
- package/lib/source-build.d.ts.map +1 -1
- package/lib/source-build.js +670 -57
- package/lib/source-build.js.map +1 -1
- package/lib/source-context.d.ts +18 -0
- package/lib/source-context.d.ts.map +1 -1
- package/lib/source-context.js +85 -11
- package/lib/source-context.js.map +1 -1
- package/lib/source-creation.d.ts +106 -0
- package/lib/source-creation.d.ts.map +1 -0
- package/lib/source-creation.js +664 -0
- package/lib/source-creation.js.map +1 -0
- package/lib/source-job-types.d.ts +28 -1
- package/lib/source-job-types.d.ts.map +1 -1
- package/lib/source-jobs.d.ts +33 -3
- package/lib/source-jobs.d.ts.map +1 -1
- package/lib/source-jobs.js +420 -43
- package/lib/source-jobs.js.map +1 -1
- package/lib/source-maintenance.d.ts +66 -0
- package/lib/source-maintenance.d.ts.map +1 -0
- package/lib/source-maintenance.js +177 -0
- package/lib/source-maintenance.js.map +1 -0
- package/lib/source-revision.d.ts +57 -0
- package/lib/source-revision.d.ts.map +1 -0
- package/lib/source-revision.js +175 -0
- package/lib/source-revision.js.map +1 -0
- package/lib/source-workspace.d.ts +19 -14
- package/lib/source-workspace.d.ts.map +1 -1
- package/lib/source-workspace.js +90 -17
- package/lib/source-workspace.js.map +1 -1
- package/lib/sqlite.d.ts +13 -3
- package/lib/sqlite.d.ts.map +1 -1
- package/lib/sqlite.js +362 -1
- package/lib/sqlite.js.map +1 -1
- package/lib/store.d.ts +258 -3
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +2257 -96
- package/lib/store.js.map +1 -1
- package/lib/systemd-host-authority.d.ts +68 -0
- package/lib/systemd-host-authority.d.ts.map +1 -0
- package/lib/systemd-host-authority.js +424 -0
- package/lib/systemd-host-authority.js.map +1 -0
- package/lib/task-observation-evidence.d.ts +32 -0
- package/lib/task-observation-evidence.d.ts.map +1 -0
- package/lib/task-observation-evidence.js +62 -0
- package/lib/task-observation-evidence.js.map +1 -0
- package/lib/task-observation-runtime.d.ts +2 -3
- package/lib/task-observation-runtime.d.ts.map +1 -1
- package/lib/task-observation-runtime.js +7 -39
- package/lib/task-observation-runtime.js.map +1 -1
- package/lib/task-observation-store.js +1 -1
- package/lib/trust.d.ts.map +1 -1
- package/lib/trust.js +0 -0
- package/lib/trust.js.map +1 -1
- package/lib/types.d.ts +57 -7
- package/lib/types.d.ts.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +22 -14
|
@@ -6,7 +6,7 @@ import { basename, dirname, isAbsolute, join, resolve } from 'node:path'
|
|
|
6
6
|
import { DatabaseSync } from 'node:sqlite'
|
|
7
7
|
import { fileURLToPath } from 'node:url'
|
|
8
8
|
|
|
9
|
-
export const SYSTEMD_HOST_ATTESTOR_VERSION = 'dsh-systemd-host-attestor-
|
|
9
|
+
export const SYSTEMD_HOST_ATTESTOR_VERSION = 'dsh-systemd-host-attestor-8'
|
|
10
10
|
const DIGEST = /^[a-f0-9]{64}$/u
|
|
11
11
|
const ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/u
|
|
12
12
|
const UNIT_PROPERTIES = ['FragmentPath', 'DropInPaths', 'ExecStart', 'Environment', 'WorkingDirectory', 'User', 'Group', 'Type', 'KillMode']
|
|
@@ -104,8 +104,7 @@ function validateReadiness(ready, profilePath, withReload) {
|
|
|
104
104
|
if (new Set(ready.deploymentFiles.map(spec => spec.path)).size !== ready.deploymentFiles.length) fail('duplicate deployment pin')
|
|
105
105
|
if (ready.observer?.profilePath !== profilePath) fail('observer profile differs')
|
|
106
106
|
}
|
|
107
|
-
function loadConfig(environment, request) {
|
|
108
|
-
const config = parseJson(readSafe(environment.DSH_SYSTEMD_HOST_ATTESTOR_CONFIG, 65536, true), 'config')
|
|
107
|
+
function loadConfig(environment, request, config) {
|
|
109
108
|
object(config, ['schemaVersion', 'authority', 'keyId', 'privateKeyPath', 'stateRoot', 'executable', 'interpreter', 'processHelper',
|
|
110
109
|
'systemctl', 'scope', 'unit', 'unitProperties', 'profileFiles', 'authorization', 'timeoutMs', 'stableWindowMs', 'pollIntervalMs',
|
|
111
110
|
...([2, 3].includes(config.schemaVersion) ? ['readiness'] : [])], 'config')
|
|
@@ -207,6 +206,135 @@ function loadConfig(environment, request) {
|
|
|
207
206
|
assertCurrent(config, request)
|
|
208
207
|
return { config, privateKey }
|
|
209
208
|
}
|
|
209
|
+
|
|
210
|
+
const TEMPLATE_FIELDS = ['authority', 'keyId', 'privateKeyPath', 'stateRoot', 'executable', 'interpreter', 'processHelper',
|
|
211
|
+
'systemctl', 'scope', 'unit', 'unitProperties', 'timeoutMs', 'stableWindowMs', 'pollIntervalMs', 'readiness', 'recoveryReadiness']
|
|
212
|
+
|
|
213
|
+
async function processRunner(spec) {
|
|
214
|
+
const bytes = readSafe(spec.path, 1048576)
|
|
215
|
+
if (hash(bytes) !== spec.sha256) fail('process helper changed')
|
|
216
|
+
const { executeControlledProcess } = await import(`data:text/javascript;base64,${bytes.toString('base64')}`)
|
|
217
|
+
if (typeof executeControlledProcess !== 'function') fail('process helper contract is unavailable')
|
|
218
|
+
return executeControlledProcess
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** A pinned independent resolver authorizes each durable operation from its standing grant. */
|
|
222
|
+
async function resolveStandingConfig(wrapper, request) {
|
|
223
|
+
object(wrapper, ['schemaVersion', 'template', 'resolver'], 'standing config')
|
|
224
|
+
const template = object(wrapper.template, TEMPLATE_FIELDS, 'standing template')
|
|
225
|
+
pin(template.executable, 'attestor executable', true); pin(template.interpreter, 'attestor interpreter', true)
|
|
226
|
+
pin(template.processHelper, 'process helper')
|
|
227
|
+
if (runningHash(process.argv[1]) !== template.executable.sha256 || runningHash(process.execPath) !== template.interpreter.sha256) fail('running attestor identity differs')
|
|
228
|
+
const resolver = object(wrapper.resolver, ['executable', 'interpreter', 'configPath', 'configSha256', 'timeoutMs'], 'authorization resolver')
|
|
229
|
+
pin(resolver.executable, 'resolver executable', true)
|
|
230
|
+
if (resolver.interpreter !== null) pin(resolver.interpreter, 'resolver interpreter', true)
|
|
231
|
+
integer(resolver.timeoutMs, 'resolver timeout', 1000, 60000)
|
|
232
|
+
text(resolver.configSha256, 'resolver config digest', DIGEST)
|
|
233
|
+
const configBytes = readSafe(resolver.configPath, 65536, true)
|
|
234
|
+
if (hash(configBytes) !== resolver.configSha256) fail('resolver config changed')
|
|
235
|
+
const authorityConfig = parseJson(configBytes, 'resolver config')
|
|
236
|
+
if (canonical(authorityConfig.template) !== canonical(template)) fail('resolver template differs from standing config')
|
|
237
|
+
const execute = await processRunner(template.processHelper)
|
|
238
|
+
const specs = [resolver.executable, ...(resolver.interpreter ? [resolver.interpreter] : [])], descriptors = []
|
|
239
|
+
try {
|
|
240
|
+
for (const spec of specs) {
|
|
241
|
+
const fd = openSync(spec.path, F.O_RDONLY | F.O_NOFOLLOW); descriptors.push(fd)
|
|
242
|
+
const bytes = descriptorBytes(fd, 268435456)
|
|
243
|
+
if (hash(bytes) !== spec.sha256) fail('resolver inode changed')
|
|
244
|
+
if ((resolver.interpreter === null || spec === resolver.interpreter)
|
|
245
|
+
&& !bytes.subarray(0, 4).equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46]))) fail('script resolver requires a pinned interpreter with native ELF identity')
|
|
246
|
+
}
|
|
247
|
+
const result = await execute({ command: descriptors.length === 2 ? '/proc/self/fd/4' : '/proc/self/fd/3',
|
|
248
|
+
args: [...(descriptors.length === 2 ? ['/proc/self/fd/3'] : []), '--config', resolver.configPath],
|
|
249
|
+
env: { LANG: 'C', LC_ALL: 'C' }, stdio: ['pipe', 'pipe', 'ignore', ...descriptors],
|
|
250
|
+
stdin: `${JSON.stringify(request)}\n`, maximumOutput: 524288, timeoutMs: resolver.timeoutMs })
|
|
251
|
+
for (let index = 0; index < descriptors.length; index++) if (hash(descriptorBytes(descriptors[index], 268435456)) !== specs[index].sha256) fail('resolver mutated')
|
|
252
|
+
if (hash(readSafe(resolver.configPath, 65536, true)) !== resolver.configSha256) fail('resolver config changed during authorization')
|
|
253
|
+
const derived = parseJson(Buffer.from(result), 'resolved config')
|
|
254
|
+
for (const field of TEMPLATE_FIELDS.filter(field => field !== 'readiness' && field !== 'recoveryReadiness')) {
|
|
255
|
+
if (canonical(derived[field]) !== canonical(template[field])) fail('resolved static authority differs')
|
|
256
|
+
}
|
|
257
|
+
const expectedSchema = request.kind === 'dsh-runtime-epoch-request' ? (derived.maintenance === undefined ? 5 : 6)
|
|
258
|
+
: request.phase === 'reload' ? 1 : request.phase === 'readiness' ? 2 : 3
|
|
259
|
+
if (derived.schemaVersion !== expectedSchema || derived.authorization?.requestDigest !== digest(request)) fail('resolver did not authorize the exact phase and request')
|
|
260
|
+
if (expectedSchema !== 1) {
|
|
261
|
+
if (request.phase === 'rollback' && request.requirements?.action === 'stop') {
|
|
262
|
+
if (derived.readiness !== null) fail('resolved stop readiness differs')
|
|
263
|
+
} else {
|
|
264
|
+
const expected = request.phase === 'rollback' ? template.recoveryReadiness : template.readiness
|
|
265
|
+
if (canonical(derived.readiness?.client) !== canonical(expected?.client)
|
|
266
|
+
|| canonical(derived.readiness?.observer) !== canonical(expected?.observer)) fail('resolved observer authority differs')
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return derived
|
|
270
|
+
} finally { for (const fd of descriptors.reverse()) closeSync(fd) }
|
|
271
|
+
}
|
|
272
|
+
function loadEpochConfig(environment, request, config) {
|
|
273
|
+
object(config, ['schemaVersion', 'authority', 'keyId', 'privateKeyPath', 'stateRoot', 'executable', 'interpreter', 'processHelper',
|
|
274
|
+
'systemctl', 'scope', 'unit', 'unitProperties', 'profileFiles', 'authorization', 'timeoutMs', 'stableWindowMs', 'pollIntervalMs',
|
|
275
|
+
'readiness', ...(config.schemaVersion === 6 ? ['maintenance'] : [])], 'epoch config')
|
|
276
|
+
if (![5, 6].includes(config.schemaVersion)) fail('runtime epoch requires config schema 5 or 6')
|
|
277
|
+
if (config.schemaVersion === 6 && (!Array.isArray(config.maintenance) || !config.maintenance.length
|
|
278
|
+
|| config.maintenance.length > 256 || Buffer.byteLength(JSON.stringify(config.maintenance)) > 450000)) fail('maintenance chain exceeds bounds')
|
|
279
|
+
text(config.authority, 'authority', ID); text(config.keyId, 'keyId', ID)
|
|
280
|
+
integer(config.timeoutMs, 'timeout', 1000, 60000); integer(config.stableWindowMs, 'stable window', 50, 10000)
|
|
281
|
+
integer(config.pollIntervalMs, 'poll interval', 25, 1000)
|
|
282
|
+
if (config.stableWindowMs + config.pollIntervalMs >= config.timeoutMs || !['user', 'system'].includes(config.scope)) fail('epoch observation bounds are invalid')
|
|
283
|
+
const auth = object(config.authorization, ['installationId', 'ledger', 'profile', 'plan', 'activation', 'hostGeneration', 'requestDigest', 'notBefore', 'expiresAt'], 'epoch authorization')
|
|
284
|
+
text(auth.requestDigest, 'request digest', DIGEST)
|
|
285
|
+
if (digest(request) !== auth.requestDigest) fail('exact epoch request is not authorized')
|
|
286
|
+
object(auth.ledger, ['id', 'path'], 'ledger'); object(auth.profile, ['name', 'path'], 'profile')
|
|
287
|
+
object(auth.plan, ['id', 'digest'], 'plan'); object(auth.activation, ['id', 'fence'], 'activation')
|
|
288
|
+
text(auth.installationId, 'installation', /^[a-f0-9]{8}-[a-f0-9]{4}-[1-8][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/u)
|
|
289
|
+
for (const value of [auth.ledger.id, auth.plan.id, auth.activation.id]) text(value, 'identity', ID)
|
|
290
|
+
text(auth.plan.digest, 'plan digest', DIGEST); text(auth.profile.name, 'profile name', /^[a-z0-9][a-z0-9-]{0,63}$/u)
|
|
291
|
+
canonicalPath(auth.profile.path, 'profile'); canonicalPath(auth.ledger.path, 'ledger')
|
|
292
|
+
if (basename(auth.profile.path) !== auth.profile.name || basename(dirname(auth.profile.path)) !== 'profiles') fail('profile path and name differ')
|
|
293
|
+
integer(auth.activation.fence, 'fence', 1); integer(auth.hostGeneration, 'host generation', 1)
|
|
294
|
+
integer(auth.notBefore, 'authorization start'); integer(auth.expiresAt, 'authorization expiry', auth.notBefore + 1)
|
|
295
|
+
if (config.unit !== `dsh-profile-${auth.profile.name}.service`) fail('unit does not bind the profile')
|
|
296
|
+
object(config.unitProperties, UNIT_PROPERTIES, 'unit properties')
|
|
297
|
+
for (const property of UNIT_PROPERTIES) text(config.unitProperties[property], property)
|
|
298
|
+
if (!['simple', 'exec', 'notify'].includes(config.unitProperties.Type) || config.unitProperties.KillMode !== 'control-group') fail('unsupported unit lifecycle')
|
|
299
|
+
if (!Array.isArray(config.profileFiles) || config.profileFiles.length < 3 || config.profileFiles.length > 32) fail('profile pins are invalid')
|
|
300
|
+
const paths = config.profileFiles.map(spec => {
|
|
301
|
+
pin(spec, 'profile file')
|
|
302
|
+
if (!within(auth.profile.path, spec.path)) fail('profile pin is outside profile')
|
|
303
|
+
return spec.path
|
|
304
|
+
})
|
|
305
|
+
if (new Set(paths).size !== paths.length || !['package.json', 'pnpm-lock.yaml', 'cordis.patch.yml'].every(name => paths.includes(join(auth.profile.path, name)))) fail('profile manifest, lockfile and patch pins are required')
|
|
306
|
+
privateDirectory(config.stateRoot)
|
|
307
|
+
for (const path of [environment.DSH_SYSTEMD_HOST_ATTESTOR_CONFIG, config.privateKeyPath, config.stateRoot]) {
|
|
308
|
+
if (within(auth.profile.path, path)) fail('attestor authority must be outside the candidate profile')
|
|
309
|
+
}
|
|
310
|
+
const privateKey = createPrivateKey(readSafe(config.privateKeyPath, 16384, true))
|
|
311
|
+
if (privateKey.asymmetricKeyType !== 'ed25519') fail('signing key must be Ed25519')
|
|
312
|
+
pin(config.executable, 'attestor executable', true); pin(config.interpreter, 'attestor interpreter', true); pin(config.processHelper, 'process helper')
|
|
313
|
+
if (runningHash(process.argv[1]) !== config.executable.sha256 || runningHash(process.execPath) !== config.interpreter.sha256) fail('running attestor identity differs')
|
|
314
|
+
object(config.systemctl, ['path', 'sha256', 'interpreter'], 'systemctl')
|
|
315
|
+
pin({ path: config.systemctl.path, sha256: config.systemctl.sha256 }, 'systemctl', true)
|
|
316
|
+
if (config.systemctl.interpreter !== null) pin(config.systemctl.interpreter, 'systemctl interpreter', true)
|
|
317
|
+
object(request, ['schemaVersion', 'kind', 'operationId', 'requestedAt', 'receiptTtlMs', 'installationId', 'ledger', 'plan',
|
|
318
|
+
'activation', 'profile', 'issuer', 'predecessor', 'sequence', 'runtimeIdentityDigest'], 'epoch request')
|
|
319
|
+
if (request.schemaVersion !== 1 || request.kind !== 'dsh-runtime-epoch-request') fail('epoch request version or kind is invalid')
|
|
320
|
+
text(request.operationId, 'operation', ID); if (request.operationId.length > 152) fail('operation is too long for receipt identity')
|
|
321
|
+
integer(request.requestedAt, 'requestedAt'); integer(request.receiptTtlMs, 'receipt TTL', 1, 3600000)
|
|
322
|
+
integer(request.sequence, 'epoch sequence', 1); text(request.runtimeIdentityDigest, 'runtime identity digest', DIGEST)
|
|
323
|
+
const prior = object(request.predecessor, ['operationId', 'receiptDigest', 'hostGeneration'], 'epoch predecessor')
|
|
324
|
+
text(prior.operationId, 'predecessor operation', ID); text(prior.receiptDigest, 'predecessor digest', DIGEST)
|
|
325
|
+
integer(prior.hostGeneration, 'predecessor generation', 1)
|
|
326
|
+
if (prior.operationId === request.operationId || prior.hostGeneration !== auth.hostGeneration) fail('epoch predecessor is invalid')
|
|
327
|
+
for (const field of ['installationId', 'ledger', 'profile', 'plan', 'activation']) if (canonical(request[field]) !== canonical(auth[field])) fail(`${field} is not authorized`)
|
|
328
|
+
object(request.issuer, ['mode', 'id', 'version', 'path', 'sha256', 'interpreter', 'authority', 'keyId'], 'issuer')
|
|
329
|
+
text(request.issuer.id, 'issuer ID', ID)
|
|
330
|
+
if (request.issuer.mode !== 'configured-executable' || request.issuer.version !== SYSTEMD_HOST_ATTESTOR_VERSION
|
|
331
|
+
|| request.issuer.path !== config.executable.path || request.issuer.sha256 !== config.executable.sha256
|
|
332
|
+
|| canonical(request.issuer.interpreter) !== canonical(config.interpreter)
|
|
333
|
+
|| request.issuer.authority !== config.authority || request.issuer.keyId !== config.keyId) fail('issuer differs from owner configuration')
|
|
334
|
+
validateReadiness(config.readiness, auth.profile.path, false)
|
|
335
|
+
assertCurrent(config, request)
|
|
336
|
+
return { config, privateKey }
|
|
337
|
+
}
|
|
210
338
|
function assertCurrent(config, request) {
|
|
211
339
|
const now = Date.now(); const auth = config.authorization
|
|
212
340
|
if (request.requestedAt < auth.notBefore || request.requestedAt > now || now > auth.expiresAt) fail('authorization expired or not yet valid')
|
|
@@ -618,11 +746,226 @@ async function attestRollback(request, config, privateKey, db, execute, deadline
|
|
|
618
746
|
return cachedReceipt(db.prepare('SELECT * FROM reloads WHERE operation_id = ?').get(request.operationId), request, config, privateKey)
|
|
619
747
|
})
|
|
620
748
|
}
|
|
749
|
+
function retainedSignedReceipt(row, privateKey, label) {
|
|
750
|
+
if (!row?.receipt || !row.observation) fail(`${label} is unresolved`)
|
|
751
|
+
const receipt = parseJson(Buffer.from(row.receipt), `${label} receipt`)
|
|
752
|
+
const observation = parseJson(Buffer.from(row.observation), `${label} observation`)
|
|
753
|
+
const { signature, ...unsigned } = receipt
|
|
754
|
+
if (receipt.operationId !== row.operation_id || receipt.requestDigest !== row.request_digest
|
|
755
|
+
|| receipt.evidenceDigest !== digest(receipt.evidence) || receipt.evidence.probeDigest !== digest(observation)
|
|
756
|
+
|| typeof signature !== 'string' || !verify(null, Buffer.from(canonical(unsigned)), createPublicKey(privateKey), Buffer.from(signature, 'base64'))) {
|
|
757
|
+
fail(`${label} signed evidence is invalid`)
|
|
758
|
+
}
|
|
759
|
+
// A prior passed readiness is durable history even after its short live TTL.
|
|
760
|
+
return { receipt, observation }
|
|
761
|
+
}
|
|
762
|
+
function boundEpochPredecessor(db, request, config, privateKey) {
|
|
763
|
+
const scopeId = digest({ installation: request.installationId })
|
|
764
|
+
const reload = db.prepare('SELECT * FROM reloads WHERE scope_id = ? ORDER BY generation DESC LIMIT 1').get(scopeId)
|
|
765
|
+
if (!reload || reload.generation !== config.authorization.hostGeneration || !reload.request || !reload.config) fail('latest Host generation is unresolved or superseded')
|
|
766
|
+
const priorRequest = parseJson(Buffer.from(reload.request), 'historical reload request')
|
|
767
|
+
const priorConfig = parseJson(Buffer.from(reload.config), 'historical reload config')
|
|
768
|
+
if (reload.request_digest !== digest(priorRequest) || reload.config_digest !== digest(priorConfig)) fail('historical reload context changed')
|
|
769
|
+
for (const field of ['installationId', 'ledger', 'profile', 'plan', 'activation']) {
|
|
770
|
+
if (canonical(priorRequest[field]) !== canonical(request[field])) fail('historical reload context differs')
|
|
771
|
+
}
|
|
772
|
+
for (const field of ['authority', 'keyId', 'privateKeyPath', 'stateRoot', 'scope', 'unit', 'unitProperties', 'profileFiles', 'systemctl']) {
|
|
773
|
+
if (config.schemaVersion === 6 && ['unitProperties', 'profileFiles'].includes(field)) continue
|
|
774
|
+
if (canonical(priorConfig[field]) !== canonical(config[field])) fail('historical deployment differs')
|
|
775
|
+
}
|
|
776
|
+
const signedReload = retainedSignedReceipt(reload, privateKey, 'historical reload')
|
|
777
|
+
if (priorRequest.phase !== 'reload' || signedReload.receipt.phase !== 'reload' || signedReload.receipt.outcome !== 'passed'
|
|
778
|
+
|| signedReload.receipt.hostGeneration !== reload.generation || signedReload.receipt.authority !== config.authority
|
|
779
|
+
|| signedReload.receipt.keyId !== config.keyId || signedReload.receipt.evidence.reloaded !== true
|
|
780
|
+
|| signedReload.receipt.evidence.currentHostGeneration !== reload.generation
|
|
781
|
+
|| signedReload.observation.requestDigest !== reload.request_digest || signedReload.observation.configDigest !== reload.config_digest) fail('historical reload is invalid')
|
|
782
|
+
const readiness = db.prepare('SELECT * FROM readiness WHERE reload_id = ?').get(reload.operation_id)
|
|
783
|
+
const signedReady = retainedSignedReceipt(readiness, privateKey, 'historical readiness')
|
|
784
|
+
const ready = signedReady.receipt
|
|
785
|
+
if (readiness.reload_id !== reload.operation_id || ready.phase !== 'readiness' || ready.outcome !== 'passed'
|
|
786
|
+
|| ready.hostGeneration !== reload.generation || ready.installationId !== request.installationId
|
|
787
|
+
|| ready.planId !== request.plan.id || ready.planDigest !== request.plan.digest
|
|
788
|
+
|| ready.activationId !== request.activation.id || ready.fence !== request.activation.fence
|
|
789
|
+
|| ready.authority !== config.authority || ready.keyId !== config.keyId || ready.evidence.kind !== 'readiness'
|
|
790
|
+
|| ready.evidence.checks < 2 || ready.evidence.failures !== 0
|
|
791
|
+
|| signedReady.observation.reload?.operationId !== reload.operation_id
|
|
792
|
+
|| signedReady.observation.reload?.receiptDigest !== digest(signedReload.receipt)
|
|
793
|
+
|| signedReady.observation.reload?.generation !== reload.generation
|
|
794
|
+
|| request.predecessor.operationId !== ready.operationId || request.predecessor.receiptDigest !== digest(ready)
|
|
795
|
+
|| request.predecessor.hostGeneration !== ready.hostGeneration) fail('runtime epoch predecessor is not the applied signed readiness')
|
|
796
|
+
if (config.schemaVersion === 6) verifyEpochMaintenance(config, request, priorConfig, ready, privateKey)
|
|
797
|
+
return { reloadOperationId: reload.operation_id, readinessOperationId: ready.operationId,
|
|
798
|
+
readinessReceiptDigest: digest(ready), hostGeneration: reload.generation }
|
|
799
|
+
}
|
|
800
|
+
function verifyEpochMaintenance(config, request, original, ready, privateKey) {
|
|
801
|
+
const key = createPublicKey(privateKey), publicKeyPem = key.export({ type: 'spki', format: 'pem' }).toString()
|
|
802
|
+
let prior
|
|
803
|
+
for (const record of config.maintenance) {
|
|
804
|
+
object(record, ['schemaVersion', 'kind', 'transactionId', 'installationId', 'ledger', 'profile', 'plan', 'activation',
|
|
805
|
+
'predecessor', 'sequence', 'previousDigest', 'before', 'after', 'issuedAt', 'authority', 'keyId', 'publicKeyPem', 'signature'], 'maintenance record')
|
|
806
|
+
const { signature, ...unsigned } = record
|
|
807
|
+
if (record.schemaVersion !== 1 || record.kind !== 'dsh-host-maintenance'
|
|
808
|
+
|| record.publicKeyPem !== publicKeyPem || record.authority !== config.authority || record.keyId !== config.keyId
|
|
809
|
+
|| typeof signature !== 'string' || !verify(null, Buffer.from(canonical(unsigned)), key, Buffer.from(signature, 'base64'))
|
|
810
|
+
|| record.sequence !== (prior?.sequence ?? 0) + 1 || record.previousDigest !== (prior ? digest(prior) : null)
|
|
811
|
+
|| !Number.isSafeInteger(record.issuedAt) || record.issuedAt < (prior?.issuedAt ?? ready.observedAt)
|
|
812
|
+
|| record.issuedAt > Date.now() || canonical(record.predecessor) !== canonical(request.predecessor)) fail('maintenance signature or chain differs')
|
|
813
|
+
for (const field of ['installationId', 'ledger', 'profile', 'plan', 'activation']) {
|
|
814
|
+
if (canonical(record[field]) !== canonical(request[field])) fail('maintenance deployment identity differs')
|
|
815
|
+
}
|
|
816
|
+
for (const snapshot of [record.before, record.after]) object(snapshot,
|
|
817
|
+
['executor', 'profileFiles', 'baselineFiles', 'deploymentFiles', 'baselineDeploymentFiles', 'unitProperties'], 'maintenance snapshot')
|
|
818
|
+
if (prior ? canonical(record.before) !== canonical(prior.after)
|
|
819
|
+
: canonical(record.before.profileFiles) !== canonical(original.profileFiles)
|
|
820
|
+
|| canonical(record.before.unitProperties) !== canonical(original.unitProperties)) fail('maintenance predecessor deployment differs')
|
|
821
|
+
prior = record
|
|
822
|
+
}
|
|
823
|
+
if (!prior || canonical(prior.after.profileFiles) !== canonical(config.profileFiles)
|
|
824
|
+
|| canonical(prior.after.unitProperties) !== canonical(config.unitProperties)
|
|
825
|
+
|| canonical(prior.after.deploymentFiles.map(({ path, sha256 }) => ({ path, sha256 }))) !== canonical(config.readiness.deploymentFiles)) fail('maintenance current deployment differs')
|
|
826
|
+
}
|
|
827
|
+
function epochJournal(config) {
|
|
828
|
+
const path = join(config.stateRoot, 'runtime-epochs.sqlite')
|
|
829
|
+
for (const suffix of ['', '-wal', '-shm', '-journal']) if (existsSync(path + suffix)) readSafe(path + suffix, 67108864, true)
|
|
830
|
+
const oldMask = process.umask(0o077); let db
|
|
831
|
+
try { db = new DatabaseSync(path) } finally { process.umask(oldMask) }
|
|
832
|
+
try {
|
|
833
|
+
db.exec(`PRAGMA busy_timeout=1000; PRAGMA journal_mode=WAL; PRAGMA synchronous=FULL;
|
|
834
|
+
CREATE TABLE IF NOT EXISTS runtime_epochs (
|
|
835
|
+
operation_id TEXT PRIMARY KEY, request_digest TEXT NOT NULL, config_digest TEXT NOT NULL,
|
|
836
|
+
scope_id TEXT NOT NULL, host_generation INTEGER NOT NULL, sequence INTEGER NOT NULL,
|
|
837
|
+
runtime_identity_digest TEXT NOT NULL, predecessor_digest TEXT NOT NULL,
|
|
838
|
+
observation TEXT, receipt TEXT,
|
|
839
|
+
UNIQUE(scope_id, host_generation, sequence));`)
|
|
840
|
+
syncDirectory(config.stateRoot)
|
|
841
|
+
return db
|
|
842
|
+
} catch { db.close(); fail('private runtime epoch journal could not be opened') }
|
|
843
|
+
}
|
|
844
|
+
function epochCachedReceipt(row, request, config, privateKey) {
|
|
845
|
+
if (row.request_digest !== digest(request) || row.config_digest !== digest(config)
|
|
846
|
+
|| row.runtime_identity_digest !== request.runtimeIdentityDigest
|
|
847
|
+
|| row.predecessor_digest !== request.predecessor.receiptDigest) fail('runtime epoch operation identity changed')
|
|
848
|
+
if (row.receipt === null) return undefined
|
|
849
|
+
if (row.observation === null) fail('runtime epoch receipt lacks observation')
|
|
850
|
+
const receipt = parseJson(Buffer.from(row.receipt), 'runtime epoch receipt')
|
|
851
|
+
const observation = parseJson(Buffer.from(row.observation), 'runtime epoch observation')
|
|
852
|
+
const { signature, ...unsigned } = receipt
|
|
853
|
+
if (receipt.requestDigest !== row.request_digest || receipt.runtimeIdentityDigest !== request.runtimeIdentityDigest
|
|
854
|
+
|| receipt.sequence !== request.sequence || receipt.hostGeneration !== request.predecessor.hostGeneration
|
|
855
|
+
|| receipt.evidence?.probeDigest !== digest(observation)
|
|
856
|
+
|| typeof signature !== 'string' || !verify(null, Buffer.from(canonical(unsigned)), createPublicKey(privateKey), Buffer.from(signature, 'base64'))) fail('cached runtime epoch receipt is invalid')
|
|
857
|
+
if (Date.now() > receipt.expiresAt) fail('cached runtime epoch receipt expired; owner reconciliation required')
|
|
858
|
+
return { receipt, observation }
|
|
859
|
+
}
|
|
860
|
+
async function attestEpoch(request, config, privateKey) {
|
|
861
|
+
const execute = await processRunner(config.processHelper)
|
|
862
|
+
const deadline = performance.now() + config.timeoutMs
|
|
863
|
+
const oldPath = join(config.stateRoot, 'reload.sqlite')
|
|
864
|
+
readSafe(oldPath, 67108864, true)
|
|
865
|
+
const historical = new DatabaseSync(oldPath, { readOnly: true })
|
|
866
|
+
const epochs = epochJournal(config)
|
|
867
|
+
try {
|
|
868
|
+
const binding = boundEpochPredecessor(historical, request, config, privateKey)
|
|
869
|
+
const scopeId = digest({ installation: request.installationId })
|
|
870
|
+
const row = transaction(epochs, () => {
|
|
871
|
+
const existing = epochs.prepare('SELECT * FROM runtime_epochs WHERE operation_id = ?').get(request.operationId)
|
|
872
|
+
const latest = epochs.prepare('SELECT * FROM runtime_epochs WHERE scope_id = ? AND host_generation = ? ORDER BY sequence DESC LIMIT 1').get(scopeId, binding.hostGeneration)
|
|
873
|
+
if (existing) {
|
|
874
|
+
if (latest?.sequence !== existing.sequence) fail('runtime epoch operation was superseded')
|
|
875
|
+
epochCachedReceipt(existing, request, config, privateKey)
|
|
876
|
+
return existing
|
|
877
|
+
}
|
|
878
|
+
if (request.sequence <= (latest?.sequence ?? 0)) fail('runtime epoch sequence is stale')
|
|
879
|
+
epochs.prepare(`INSERT INTO runtime_epochs(operation_id, request_digest, config_digest, scope_id, host_generation,
|
|
880
|
+
sequence, runtime_identity_digest, predecessor_digest) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
881
|
+
.run(request.operationId, digest(request), digest(config), scopeId, binding.hostGeneration,
|
|
882
|
+
request.sequence, request.runtimeIdentityDigest, request.predecessor.receiptDigest)
|
|
883
|
+
return epochs.prepare('SELECT * FROM runtime_epochs WHERE operation_id = ?').get(request.operationId)
|
|
884
|
+
})
|
|
885
|
+
const cached = epochCachedReceipt(row, request, config, privateKey)
|
|
886
|
+
const retained = cached?.observation
|
|
887
|
+
const ready = config.readiness
|
|
888
|
+
const bytes = readSafe(ready.client.path, 1048576)
|
|
889
|
+
if (hash(bytes) !== ready.client.sha256) fail('observer client changed')
|
|
890
|
+
const client = await import(`data:text/javascript;base64,${bytes.toString('base64')}`)
|
|
891
|
+
client.validateRuntimeObserverConfig(ready.observer)
|
|
892
|
+
const observerDigest = client.runtimeConfigDigest(ready.observer)
|
|
893
|
+
const channelDigest = hash(readSafe(ready.observer.keyPath, 32, true))
|
|
894
|
+
let stable; let supervisor; let started; let failures = 0
|
|
895
|
+
const samples = [], challenges = new Set()
|
|
896
|
+
for (;;) {
|
|
897
|
+
assertCurrent(config, request); remaining(deadline)
|
|
898
|
+
if (canonical(boundEpochPredecessor(historical, request, config, privateKey)) !== canonical(binding)) fail('Host generation changed during runtime epoch')
|
|
899
|
+
const before = await observe(config, execute, deadline)
|
|
900
|
+
if (!active(before)) fail('target service is not active for runtime epoch')
|
|
901
|
+
if (supervisor === undefined) supervisor = before
|
|
902
|
+
else if (canonical(supervisor) !== canonical(before)) fail('supervisor changed during runtime epoch')
|
|
903
|
+
if (hash(readSafe(ready.observer.keyPath, 32, true)) !== channelDigest) fail('observer key changed')
|
|
904
|
+
const queriedAt = Date.now()
|
|
905
|
+
const sample = await client.queryRuntimeObserver({ ...ready.observer, signal: AbortSignal.timeout(remaining(deadline)) })
|
|
906
|
+
if (sample.profilePath !== request.profile.path || sample.observerConfigDigest !== observerDigest
|
|
907
|
+
|| sample.processId !== before.MainPID || sample.invocationId !== before.InvocationID
|
|
908
|
+
|| sample.observedAt < queriedAt || sample.observedAt > Date.now() || challenges.has(sample.challenge)
|
|
909
|
+
|| sample.entries.length !== ready.observer.targets.length) fail('observer identity or freshness differs')
|
|
910
|
+
challenges.add(sample.challenge)
|
|
911
|
+
let sampleFailed = false
|
|
912
|
+
for (const target of ready.observer.targets) {
|
|
913
|
+
const entry = sample.entries.find(item => item.entryId === target.entryId)
|
|
914
|
+
if (!entry || entry.module !== target.module || entry.configDigest !== target.configDigest
|
|
915
|
+
|| canonical(entry.services.map(service => service.name).sort()) !== canonical([...target.services].sort())) fail('candidate identity differs')
|
|
916
|
+
if (entry.active === true) {
|
|
917
|
+
if (!entry.instance || [...entry.dependencies, ...entry.services].some(service => !service.instance)) fail('active candidate is not ready')
|
|
918
|
+
} else if (entry.active === false) sampleFailed = true
|
|
919
|
+
else fail('candidate active state is invalid')
|
|
920
|
+
}
|
|
921
|
+
const { challenge: _challenge, observedAt: _observedAt, ...identity } = sample
|
|
922
|
+
if (digest(identity) !== request.runtimeIdentityDigest) fail('runtime identity differs from requested epoch')
|
|
923
|
+
if (stable === undefined) { stable = identity; started = performance.now() }
|
|
924
|
+
else if (canonical(stable) !== canonical(identity)) fail('runtime instance changed during epoch')
|
|
925
|
+
if (retained && (canonical(identity) !== canonical(retained.runtime)
|
|
926
|
+
|| canonical(before) !== canonical(retained.supervisor) || channelDigest !== retained.channelDigest)) fail('cached runtime epoch identity changed')
|
|
927
|
+
if (sampleFailed) failures++
|
|
928
|
+
samples.push({ challenge: sample.challenge, observedAt: sample.observedAt, digest: digest(sample) })
|
|
929
|
+
const after = await observe(config, execute, deadline)
|
|
930
|
+
if (canonical(after) !== canonical(before)) fail('supervisor changed during runtime query')
|
|
931
|
+
if (samples.length >= 2 && performance.now() - started >= config.stableWindowMs) break
|
|
932
|
+
if (samples.length >= 256) fail('runtime epoch sample limit exceeded')
|
|
933
|
+
await new Promise(resolveDelay => setTimeout(resolveDelay, Math.min(config.pollIntervalMs, remaining(deadline))))
|
|
934
|
+
}
|
|
935
|
+
assertCurrent(config, request); assertProfile(config); remaining(deadline)
|
|
936
|
+
if (hash(readSafe(ready.observer.keyPath, 32, true)) !== channelDigest) fail('observer key changed')
|
|
937
|
+
const observation = { schemaVersion: 1, requestDigest: digest(request), configDigest: digest(config), binding,
|
|
938
|
+
channelDigest, supervisor, runtime: stable, samples, stableWindowMs: config.stableWindowMs, observedAt: Date.now() }
|
|
939
|
+
const evidence = { checks: samples.length, failures, probeDigest: digest(observation) }
|
|
940
|
+
const unsigned = { schemaVersion: 1, kind: 'dsh-runtime-epoch-receipt', receiptId: `receipt:${request.operationId}`,
|
|
941
|
+
operationId: request.operationId, requestDigest: digest(request), installationId: request.installationId,
|
|
942
|
+
planId: request.plan.id, planDigest: request.plan.digest, activationId: request.activation.id, fence: request.activation.fence,
|
|
943
|
+
hostGeneration: binding.hostGeneration, sequence: request.sequence, runtimeIdentityDigest: request.runtimeIdentityDigest,
|
|
944
|
+
authority: config.authority, keyId: config.keyId, outcome: failures === 0 ? 'passed' : 'failed',
|
|
945
|
+
observedAt: observation.observedAt, expiresAt: Math.min(observation.observedAt + request.receiptTtlMs, config.authorization.expiresAt), evidence }
|
|
946
|
+
if (unsigned.expiresAt <= unsigned.observedAt) fail('authorization expired before signing')
|
|
947
|
+
return transaction(epochs, () => {
|
|
948
|
+
assertCurrent(config, request); remaining(deadline)
|
|
949
|
+
if (canonical(boundEpochPredecessor(historical, request, config, privateKey)) !== canonical(binding)) fail('Host generation changed before epoch signing')
|
|
950
|
+
const current = epochs.prepare('SELECT * FROM runtime_epochs WHERE operation_id = ?').get(request.operationId)
|
|
951
|
+
const latest = epochs.prepare('SELECT operation_id FROM runtime_epochs WHERE scope_id = ? AND host_generation = ? ORDER BY sequence DESC LIMIT 1')
|
|
952
|
+
.get(scopeId, binding.hostGeneration)
|
|
953
|
+
if (latest?.operation_id !== request.operationId) fail('runtime epoch operation was superseded before signing')
|
|
954
|
+
const replay = epochCachedReceipt(current, request, config, privateKey)
|
|
955
|
+
if (replay) {
|
|
956
|
+
if (canonical(replay.observation.runtime) !== canonical(stable)
|
|
957
|
+
|| canonical(replay.observation.supervisor) !== canonical(supervisor)) fail('concurrent epoch identity differs')
|
|
958
|
+
return replay.receipt
|
|
959
|
+
}
|
|
960
|
+
const receipt = { ...unsigned, signature: sign(null, Buffer.from(canonical(unsigned)), privateKey).toString('base64') }
|
|
961
|
+
epochs.prepare('UPDATE runtime_epochs SET observation = ?, receipt = ? WHERE operation_id = ? AND receipt IS NULL')
|
|
962
|
+
.run(canonical(observation), canonical(receipt), request.operationId)
|
|
963
|
+
return epochCachedReceipt(epochs.prepare('SELECT * FROM runtime_epochs WHERE operation_id = ?').get(request.operationId), request, config, privateKey).receipt
|
|
964
|
+
})
|
|
965
|
+
} finally { epochs.close(); historical.close() }
|
|
966
|
+
}
|
|
621
967
|
async function attest(request, config, privateKey) {
|
|
622
|
-
const
|
|
623
|
-
if (hash(helperBytes) !== config.processHelper.sha256) fail('process helper changed')
|
|
624
|
-
const { executeControlledProcess: execute } = await import(`data:text/javascript;base64,${helperBytes.toString('base64')}`)
|
|
625
|
-
if (typeof execute !== 'function') fail('process helper contract is unavailable')
|
|
968
|
+
const execute = await processRunner(config.processHelper)
|
|
626
969
|
const deadline = performance.now() + config.timeoutMs
|
|
627
970
|
const db = journal(config)
|
|
628
971
|
try {
|
|
@@ -693,8 +1036,15 @@ export async function runSystemdHostAttestor(argv = process.argv.slice(2), envir
|
|
|
693
1036
|
let bytes = 0; const chunks = []
|
|
694
1037
|
for await (const chunk of process.stdin) { bytes += chunk.length; if (bytes > 65536) fail('request exceeds byte limit'); chunks.push(chunk) }
|
|
695
1038
|
const request = parseJson(Buffer.concat(chunks), 'request')
|
|
696
|
-
|
|
697
|
-
|
|
1039
|
+
const epoch = request?.kind === 'dsh-runtime-epoch-request'
|
|
1040
|
+
if (!epoch && !['reload', 'readiness', 'rollback'].includes(request?.phase)) fail('only reload, readiness, rollback and runtime epoch requests are supported')
|
|
1041
|
+
let input = parseJson(readSafe(environment.DSH_SYSTEMD_HOST_ATTESTOR_CONFIG, 65536, true), 'config')
|
|
1042
|
+
if (input.schemaVersion === 4) input = await resolveStandingConfig(input, request)
|
|
1043
|
+
if (epoch) {
|
|
1044
|
+
const { config, privateKey } = loadEpochConfig(environment, request, input)
|
|
1045
|
+
return attestEpoch(request, config, privateKey)
|
|
1046
|
+
}
|
|
1047
|
+
const { config, privateKey } = loadConfig(environment, request, input)
|
|
698
1048
|
return attest(request, config, privateKey)
|
|
699
1049
|
}
|
|
700
1050
|
if (process.argv[1] && (/^\/proc\/self\/fd\/\d+$/u.test(process.argv[1]) || realpathSync(process.argv[1]) === fileURLToPath(import.meta.url))) {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { realpathSync } from 'node:fs'
|
|
3
|
+
import { dirname, join } from 'node:path'
|
|
4
|
+
import { pathToFileURL } from 'node:url'
|
|
5
|
+
try {
|
|
6
|
+
const wrapper = realpathSync(process.argv[1])
|
|
7
|
+
const { runSystemdHostAuthority } = await import(pathToFileURL(join(dirname(wrapper), '../lib/systemd-host-authority.js')).href)
|
|
8
|
+
await runSystemdHostAuthority()
|
|
9
|
+
} catch {
|
|
10
|
+
process.stderr.write('systemd Host authority refused the request\n')
|
|
11
|
+
process.exitCode = 1
|
|
12
|
+
}
|
|
@@ -48,7 +48,9 @@ export declare class AdoptionCoordinatorRuntime {
|
|
|
48
48
|
assertCurrent: () => void;
|
|
49
49
|
});
|
|
50
50
|
start(): void;
|
|
51
|
-
close(
|
|
51
|
+
close(options?: {
|
|
52
|
+
skipPause?: boolean;
|
|
53
|
+
}): Promise<void>;
|
|
52
54
|
health: () => {
|
|
53
55
|
connected: boolean;
|
|
54
56
|
lastError: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adoption-coordinator.d.ts","sourceRoot":"","sources":["../src/adoption-coordinator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAuF,MAAM,qCAAqC,CAAA;AAE3K,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"adoption-coordinator.d.ts","sourceRoot":"","sources":["../src/adoption-coordinator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAuF,MAAM,qCAAqC,CAAA;AAE3K,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAWtD,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IACvF,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,yBAAyB,CAkB5G;AAKD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,KAAK,EAAE,iBAAiB,CAAA;IACxB,KAAK,EAAE,wBAAwB,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAqEhC;AAED,KAAK,WAAW,GAAG,IAAI,CAAC,2BAA2B,EAAE,sBAAsB,GAAG,iBAAiB,GAAG,8BAA8B,CAAC,CAAA;AAGjI,yFAAyF;AACzF,qBAAa,0BAA0B;IAWzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAsB;gBACV,OAAO,EAAE;QAAE,MAAM,EAAE,yBAAyB,CAAC;QAAC,KAAK,EAAE,iBAAiB,CAAC;QAAC,KAAK,EAAE,wBAAwB,CAAC;QAAC,WAAW,EAAE,WAAW,CAAC;QAAC,aAAa,EAAE,MAAM,IAAI,CAAA;KAAE;IAO3L,KAAK,IAAI,IAAI;IAmBb,KAAK,CAAC,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3D,MAAM;;;MAAgE;IAEtE,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,QAAQ;YAGF,OAAO;CAsCtB"}
|
|
@@ -2,6 +2,7 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
import { isAbsolute, resolve } from 'node:path';
|
|
3
3
|
import { activatePluginPlan, probePluginPlan } from './cli.js';
|
|
4
4
|
import { controlPlaneDigest } from './store.js';
|
|
5
|
+
import { invokeConfiguredRuntimeEpochAttestor } from './host-attestor.js';
|
|
5
6
|
const OWNER = 'plugin-control-plane-adoption-coordinator';
|
|
6
7
|
const EXECUTOR = 'plugin-control-plane-adoption-coordinator-v1';
|
|
7
8
|
const CATALOG = controlPlaneDigest({ executor: EXECUTOR, version: 1, operation: 'advance-adoption-handoff' });
|
|
@@ -30,7 +31,7 @@ export function validateAdoptionCoordinatorConfig(value) {
|
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
function terminal(plan) { return plan.status === 'activated' || plan.status === 'rolled-back'; }
|
|
33
|
-
function exposed(plan) { return plan.status === 'staging' || plan.status === 'commit-pending' || AWAITING.has(plan.status); }
|
|
34
|
+
function exposed(plan) { return plan.status === 'staging' || plan.status === 'commit-pending' || plan.status === 'awaiting-live-tasks' || AWAITING.has(plan.status); }
|
|
34
35
|
/**
|
|
35
36
|
* Advance an already signed source handoff only through Host attestation.
|
|
36
37
|
* This Host deliberately leaves `commit-pending` for the target Host.
|
|
@@ -63,14 +64,14 @@ export async function coordinateAdoptionHandoff(options) {
|
|
|
63
64
|
}
|
|
64
65
|
return restored;
|
|
65
66
|
};
|
|
66
|
-
const recoverExpired = async (plan) => {
|
|
67
|
+
const recoverExpired = async (plan, failureCode = 'adoption-handoff-expired') => {
|
|
67
68
|
if (plan.status === 'rollback-pending')
|
|
68
69
|
return finishRollback(plan);
|
|
69
70
|
if (!exposed(plan) || plan.activation === undefined)
|
|
70
71
|
return plan;
|
|
71
72
|
await current();
|
|
72
73
|
const rollback = options.store.requestActivationRollback({ planId: plan.id, expectedRevision: plan.revision,
|
|
73
|
-
fence: plan.activation.fence, failureCode
|
|
74
|
+
fence: plan.activation.fence, failureCode });
|
|
74
75
|
return finishRollback(rollback);
|
|
75
76
|
};
|
|
76
77
|
for (let phase = 0; phase < 16; phase++) {
|
|
@@ -93,6 +94,9 @@ export async function coordinateAdoptionHandoff(options) {
|
|
|
93
94
|
throw error;
|
|
94
95
|
}
|
|
95
96
|
await current();
|
|
97
|
+
const liveDeadline = options.store.getLiveQualificationDeadline(plan.id);
|
|
98
|
+
if (liveDeadline !== undefined && liveDeadline <= Date.now())
|
|
99
|
+
return recoverExpired(plan, 'live-qualification-expired');
|
|
96
100
|
const before = { status: plan.status, revision: plan.revision, fence: plan.activation?.fence };
|
|
97
101
|
if (plan.status === 'approved' || plan.status === 'staging') {
|
|
98
102
|
options.store.assertAdoptionHandoff(plan.id);
|
|
@@ -161,14 +165,16 @@ export class AdoptionCoordinatorRuntime {
|
|
|
161
165
|
throw error;
|
|
162
166
|
}
|
|
163
167
|
}
|
|
164
|
-
close() {
|
|
168
|
+
close(options = {}) {
|
|
165
169
|
return this.closing ??= (async () => {
|
|
166
170
|
this.active = false;
|
|
167
171
|
try {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
+
if (!options.skipPause) {
|
|
173
|
+
const registration = this.options.automations.inspectSystemOwnedActivation({ owner: OWNER, automationId: this.automationId });
|
|
174
|
+
if (registration?.activationNonce === this.activationNonce)
|
|
175
|
+
this.options.automations.reconcileSystem({ owner: OWNER,
|
|
176
|
+
automationId: this.automationId, idempotencyKey: `${this.automationId}:${this.generation}:pause`, desiredStatus: 'paused', definition: this.definition() });
|
|
177
|
+
}
|
|
172
178
|
}
|
|
173
179
|
finally {
|
|
174
180
|
this.abort.abort();
|
|
@@ -221,8 +227,17 @@ export class AdoptionCoordinatorRuntime {
|
|
|
221
227
|
}
|
|
222
228
|
const signal = AbortSignal.any([this.abort.signal, input.signal, AbortSignal.timeout(this.options.config.timeoutMs)]);
|
|
223
229
|
this.current(signal);
|
|
230
|
+
const epochs = this.options.store.pendingRuntimeEpochs(this.options.config.coordinatorId);
|
|
224
231
|
const handoffs = this.handoffs();
|
|
225
|
-
|
|
232
|
+
// Runtime continuity uses the same native Automation budget and lifetime as adoption.
|
|
233
|
+
if (epochs.length && (this.cursor++ % 2 === 0 || !handoffs.length)) {
|
|
234
|
+
const epoch = this.options.store.claimRuntimeEpoch(epochs[0].request.operationId, this.options.config.coordinatorId);
|
|
235
|
+
began = true;
|
|
236
|
+
const receipt = await invokeConfiguredRuntimeEpochAttestor(this.options.trust, epoch.request, signal);
|
|
237
|
+
this.current(signal);
|
|
238
|
+
this.options.store.applyRuntimeEpoch(receipt, this.options.trust);
|
|
239
|
+
}
|
|
240
|
+
else if (handoffs.length) {
|
|
226
241
|
const handoff = handoffs[this.cursor++ % handoffs.length];
|
|
227
242
|
began = true;
|
|
228
243
|
await coordinateAdoptionHandoff({ store: this.options.store, trust: this.options.trust, planId: handoff.planId, signal,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adoption-coordinator.js","sourceRoot":"","sources":["../src/adoption-coordinator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"adoption-coordinator.js","sourceRoot":"","sources":["../src/adoption-coordinator.ts"],"names":[],"mappings":"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"}
|
package/lib/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,iBAAiB,EAA6C,MAAM,YAAY,CAAA;AAGzF,OAAO,EAAsB,qBAAqB,EAA+F,MAAM,uBAAuB,CAAA;AAC9K,OAAO,EACuB,KAAK,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC/E,OAAO,KAAK,EACE,oBAAoB,EAC2F,MAAM,YAAY,CAAA;AAwB/I,OAAO,EAAE,qBAAqB,EAAE,CAAA;AA+uBhC;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAC;IAC3G,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2BvE;AAuCD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAC;IAC1G,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkGjG;AA0FD,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAC;IACvG,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAE/I;AAqWD,wBAAsB,gBAAgB,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmClF"}
|