@dsh-enhanced/lark-channel 0.1.67 → 0.1.70
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 +5 -5
- package/docs/operations.md +4 -1
- package/docs/rsi-setup.md +4 -6
- package/lib/adapter.d.ts +9 -0
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +29 -1
- package/lib/adapter.js.map +1 -1
- package/lib/rsi-bootstrap-manifest.d.ts +5 -5
- package/lib/rsi-bootstrap-manifest.d.ts.map +1 -1
- package/lib/rsi-bootstrap-manifest.js +35 -39
- package/lib/rsi-bootstrap-manifest.js.map +1 -1
- package/lib/rsi-build.d.ts +48 -38
- package/lib/rsi-build.d.ts.map +1 -1
- package/lib/rsi-build.js +68 -386
- package/lib/rsi-build.js.map +1 -1
- package/lib/rsi-install-inputs.js +2 -2
- package/lib/rsi-install-inputs.js.map +1 -1
- package/lib/rsi-install.d.ts +50 -3
- package/lib/rsi-install.d.ts.map +1 -1
- package/lib/rsi-install.js +244 -36
- package/lib/rsi-install.js.map +1 -1
- package/lib/rsi-local-cohort.d.ts.map +1 -1
- package/lib/rsi-local-cohort.js +32 -3
- package/lib/rsi-local-cohort.js.map +1 -1
- package/lib/rsi-local-update-build.d.ts +7 -7
- package/lib/rsi-local-update-build.d.ts.map +1 -1
- package/lib/rsi-local-update-build.js +8 -9
- package/lib/rsi-local-update-build.js.map +1 -1
- package/lib/rsi-local-update.d.ts +0 -3
- package/lib/rsi-local-update.d.ts.map +1 -1
- package/lib/rsi-local-update.js +1 -2
- package/lib/rsi-local-update.js.map +1 -1
- package/lib/rsi-native-install.d.ts +2 -2
- package/lib/rsi-native-install.d.ts.map +1 -1
- package/lib/rsi-native-install.js +3 -9
- package/lib/rsi-native-install.js.map +1 -1
- package/lib/rsi-native-profile.d.ts +2 -4
- package/lib/rsi-native-profile.d.ts.map +1 -1
- package/lib/rsi-native-profile.js +8 -18
- package/lib/rsi-native-profile.js.map +1 -1
- package/lib/rsi-plugin-creation.d.ts +1 -2
- package/lib/rsi-plugin-creation.d.ts.map +1 -1
- package/lib/rsi-plugin-creation.js +4 -12
- package/lib/rsi-plugin-creation.js.map +1 -1
- package/lib/rsi-release-build.d.ts +8 -6
- package/lib/rsi-release-build.d.ts.map +1 -1
- package/lib/rsi-release-build.js +13 -69
- package/lib/rsi-release-build.js.map +1 -1
- package/lib/rsi-scanner-retirement-stage.d.ts.map +1 -1
- package/lib/rsi-scanner-retirement-stage.js +3 -5
- package/lib/rsi-scanner-retirement-stage.js.map +1 -1
- package/lib/rsi-scanner-retirement-transition.d.ts.map +1 -1
- package/lib/rsi-scanner-retirement-transition.js +22 -12
- package/lib/rsi-scanner-retirement-transition.js.map +1 -1
- package/lib/rsi-setup.d.ts +2 -1
- package/lib/rsi-setup.d.ts.map +1 -1
- package/lib/rsi-setup.js +30 -53
- package/lib/rsi-setup.js.map +1 -1
- package/lib/sdk.d.ts +9 -1
- package/lib/sdk.d.ts.map +1 -1
- package/lib/sdk.js +57 -0
- package/lib/sdk.js.map +1 -1
- package/lib/types.d.ts +14 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +24 -21
- package/lib/rsi-creation-build.d.ts +0 -51
- package/lib/rsi-creation-build.d.ts.map +0 -1
- package/lib/rsi-creation-build.js +0 -415
- package/lib/rsi-creation-build.js.map +0 -1
- package/lib/rsi-local-resources.d.ts +0 -37
- package/lib/rsi-local-resources.d.ts.map +0 -1
- package/lib/rsi-local-resources.js +0 -189
- package/lib/rsi-local-resources.js.map +0 -1
|
@@ -1,415 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
|
-
import { chmod, lstat, mkdir, mkdtemp, readdir, rename, rm, stat } from 'node:fs/promises';
|
|
3
|
-
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
4
|
-
import { isDeepStrictEqual } from 'node:util';
|
|
5
|
-
import { rsiBuildResources as io, readRsiBuildEnvironment } from './rsi-build.js';
|
|
6
|
-
const COMMIT = /^[a-f0-9]{40}$/u;
|
|
7
|
-
const IMAGE = /^sha256:[a-f0-9]{64}$/u;
|
|
8
|
-
const PROFILE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
|
|
9
|
-
const PACKAGE_MANAGER = 'pnpm@11.7.0';
|
|
10
|
-
const FIXED = {
|
|
11
|
-
'scripts/isolation/build-plugin-verifier-image.mjs': 'abfa721cc51e29672f5f1b139c63d282ffeebdc4c4b96d4496c7c089d711891a',
|
|
12
|
-
'scripts/isolation/plugin-verifier.Dockerfile': '18bb3b1decd725875e42ad9cca36a42f3f8601488b541cda7e5858ff56c66902',
|
|
13
|
-
'scripts/isolation/plugin-observer-launcher.c': '75ba31c8a2a0eb09820066fc7c73efb087095cf5229e460c965daa8659af1d0e',
|
|
14
|
-
'plugins/assistant-verifier/src/plugin-behavior-runner.ts': 'b291cda21f24c5f03c295b816d68e6e50a6d507f837a3b7446986158f513dd18',
|
|
15
|
-
};
|
|
16
|
-
// Keep the exact previously reviewed asset set readable while upgrading an
|
|
17
|
-
// existing 0.2.0 cohort. Do not accept arbitrary mixtures of trusted hashes.
|
|
18
|
-
const HOST_020_FIXED = {
|
|
19
|
-
...FIXED,
|
|
20
|
-
'scripts/isolation/plugin-verifier.Dockerfile': '9301bf426688c46f3d4fd8bcae7acde5da283ed6730f87be1f225d93fca95823',
|
|
21
|
-
};
|
|
22
|
-
// The Linux observer adds Host-side delegation around the same fixed marker
|
|
23
|
-
// bodies. Review its whole source with each supported Host recipe as an exact
|
|
24
|
-
// set, while retaining the previously approved sets above unchanged.
|
|
25
|
-
const LINUX_OBSERVER_FIXED = {
|
|
26
|
-
...FIXED,
|
|
27
|
-
'plugins/assistant-verifier/src/plugin-behavior-runner.ts': 'e3a0813efe494ee9788eff83ae6b149ec81b68ba5297d35a992672cd2009f7a4',
|
|
28
|
-
};
|
|
29
|
-
const LINUX_OBSERVER_HOST_020_FIXED = {
|
|
30
|
-
...HOST_020_FIXED,
|
|
31
|
-
'plugins/assistant-verifier/src/plugin-behavior-runner.ts': LINUX_OBSERVER_FIXED['plugins/assistant-verifier/src/plugin-behavior-runner.ts'],
|
|
32
|
-
};
|
|
33
|
-
const LEGACY_FIXED = {
|
|
34
|
-
...FIXED,
|
|
35
|
-
'plugins/assistant-verifier/src/plugin-behavior-runner.ts': '1a7f5d9a686cc8615e403a9f5536701d759fc40ef9fa5fe7c29cbddb2891c187',
|
|
36
|
-
'scripts/isolation/build-plugin-verifier-image.mjs': 'ae615696e51f88be9ad1e5f1b2a8769b951d8f0632b13547fcfa8f23ab837802',
|
|
37
|
-
'scripts/isolation/plugin-verifier.Dockerfile': 'e3d4aad5d1a1fda8c1a01d080f32aceb9d6438954169b412ed96e8dde2fd22b2',
|
|
38
|
-
'scripts/isolation/plugin-observer-launcher.c': '90bb335432a74778d442e2fcab50a19fc4441191343eaa76beed09287515b0ce',
|
|
39
|
-
};
|
|
40
|
-
const WORKER_SHA = '0394f3974410fe00538fbd99e643a86672a7dfad7a1471af7280dce36668eef4';
|
|
41
|
-
const CANDIDATE_SHA = '051e76a0e45c50e434be757913f89a2be0ee5cac6941797924fb13b316695109';
|
|
42
|
-
function fail(message) { throw new Error(`rsi creation build: ${message}`); }
|
|
43
|
-
function digest(value) { return createHash('sha256').update(value).digest('hex'); }
|
|
44
|
-
function validPath(value) { return isAbsolute(value) && resolve(value) === value && !value.includes('\0'); }
|
|
45
|
-
async function base(input) {
|
|
46
|
-
if (!validPath(input.dshHome) || !PROFILE.test(input.profile)
|
|
47
|
-
|| input.source.schemaVersion !== 1 || !COMMIT.test(input.source.sourceCommit)
|
|
48
|
-
|| input.build.schemaVersion !== 1 || input.build.sourceCommit !== input.source.sourceCommit
|
|
49
|
-
|| !IMAGE.test(input.build.sourceBuild?.image ?? ''))
|
|
50
|
-
fail('invalid source build binding');
|
|
51
|
-
input.signal?.throwIfAborted();
|
|
52
|
-
const recorded = await readRsiBuildEnvironment({ dshHome: input.dshHome, profile: input.profile,
|
|
53
|
-
source: input.source, ...(input.signal ? { signal: input.signal } : {}) });
|
|
54
|
-
if (!isDeepStrictEqual(recorded, input.build))
|
|
55
|
-
fail('source build differs from recorded approved environment');
|
|
56
|
-
return recorded;
|
|
57
|
-
}
|
|
58
|
-
async function inputs(source) {
|
|
59
|
-
await io.directory(source.repository);
|
|
60
|
-
const contextFiles = ['package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml',
|
|
61
|
-
'scripts/isolation/plugin-verifier.Dockerfile', 'scripts/isolation/plugin-observer-launcher.c'];
|
|
62
|
-
for (const folder of ['plugins', 'packages']) {
|
|
63
|
-
await io.directory(join(source.repository, folder), false);
|
|
64
|
-
for (const entry of await readdir(join(source.repository, folder), { withFileTypes: true })) {
|
|
65
|
-
if (!entry.isDirectory() || entry.isSymbolicLink())
|
|
66
|
-
continue;
|
|
67
|
-
const packageDirectory = join(source.repository, folder, entry.name);
|
|
68
|
-
await io.directory(packageDirectory, false);
|
|
69
|
-
const name = `${folder}/${entry.name}/package.json`;
|
|
70
|
-
try {
|
|
71
|
-
await lstat(join(source.repository, name));
|
|
72
|
-
contextFiles.push(name);
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
if (error.code !== 'ENOENT')
|
|
76
|
-
throw error;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
contextFiles.sort();
|
|
81
|
-
if (contextFiles.length > 256)
|
|
82
|
-
fail('manifest count exceeds bound');
|
|
83
|
-
const files = new Map();
|
|
84
|
-
for (const name of [...contextFiles, ...Object.keys(FIXED)]) {
|
|
85
|
-
await io.directory(dirname(join(source.repository, name)), false);
|
|
86
|
-
files.set(name, await io.readStable(join(source.repository, name), 4_194_304));
|
|
87
|
-
}
|
|
88
|
-
const matches = (pins) => Object.entries(pins).every(([name, expected]) => digest(files.get(name)) === expected);
|
|
89
|
-
if (!matches(FIXED) && !matches(HOST_020_FIXED)
|
|
90
|
-
&& !matches(LINUX_OBSERVER_FIXED) && !matches(LINUX_OBSERVER_HOST_020_FIXED)
|
|
91
|
-
&& !(io.hostPlatform() === 'linux/amd64' && matches(LEGACY_FIXED)))
|
|
92
|
-
fail('trusted asset changed');
|
|
93
|
-
const manifest = JSON.parse(files.get('package.json').toString('utf8'));
|
|
94
|
-
if (manifest.name !== 'dsh-enhanced' || manifest.version !== source.version
|
|
95
|
-
|| manifest.packageManager !== PACKAGE_MANAGER)
|
|
96
|
-
fail('root manifest differs from source cohort');
|
|
97
|
-
const raw = files.get('plugins/assistant-verifier/src/plugin-behavior-runner.ts').toString('utf8');
|
|
98
|
-
const fixedAsset = (name) => {
|
|
99
|
-
const begin = `/* DSH_PLUGIN_VERIFIER_${name}_START\n`;
|
|
100
|
-
const end = `\nDSH_PLUGIN_VERIFIER_${name}_END */`;
|
|
101
|
-
const first = raw.indexOf(begin), last = raw.indexOf(end, first + begin.length);
|
|
102
|
-
if (first < 0 || last < 0 || raw.indexOf(begin, first + 1) >= 0 || raw.indexOf(end, last + 1) >= 0)
|
|
103
|
-
fail(`fixed ${name.toLowerCase()} markers invalid`);
|
|
104
|
-
const content = raw.slice(first + begin.length, last) + '\n';
|
|
105
|
-
if (Buffer.byteLength(content) > 32_768)
|
|
106
|
-
fail(`fixed ${name.toLowerCase()} exceeds bound`);
|
|
107
|
-
return content;
|
|
108
|
-
};
|
|
109
|
-
const worker = fixedAsset('WORKER'), candidate = fixedAsset('CANDIDATE');
|
|
110
|
-
if (digest(worker) !== WORKER_SHA || digest(candidate) !== CANDIDATE_SHA)
|
|
111
|
-
fail('fixed worker content changed');
|
|
112
|
-
// The approved builder extracts marker bodies from this file. Keep the
|
|
113
|
-
// snapshot limited to those bodies, without the surrounding app source.
|
|
114
|
-
const extraction = (name, body) => `/* DSH_PLUGIN_VERIFIER_${name}_START\n${body.trimEnd()}\nDSH_PLUGIN_VERIFIER_${name}_END */\n`;
|
|
115
|
-
files.set('plugins/assistant-verifier/src/plugin-behavior-runner.ts', Buffer.from(extraction('WORKER', worker) + extraction('CANDIDATE', candidate)));
|
|
116
|
-
const hashes = Object.fromEntries([...files].map(([name, bytes]) => [name, digest(bytes)]));
|
|
117
|
-
const lockSha256 = digest(files.get('pnpm-lock.yaml'));
|
|
118
|
-
const contextDigest = digest(JSON.stringify({ contextFiles, hashes, lockSha256, workerSha256: WORKER_SHA, candidateSha256: CANDIDATE_SHA }));
|
|
119
|
-
return { files, hashes, contextFiles, contextDigest, lockSha256 };
|
|
120
|
-
}
|
|
121
|
-
async function snapshot(root, files) {
|
|
122
|
-
for (const [name, bytes] of files) {
|
|
123
|
-
const path = join(root, name);
|
|
124
|
-
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
125
|
-
await io.writeExclusive(path, bytes);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
function parseOutput(raw, expected, sourceImage) {
|
|
129
|
-
if (Buffer.byteLength(raw) > 16_384)
|
|
130
|
-
fail('builder output exceeds bound');
|
|
131
|
-
const value = JSON.parse(raw);
|
|
132
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)
|
|
133
|
-
|| !isDeepStrictEqual(Object.keys(value).sort(), ['image', 'tag', 'sourceImage', 'lockSha256',
|
|
134
|
-
'workerSha256', 'candidateSha256', 'launcherSourceSha256', 'dockerfileSha256', 'contextFiles'].sort())
|
|
135
|
-
|| typeof value.image !== 'string' || !IMAGE.test(value.image)
|
|
136
|
-
|| value.sourceImage !== sourceImage || value.lockSha256 !== expected.lockSha256
|
|
137
|
-
|| value.workerSha256 !== WORKER_SHA || value.candidateSha256 !== CANDIDATE_SHA
|
|
138
|
-
|| value.launcherSourceSha256 !== expected.hashes['scripts/isolation/plugin-observer-launcher.c']
|
|
139
|
-
|| value.dockerfileSha256 !== expected.hashes['scripts/isolation/plugin-verifier.Dockerfile']
|
|
140
|
-
|| !isDeepStrictEqual(value.contextFiles, [...expected.contextFiles, 'worker.mjs', 'candidate.mjs'].sort()))
|
|
141
|
-
fail('builder output differs from frozen source inputs');
|
|
142
|
-
return value.image;
|
|
143
|
-
}
|
|
144
|
-
async function imageExists(dockerPath, image, scratch, signal, socket) {
|
|
145
|
-
const arch = io.hostPlatform().endsWith('/arm64') ? 'arm64' : 'amd64';
|
|
146
|
-
const actual = await io.command(dockerPath, io.dockerArgs(['image', 'inspect', '--format', '{{.Id}}/{{.Os}}/{{.Architecture}}', image], scratch, socket), io.isolatedEnvironment(scratch), signal, 30_000, 4096);
|
|
147
|
-
if (actual !== `${image}/linux/${arch}`)
|
|
148
|
-
fail('Docker image ID or platform differs from receipt');
|
|
149
|
-
}
|
|
150
|
-
async function replay(final, input, expected, dockerSha256, scratch, signal, daemonId) {
|
|
151
|
-
await io.directory(final);
|
|
152
|
-
if (!isDeepStrictEqual(await readdir(final), ['bootstrap.json']))
|
|
153
|
-
fail('behavior workspace incomplete or unexpected');
|
|
154
|
-
const value = JSON.parse((await io.readStable(join(final, 'bootstrap.json'), 65_536, true)).toString('utf8'));
|
|
155
|
-
const { receiptDigest, ...content } = value;
|
|
156
|
-
const socket = input.build.sourceBuild.socketPath;
|
|
157
|
-
if (!isDeepStrictEqual(Object.keys(content).sort(), ['schemaVersion', 'sourceCommit', 'sourceImage', 'image',
|
|
158
|
-
'dockerPath', 'dshHome', 'profile', 'dockerSha256', 'inputHashes', 'contextFiles', 'contextDigest', 'lockSha256',
|
|
159
|
-
...(socket === undefined ? [] : ['socketPath', 'hostPlatform', 'imagePlatform', 'daemonId'])].sort())
|
|
160
|
-
|| value.schemaVersion !== 1 || digest(JSON.stringify(content)) !== receiptDigest
|
|
161
|
-
|| value.dshHome !== input.dshHome || value.profile !== input.profile
|
|
162
|
-
|| value.sourceCommit !== input.source.sourceCommit || value.sourceImage !== input.build.sourceBuild.image
|
|
163
|
-
|| !IMAGE.test(value.image) || value.dockerPath !== input.build.sourceBuild.dockerPath
|
|
164
|
-
|| value.dockerSha256 !== dockerSha256 || value.socketPath !== socket
|
|
165
|
-
|| value.hostPlatform !== (socket === undefined ? undefined : io.hostPlatform())
|
|
166
|
-
|| value.imagePlatform !== (socket === undefined ? undefined : `linux/${io.hostPlatform().endsWith('/arm64') ? 'arm64' : 'amd64'}`)
|
|
167
|
-
|| (socket !== undefined && (!/^[A-Za-z0-9][A-Za-z0-9:._-]{7,127}$/u.test(value.daemonId ?? '')
|
|
168
|
-
|| value.daemonId !== input.build.sourceBuild.daemonId
|
|
169
|
-
|| daemonId !== undefined && value.daemonId !== daemonId))
|
|
170
|
-
|| !isDeepStrictEqual(value.inputHashes, expected.hashes)
|
|
171
|
-
|| !isDeepStrictEqual(value.contextFiles, expected.contextFiles)
|
|
172
|
-
|| value.contextDigest !== expected.contextDigest || value.lockSha256 !== expected.lockSha256)
|
|
173
|
-
fail('behavior receipt differs from approved source, assets, or Docker client');
|
|
174
|
-
if (scratch && signal) {
|
|
175
|
-
await imageExists(value.dockerPath, value.sourceImage, scratch, signal, socket);
|
|
176
|
-
await imageExists(value.dockerPath, value.image, scratch, signal, socket);
|
|
177
|
-
}
|
|
178
|
-
signal?.throwIfAborted();
|
|
179
|
-
return { schemaVersion: 1, sourceCommit: value.sourceCommit, sourceImage: value.sourceImage,
|
|
180
|
-
image: value.image, dockerPath: value.dockerPath, ...(socket === undefined ? {} : { socketPath: socket }) };
|
|
181
|
-
}
|
|
182
|
-
/** Verify frozen local inputs only. This reader never invokes Docker. */
|
|
183
|
-
export async function readRsiCreationBuildEnvironment(input) {
|
|
184
|
-
await base(input);
|
|
185
|
-
const expected = await inputs(input.source);
|
|
186
|
-
const dockerSha256 = digest(await io.readStable(input.build.sourceBuild.dockerPath, 100_000_000, false, true));
|
|
187
|
-
const parent = join(input.dshHome, 'rsi-creation-builds'), final = join(parent, input.profile);
|
|
188
|
-
await io.directory(parent);
|
|
189
|
-
return replay(final, input, expected, dockerSha256, undefined, input.signal);
|
|
190
|
-
}
|
|
191
|
-
/** Verify the frozen source and behavior images without building, pulling or
|
|
192
|
-
* changing the installed receipt. The ordinary reader never invokes Docker. */
|
|
193
|
-
export async function verifyRsiCreationBuildEnvironmentReady(input) {
|
|
194
|
-
const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(120_000)]);
|
|
195
|
-
signal.throwIfAborted();
|
|
196
|
-
const recorded = await readRsiCreationBuildEnvironment({ ...input, signal });
|
|
197
|
-
const parent = join(input.dshHome, 'rsi-creation-builds');
|
|
198
|
-
signal.throwIfAborted();
|
|
199
|
-
const scratch = await mkdtemp(join(parent, `.${input.profile}-ready-`));
|
|
200
|
-
try {
|
|
201
|
-
await chmod(scratch, 0o700);
|
|
202
|
-
await mkdir(join(scratch, 'docker-config'), { mode: 0o700 });
|
|
203
|
-
const build = input.build.sourceBuild, platform = io.hostPlatform();
|
|
204
|
-
const daemonId = await io.runtime(build.dockerPath, scratch, signal, platform, build.socketPath);
|
|
205
|
-
if (daemonId !== build.daemonId)
|
|
206
|
-
fail('Docker daemon differs from approved source build');
|
|
207
|
-
for (const image of [recorded.sourceImage, recorded.image]) {
|
|
208
|
-
await io.imageExists(recorded.dockerPath, image, scratch, signal, platform, recorded.socketPath, true);
|
|
209
|
-
}
|
|
210
|
-
if (await io.runtime(build.dockerPath, scratch, signal, platform, build.socketPath) !== daemonId) {
|
|
211
|
-
fail('Docker daemon changed during readiness check');
|
|
212
|
-
}
|
|
213
|
-
if (!isDeepStrictEqual(await readRsiCreationBuildEnvironment({ ...input, signal }), recorded)) {
|
|
214
|
-
fail('recorded behavior build changed during readiness check');
|
|
215
|
-
}
|
|
216
|
-
signal.throwIfAborted();
|
|
217
|
-
return recorded;
|
|
218
|
-
}
|
|
219
|
-
finally {
|
|
220
|
-
await rm(scratch, { recursive: true, force: true });
|
|
221
|
-
await io.syncDirectory(parent);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
export async function readRsiCreationBuildInStage(input) {
|
|
225
|
-
if (!validPath(input.logicalHome) || !validPath(input.stagePhysicalHome)
|
|
226
|
-
|| input.logicalHome === input.stagePhysicalHome || !PROFILE.test(input.profile)
|
|
227
|
-
|| input.stagedSource.repository !== join(input.logicalHome, 'rsi-sources', input.profile, 'checkout')
|
|
228
|
-
|| input.stagedSource.sourceCommit !== input.stagedBuild.sourceCommit) {
|
|
229
|
-
fail('staged creation binding differs');
|
|
230
|
-
}
|
|
231
|
-
const expected = await inputs({ ...input.stagedSource,
|
|
232
|
-
repository: join(input.stagePhysicalHome, 'rsi-sources', input.profile, 'checkout') });
|
|
233
|
-
const dockerSha256 = digest(await io.readStable(input.stagedBuild.sourceBuild.dockerPath, 100_000_000, false, true));
|
|
234
|
-
return replay(join(input.stagePhysicalHome, 'rsi-creation-builds', input.profile), { dshHome: input.logicalHome, profile: input.profile, source: input.stagedSource,
|
|
235
|
-
build: input.stagedBuild, ...(input.signal ? { signal: input.signal } : {}) }, expected, dockerSha256, undefined, input.signal);
|
|
236
|
-
}
|
|
237
|
-
/** Bind a freshly built candidate image to a stopped, copied Home. The old
|
|
238
|
-
* logical Home and the candidate receipt are never written by this operation. */
|
|
239
|
-
export async function materializeRsiCreationBuildInStage(input) {
|
|
240
|
-
const { candidateHome, stagePhysicalHome, logicalHome, profile, signal } = input;
|
|
241
|
-
if (!validPath(candidateHome) || !validPath(stagePhysicalHome) || !validPath(logicalHome)
|
|
242
|
-
|| !PROFILE.test(profile) || candidateHome === stagePhysicalHome || candidateHome === logicalHome
|
|
243
|
-
|| stagePhysicalHome === logicalHome || input.candidateSource.sourceCommit !== input.stagedSource.sourceCommit
|
|
244
|
-
|| input.candidateBuild.sourceCommit !== input.stagedBuild.sourceCommit
|
|
245
|
-
|| input.stagedSource.repository !== join(logicalHome, 'rsi-sources', profile, 'checkout')) {
|
|
246
|
-
fail('staged creation binding differs from new candidate');
|
|
247
|
-
}
|
|
248
|
-
const candidateSeccompPath = join(candidateHome, 'rsi-builds', profile, 'seccomp.json');
|
|
249
|
-
const stagedSeccompPath = join(logicalHome, 'rsi-builds', profile, 'seccomp.json');
|
|
250
|
-
if (input.candidateBuild.sourceBuild.repositorySandbox?.seccompPath !== candidateSeccompPath
|
|
251
|
-
|| input.stagedBuild.sourceBuild.repositorySandbox?.seccompPath !== stagedSeccompPath
|
|
252
|
-
|| !isDeepStrictEqual(input.stagedBuild.sourceBuild, { ...input.candidateBuild.sourceBuild,
|
|
253
|
-
repositorySandbox: { ...input.candidateBuild.sourceBuild.repositorySandbox, seccompPath: stagedSeccompPath } })) {
|
|
254
|
-
fail('staged creation build differs outside the approved seccomp relocation');
|
|
255
|
-
}
|
|
256
|
-
const candidateBuildPath = join(candidateHome, 'rsi-builds', profile, 'bootstrap.json');
|
|
257
|
-
const candidateBuildBytes = await io.readStable(candidateBuildPath, 65_536, true);
|
|
258
|
-
const candidateSeccompBytes = await io.readStable(candidateSeccompPath, 65_536, true);
|
|
259
|
-
const candidateInput = { dshHome: candidateHome, profile, source: input.candidateSource,
|
|
260
|
-
build: input.candidateBuild, ...(signal ? { signal } : {}) };
|
|
261
|
-
const creationBuild = await readRsiCreationBuildEnvironment(candidateInput);
|
|
262
|
-
const stageBuildPath = join(stagePhysicalHome, 'rsi-builds', profile, 'bootstrap.json');
|
|
263
|
-
if (!candidateBuildBytes.equals(await io.readStable(candidateBuildPath, 65_536, true))
|
|
264
|
-
|| !candidateSeccompBytes.equals(await io.readStable(candidateSeccompPath, 65_536, true))) {
|
|
265
|
-
fail('verified candidate build changed during relocation');
|
|
266
|
-
}
|
|
267
|
-
const candidateBuildReceipt = JSON.parse(candidateBuildBytes.toString('utf8'));
|
|
268
|
-
const stagedBuildReceipt = JSON.parse((await io.readStable(stageBuildPath, 65_536, true)).toString('utf8'));
|
|
269
|
-
const { receiptDigest: _candidateDigest, ...candidateBuildBody } = candidateBuildReceipt;
|
|
270
|
-
const expectedBuildBody = { ...candidateBuildBody, dshHome: logicalHome,
|
|
271
|
-
repository: input.stagedSource.repository, sourceBuild: input.stagedBuild.sourceBuild };
|
|
272
|
-
if (!isDeepStrictEqual(stagedBuildReceipt, { ...expectedBuildBody,
|
|
273
|
-
receiptDigest: digest(JSON.stringify(expectedBuildBody)) })
|
|
274
|
-
|| !candidateSeccompBytes.equals(await io.readStable(join(stagePhysicalHome, 'rsi-builds', profile, 'seccomp.json'), 65_536, true))) {
|
|
275
|
-
fail('staged build receipt or seccomp differs from verified candidate');
|
|
276
|
-
}
|
|
277
|
-
const candidatePath = join(candidateHome, 'rsi-creation-builds', profile, 'bootstrap.json');
|
|
278
|
-
const candidateBytes = await io.readStable(candidatePath, 65_536, true);
|
|
279
|
-
const candidateReceipt = JSON.parse(candidateBytes.toString('utf8'));
|
|
280
|
-
const expected = await inputs({ ...input.stagedSource,
|
|
281
|
-
repository: join(stagePhysicalHome, 'rsi-sources', profile, 'checkout') });
|
|
282
|
-
if (!isDeepStrictEqual(expected.hashes, candidateReceipt.inputHashes)
|
|
283
|
-
|| expected.contextDigest !== candidateReceipt.contextDigest
|
|
284
|
-
|| expected.lockSha256 !== candidateReceipt.lockSha256
|
|
285
|
-
|| !isDeepStrictEqual(expected.contextFiles, candidateReceipt.contextFiles)) {
|
|
286
|
-
fail('staged source inputs differ from freshly built behavior image');
|
|
287
|
-
}
|
|
288
|
-
const dockerSha256 = digest(await io.readStable(creationBuild.dockerPath, 100_000_000, false, true));
|
|
289
|
-
if (dockerSha256 !== candidateReceipt.dockerSha256)
|
|
290
|
-
fail('candidate Docker client changed');
|
|
291
|
-
const scratch = await mkdtemp(join(stagePhysicalHome, '.rsi-creation-verify-'));
|
|
292
|
-
try {
|
|
293
|
-
await chmod(scratch, 0o700);
|
|
294
|
-
await mkdir(join(scratch, 'docker-config'), { mode: 0o700 });
|
|
295
|
-
const deadline = AbortSignal.any([signal ?? new AbortController().signal, AbortSignal.timeout(120_000)]);
|
|
296
|
-
await imageExists(creationBuild.dockerPath, creationBuild.sourceImage, scratch, deadline, creationBuild.socketPath);
|
|
297
|
-
await imageExists(creationBuild.dockerPath, creationBuild.image, scratch, deadline, creationBuild.socketPath);
|
|
298
|
-
}
|
|
299
|
-
finally {
|
|
300
|
-
await rm(scratch, { recursive: true, force: true });
|
|
301
|
-
}
|
|
302
|
-
const content = { ...creationBuild, dshHome: logicalHome, profile, dockerSha256,
|
|
303
|
-
inputHashes: expected.hashes, contextFiles: expected.contextFiles,
|
|
304
|
-
contextDigest: expected.contextDigest, lockSha256: expected.lockSha256,
|
|
305
|
-
...(creationBuild.socketPath === undefined ? {} : { hostPlatform: io.hostPlatform(),
|
|
306
|
-
imagePlatform: `linux/${io.hostPlatform().endsWith('/arm64') ? 'arm64' : 'amd64'}`, daemonId: candidateReceipt.daemonId }) };
|
|
307
|
-
const bytes = JSON.stringify({ ...content, receiptDigest: digest(JSON.stringify(content)) });
|
|
308
|
-
const directory = join(stagePhysicalHome, 'rsi-creation-builds', profile);
|
|
309
|
-
await io.directory(directory);
|
|
310
|
-
const oldPath = join(directory, 'bootstrap.json');
|
|
311
|
-
await io.readStable(oldPath, 65_536, true);
|
|
312
|
-
const temporary = join(directory, `.bootstrap-${process.pid}-${Date.now()}.json`);
|
|
313
|
-
try {
|
|
314
|
-
await io.writeExclusive(temporary, bytes);
|
|
315
|
-
await rename(temporary, oldPath);
|
|
316
|
-
await io.syncDirectory(directory);
|
|
317
|
-
}
|
|
318
|
-
finally {
|
|
319
|
-
await rm(temporary, { force: true });
|
|
320
|
-
}
|
|
321
|
-
if (!isDeepStrictEqual(await readRsiCreationBuildInStage({ logicalHome, stagePhysicalHome, profile,
|
|
322
|
-
stagedSource: input.stagedSource, stagedBuild: input.stagedBuild, ...(signal ? { signal } : {}) }), creationBuild)) {
|
|
323
|
-
fail('materialized behavior image did not replay in the stopped stage');
|
|
324
|
-
}
|
|
325
|
-
return { creationBuild, candidateReceiptSha256: digest(candidateBytes), receiptSha256: digest(bytes) };
|
|
326
|
-
}
|
|
327
|
-
/** Caller holds the DSH_HOME lifecycle lock. Build or replay an immutable image. */
|
|
328
|
-
export async function prepareRsiCreationBuildEnvironment(input) {
|
|
329
|
-
const platform = io.hostPlatform();
|
|
330
|
-
await base(input);
|
|
331
|
-
const expected = await inputs(input.source);
|
|
332
|
-
const dockerPath = input.build.sourceBuild.dockerPath;
|
|
333
|
-
const socket = input.build.sourceBuild.socketPath;
|
|
334
|
-
if (platform.startsWith('darwin/') ? socket !== await io.localSocket(socket) : socket !== undefined)
|
|
335
|
-
fail('invalid portable Docker socket');
|
|
336
|
-
const dockerSha256 = digest(await io.readStable(dockerPath, 100_000_000, false, true));
|
|
337
|
-
const parent = join(input.dshHome, 'rsi-creation-builds');
|
|
338
|
-
try {
|
|
339
|
-
await mkdir(parent, { mode: 0o700 });
|
|
340
|
-
}
|
|
341
|
-
catch (error) {
|
|
342
|
-
if (error.code !== 'EEXIST')
|
|
343
|
-
throw error;
|
|
344
|
-
}
|
|
345
|
-
await io.directory(parent);
|
|
346
|
-
const final = join(parent, input.profile);
|
|
347
|
-
const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(1_860_000)]);
|
|
348
|
-
const stage = await mkdtemp(join(parent, `.${input.profile}-stage-`));
|
|
349
|
-
await chmod(stage, 0o700);
|
|
350
|
-
let claimed;
|
|
351
|
-
try {
|
|
352
|
-
await mkdir(join(stage, 'docker-config'), { mode: 0o700 });
|
|
353
|
-
const version = await io.command(dockerPath, io.dockerArgs(['version', '--format', '{{.Server.Version}}/{{.Server.Os}}/{{.Server.Arch}}'], stage, socket), io.isolatedEnvironment(stage), signal, 10_000, 4096);
|
|
354
|
-
const arch = platform.endsWith('/arm64') ? 'arm64' : 'amd64';
|
|
355
|
-
if (version !== `29.4.1/linux/${arch}`)
|
|
356
|
-
fail('Docker runtime version differs from approved runtime');
|
|
357
|
-
const daemonId = socket === undefined ? undefined : await io.command(dockerPath, io.dockerArgs(['info', '--format', '{{.ID}}'], stage, socket), io.isolatedEnvironment(stage), signal, 10_000, 4096);
|
|
358
|
-
if (socket !== undefined && !/^[A-Za-z0-9][A-Za-z0-9:._-]{7,127}$/u.test(daemonId ?? ''))
|
|
359
|
-
fail('Docker daemon identity is invalid');
|
|
360
|
-
const present = await lstat(final).then(() => true, error => {
|
|
361
|
-
if (error.code === 'ENOENT')
|
|
362
|
-
return false;
|
|
363
|
-
throw error;
|
|
364
|
-
});
|
|
365
|
-
if (present)
|
|
366
|
-
return await replay(final, input, expected, dockerSha256, stage, signal, daemonId);
|
|
367
|
-
await imageExists(dockerPath, input.build.sourceBuild.image, stage, signal, socket);
|
|
368
|
-
const context = join(stage, 'source');
|
|
369
|
-
await mkdir(context, { mode: 0o700 });
|
|
370
|
-
await snapshot(context, expected.files);
|
|
371
|
-
const builder = join(context, 'scripts/isolation/build-plugin-verifier-image.mjs');
|
|
372
|
-
const raw = await io.command(process.execPath, [builder, '--docker-path', dockerPath,
|
|
373
|
-
'--source-image', input.build.sourceBuild.image, '--timeout-ms', '1800000',
|
|
374
|
-
...(socket === undefined ? [] : ['--socket-path', socket, '--platform', arch])], { ...io.isolatedEnvironment(stage), TMPDIR: stage }, signal, 1_810_000);
|
|
375
|
-
const image = parseOutput(raw, expected, input.build.sourceBuild.image);
|
|
376
|
-
await imageExists(dockerPath, image, stage, signal, socket);
|
|
377
|
-
if (socket !== undefined) {
|
|
378
|
-
const after = await io.command(dockerPath, io.dockerArgs(['info', '--format', '{{.ID}}'], stage, socket), io.isolatedEnvironment(stage), signal, 10_000, 4096);
|
|
379
|
-
if (after !== daemonId)
|
|
380
|
-
fail('Docker daemon changed during behavior image build');
|
|
381
|
-
}
|
|
382
|
-
await base(input);
|
|
383
|
-
const fresh = await inputs(input.source);
|
|
384
|
-
if (!isDeepStrictEqual(fresh.hashes, expected.hashes) || fresh.contextDigest !== expected.contextDigest)
|
|
385
|
-
fail('source inputs changed during behavior image build');
|
|
386
|
-
signal.throwIfAborted();
|
|
387
|
-
await mkdir(final, { mode: 0o700 });
|
|
388
|
-
const identity = await stat(final);
|
|
389
|
-
claimed = { dev: identity.dev, ino: identity.ino };
|
|
390
|
-
const result = { schemaVersion: 1, sourceCommit: input.source.sourceCommit,
|
|
391
|
-
sourceImage: input.build.sourceBuild.image, image, dockerPath, ...(socket === undefined ? {} : { socketPath: socket }) };
|
|
392
|
-
const content = { ...result, dshHome: input.dshHome, profile: input.profile, dockerSha256,
|
|
393
|
-
inputHashes: expected.hashes, contextFiles: expected.contextFiles,
|
|
394
|
-
contextDigest: expected.contextDigest, lockSha256: expected.lockSha256,
|
|
395
|
-
...(socket === undefined ? {} : { hostPlatform: platform, imagePlatform: `linux/${arch}`, daemonId }) };
|
|
396
|
-
await io.writeExclusive(join(final, 'bootstrap.json'), JSON.stringify({ ...content, receiptDigest: digest(JSON.stringify(content)) }));
|
|
397
|
-
await io.syncDirectory(final);
|
|
398
|
-
await io.syncDirectory(parent);
|
|
399
|
-
return result;
|
|
400
|
-
}
|
|
401
|
-
catch (error) {
|
|
402
|
-
if (claimed) {
|
|
403
|
-
const current = await lstat(final).catch(() => undefined);
|
|
404
|
-
if (current?.isDirectory() && current.dev === claimed.dev && current.ino === claimed.ino
|
|
405
|
-
&& (await readdir(final)).every(name => name === 'bootstrap.json'))
|
|
406
|
-
await rm(final, { recursive: true, force: true });
|
|
407
|
-
}
|
|
408
|
-
throw error;
|
|
409
|
-
}
|
|
410
|
-
finally {
|
|
411
|
-
await rm(stage, { recursive: true, force: true });
|
|
412
|
-
await io.syncDirectory(parent);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
//# sourceMappingURL=rsi-creation-build.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rsi-creation-build.js","sourceRoot":"","sources":["../src/rsi-creation-build.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { type RsiBuildEnvironment } from './rsi-build.js';
|
|
2
|
-
import type { PreparedReleaseBuildEnvironment } from './rsi-release-build.js';
|
|
3
|
-
import type { RsiLocalCohort } from './rsi-local-cohort.js';
|
|
4
|
-
declare const kinds: readonly ["rsi-local-cohorts", "rsi-builds", "rsi-release-builds"];
|
|
5
|
-
type Kind = typeof kinds[number];
|
|
6
|
-
export interface RsiLocalResourceProof {
|
|
7
|
-
schemaVersion: 1;
|
|
8
|
-
dshHome: string;
|
|
9
|
-
profile: string;
|
|
10
|
-
preparationDigest: string;
|
|
11
|
-
original: Record<Kind, string>;
|
|
12
|
-
candidate: Record<Kind, string>;
|
|
13
|
-
}
|
|
14
|
-
/** Caller owns the Home lifecycle lock and has stopped all Home writers. Only
|
|
15
|
-
* these three trees in the disposable stage are changed; source, profiles,
|
|
16
|
-
* owner authority and ledger still require the enclosing activation transaction.
|
|
17
|
-
* A crash requires discarding/recovering that stage, never reusing it as live. */
|
|
18
|
-
export declare function stageRsiLocalUpdateResources(input: {
|
|
19
|
-
logicalHome: string;
|
|
20
|
-
stagePhysicalHome: string;
|
|
21
|
-
profile: string;
|
|
22
|
-
preparationRoot: string;
|
|
23
|
-
signal?: AbortSignal;
|
|
24
|
-
}): Promise<{
|
|
25
|
-
cohort: RsiLocalCohort;
|
|
26
|
-
sourceBuild: RsiBuildEnvironment;
|
|
27
|
-
releaseBuild: PreparedReleaseBuildEnvironment;
|
|
28
|
-
proof: RsiLocalResourceProof;
|
|
29
|
-
}>;
|
|
30
|
-
export declare function verifyRsiLocalUpdateResources(input: {
|
|
31
|
-
physicalHome: string;
|
|
32
|
-
proof: RsiLocalResourceProof;
|
|
33
|
-
original?: boolean;
|
|
34
|
-
signal?: AbortSignal;
|
|
35
|
-
}): Promise<void>;
|
|
36
|
-
export {};
|
|
37
|
-
//# sourceMappingURL=rsi-local-resources.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rsi-local-resources.d.ts","sourceRoot":"","sources":["../src/rsi-local-resources.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAClF,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAA;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAG3D,QAAA,MAAM,KAAK,oEAAqE,CAAA;AAChF,KAAK,IAAI,GAAG,OAAO,KAAK,CAAC,MAAM,CAAC,CAAA;AAMhC,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,CAAC,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;CAChC;AAoCD;;;kFAGkF;AAClF,wBAAsB,4BAA4B,CAAC,KAAK,EAAE;IACxD,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC/G,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,mBAAmB,CAAC;IACrE,YAAY,EAAE,+BAA+B,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAE,CAAC,CAqG/E;AAED,wBAAsB,6BAA6B,CAAC,KAAK,EAAE;IACzD,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC7F,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhB"}
|