@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,189 +0,0 @@
|
|
|
1
|
-
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
-
import { chmod, cp, lstat, mkdir, readdir, realpath, rename, rm, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
4
|
-
import { isDeepStrictEqual } from 'node:util';
|
|
5
|
-
import { rsiBuildResources as io } from './rsi-build.js';
|
|
6
|
-
import { readRsiLocalUpdateLocked } from './rsi-local-update.js';
|
|
7
|
-
const kinds = ['rsi-local-cohorts', 'rsi-builds', 'rsi-release-builds'];
|
|
8
|
-
const hash = (value) => createHash('sha256').update(value).digest('hex');
|
|
9
|
-
function fail(message) { throw new Error(`rsi local resources: ${message}`); }
|
|
10
|
-
const inside = (root, path) => path === root || path.startsWith(root + sep);
|
|
11
|
-
const exact = (path) => isAbsolute(path) && resolve(path) === path && !path.includes('\0');
|
|
12
|
-
/** Include modes and directories: matching file bytes alone cannot prove a
|
|
13
|
-
* copied toolchain has retained its executable and private-directory contract. */
|
|
14
|
-
async function inventory(root, signal) {
|
|
15
|
-
let size = 0;
|
|
16
|
-
const entries = [];
|
|
17
|
-
const visit = async (path) => {
|
|
18
|
-
signal.throwIfAborted();
|
|
19
|
-
const item = await lstat(path);
|
|
20
|
-
if (entries.length >= 150_000 || item.isSymbolicLink() || (item.mode & 0o077) !== 0
|
|
21
|
-
|| process.getuid && item.uid !== process.getuid())
|
|
22
|
-
fail(`unsafe resource entry: ${path}`);
|
|
23
|
-
if (item.isDirectory()) {
|
|
24
|
-
await io.directory(path);
|
|
25
|
-
entries.push({ path: relative(root, path), mode: item.mode & 0o777, sha256: null });
|
|
26
|
-
for (const name of (await readdir(path)).sort())
|
|
27
|
-
await visit(join(path, name));
|
|
28
|
-
}
|
|
29
|
-
else if (item.isFile() && item.nlink === 1) {
|
|
30
|
-
size += item.size;
|
|
31
|
-
if (item.size > 268_435_456 || size > 4_294_967_296)
|
|
32
|
-
fail('resource tree exceeds size bound');
|
|
33
|
-
entries.push({ path: relative(root, path), mode: item.mode & 0o777,
|
|
34
|
-
sha256: hash(await io.readStable(path, 268_435_456, true)) });
|
|
35
|
-
}
|
|
36
|
-
else
|
|
37
|
-
fail(`resource is not a private regular file or directory: ${path}`);
|
|
38
|
-
};
|
|
39
|
-
await visit(root);
|
|
40
|
-
return entries;
|
|
41
|
-
}
|
|
42
|
-
function receipt(bytes) {
|
|
43
|
-
const value = JSON.parse(bytes.toString('utf8'));
|
|
44
|
-
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
45
|
-
fail('invalid resource receipt');
|
|
46
|
-
const { receiptDigest, ...body } = value;
|
|
47
|
-
if (receiptDigest !== hash(JSON.stringify(body)))
|
|
48
|
-
fail('resource receipt digest differs');
|
|
49
|
-
return body;
|
|
50
|
-
}
|
|
51
|
-
function encode(body) { return JSON.stringify({ ...body, receiptDigest: hash(JSON.stringify(body)) }); }
|
|
52
|
-
/** Caller owns the Home lifecycle lock and has stopped all Home writers. Only
|
|
53
|
-
* these three trees in the disposable stage are changed; source, profiles,
|
|
54
|
-
* owner authority and ledger still require the enclosing activation transaction.
|
|
55
|
-
* A crash requires discarding/recovering that stage, never reusing it as live. */
|
|
56
|
-
export async function stageRsiLocalUpdateResources(input) {
|
|
57
|
-
const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(600_000)]);
|
|
58
|
-
const { logicalHome, stagePhysicalHome, profile } = input;
|
|
59
|
-
if (!exact(logicalHome) || !exact(stagePhysicalHome) || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u.test(profile)
|
|
60
|
-
|| await realpath(logicalHome) !== logicalHome || await realpath(stagePhysicalHome) !== stagePhysicalHome
|
|
61
|
-
|| inside(logicalHome, stagePhysicalHome) || inside(stagePhysicalHome, logicalHome))
|
|
62
|
-
fail('stage must be a distinct canonical stopped Home');
|
|
63
|
-
await io.directory(stagePhysicalHome);
|
|
64
|
-
const prepared = await readRsiLocalUpdateLocked({ dshHome: logicalHome, profile, root: input.preparationRoot, signal });
|
|
65
|
-
if (!prepared.build || inside(stagePhysicalHome, prepared.root) || inside(prepared.root, stagePhysicalHome))
|
|
66
|
-
fail('stage overlaps preparation');
|
|
67
|
-
// Native (schema 3) candidates stage rsi-linux-runtimes rather than the image
|
|
68
|
-
// receipt tree; their relocation lands with the native install transaction.
|
|
69
|
-
// A native receipt can never be silently rehomed through the Docker layout.
|
|
70
|
-
if (prepared.build.sourceBuild.schemaVersion === 3)
|
|
71
|
-
fail('native runtime candidate activation is not available on the Docker staging path');
|
|
72
|
-
const original = {}, candidate = {};
|
|
73
|
-
for (const kind of kinds) {
|
|
74
|
-
await io.directory(join(logicalHome, kind));
|
|
75
|
-
await io.directory(join(stagePhysicalHome, kind));
|
|
76
|
-
await io.directory(join(prepared.candidateHome, kind));
|
|
77
|
-
original[kind] = await inventory(join(logicalHome, kind, profile), signal);
|
|
78
|
-
if (!isDeepStrictEqual(original[kind], await inventory(join(stagePhysicalHome, kind, profile), signal)))
|
|
79
|
-
fail(`copied original differs: ${kind}`);
|
|
80
|
-
candidate[kind] = await inventory(join(prepared.candidateHome, kind, profile), signal);
|
|
81
|
-
}
|
|
82
|
-
const cohortRoot = join(logicalHome, kinds[0], profile);
|
|
83
|
-
const originalCohort = receipt(await io.readStable(join(cohortRoot, 'receipt.json'), 20_971_520, true));
|
|
84
|
-
if (hash(JSON.stringify(originalCohort)) !== prepared.originalCohortDigest
|
|
85
|
-
|| typeof originalCohort.sourceRepository !== 'string' || !exact(originalCohort.sourceRepository))
|
|
86
|
-
fail('original cohort source differs');
|
|
87
|
-
if (inside(originalCohort.sourceRepository, stagePhysicalHome)
|
|
88
|
-
|| inside(stagePhysicalHome, originalCohort.sourceRepository))
|
|
89
|
-
fail('stage overlaps upstream source repository');
|
|
90
|
-
const { receiptDigest: _oldDigest, ...cohortBody } = prepared.cohort;
|
|
91
|
-
const cohort = JSON.parse(encode({ ...cohortBody, root: cohortRoot,
|
|
92
|
-
sourceRepository: originalCohort.sourceRepository,
|
|
93
|
-
packages: prepared.cohort.packages.map(item => ({ ...item, tarball: join(cohortRoot, 'artifacts', `${item.name.split('/')[1]}.tgz`) })) }));
|
|
94
|
-
const buildBody = receipt(await io.readStable(join(prepared.candidateHome, kinds[1], profile, 'bootstrap.json'), 65_536, true));
|
|
95
|
-
const sourceBuild = { ...prepared.build.sourceBuild, sourceBuild: {
|
|
96
|
-
...prepared.build.sourceBuild.sourceBuild,
|
|
97
|
-
repositorySandbox: { ...prepared.build.sourceBuild.sourceBuild.repositorySandbox,
|
|
98
|
-
seccompPath: join(logicalHome, kinds[1], profile, 'seccomp.json') },
|
|
99
|
-
} };
|
|
100
|
-
const releaseRoot = join(logicalHome, kinds[2], profile);
|
|
101
|
-
const oldReleaseRoot = join(prepared.candidateHome, kinds[2], profile);
|
|
102
|
-
const releaseBuild = { ...prepared.build.releaseBuild,
|
|
103
|
-
releaseBuild: Object.fromEntries(Object.entries(prepared.build.releaseBuild.releaseBuild).map(([key, pin]) => [key,
|
|
104
|
-
inside(oldReleaseRoot, pin.path) ? { ...pin, path: join(releaseRoot, relative(oldReleaseRoot, pin.path)) } : pin,
|
|
105
|
-
])) };
|
|
106
|
-
const releaseBody = receipt(await io.readStable(join(prepared.candidateHome, kinds[2], profile, 'bootstrap.json'), 65_536, true));
|
|
107
|
-
const receipts = {
|
|
108
|
-
'rsi-local-cohorts': { name: 'receipt.json', source: JSON.stringify(cohort) },
|
|
109
|
-
'rsi-builds': { name: 'bootstrap.json', source: encode({ ...buildBody, dshHome: logicalHome,
|
|
110
|
-
repository: join(logicalHome, 'rsi-sources', profile, 'checkout'), sourceBuild: sourceBuild.sourceBuild }) },
|
|
111
|
-
'rsi-release-builds': { name: 'bootstrap.json', source: encode({ ...releaseBody, dshHome: logicalHome,
|
|
112
|
-
releaseBuild: releaseBuild.releaseBuild }) },
|
|
113
|
-
};
|
|
114
|
-
const scratch = join(stagePhysicalHome, `.rsi-local-resources-${randomUUID()}`);
|
|
115
|
-
await mkdir(scratch, { mode: 0o700 });
|
|
116
|
-
const moved = [], installed = [];
|
|
117
|
-
let verified = false;
|
|
118
|
-
try {
|
|
119
|
-
// Build all replacement trees and verify them before replacing any stage resource.
|
|
120
|
-
for (const kind of kinds) {
|
|
121
|
-
const next = join(scratch, kind), source = join(prepared.candidateHome, kind, profile);
|
|
122
|
-
await cp(source, next, { recursive: true, dereference: false, verbatimSymlinks: true, errorOnExist: true, force: false });
|
|
123
|
-
if (!isDeepStrictEqual(await inventory(next, signal), candidate[kind]))
|
|
124
|
-
fail(`resource changed during copy: ${kind}`);
|
|
125
|
-
const update = receipts[kind], entry = candidate[kind].find(item => item.path === update.name);
|
|
126
|
-
if (!entry || entry.sha256 === null)
|
|
127
|
-
fail('resource receipt is missing from inventory');
|
|
128
|
-
await writeFile(join(next, update.name), update.source, { mode: entry.mode });
|
|
129
|
-
await chmod(join(next, update.name), entry.mode);
|
|
130
|
-
candidate[kind] = candidate[kind].map(item => item.path === update.name ? { ...item, sha256: hash(update.source) } : item);
|
|
131
|
-
if (!isDeepStrictEqual(await inventory(next, signal), candidate[kind]))
|
|
132
|
-
fail(`rebased resource differs: ${kind}`);
|
|
133
|
-
}
|
|
134
|
-
// Revalidate the preparation and originals after copying, before stage mutation.
|
|
135
|
-
if (!isDeepStrictEqual(await readRsiLocalUpdateLocked({ dshHome: logicalHome, profile, root: input.preparationRoot, signal }), prepared))
|
|
136
|
-
fail('preparation changed during copy');
|
|
137
|
-
for (const kind of kinds) {
|
|
138
|
-
if (!isDeepStrictEqual(await inventory(join(logicalHome, kind, profile), signal), original[kind])
|
|
139
|
-
|| !isDeepStrictEqual(await inventory(join(stagePhysicalHome, kind, profile), signal), original[kind]))
|
|
140
|
-
fail(`original resource changed: ${kind}`);
|
|
141
|
-
}
|
|
142
|
-
for (const kind of kinds) {
|
|
143
|
-
signal.throwIfAborted();
|
|
144
|
-
await rename(join(stagePhysicalHome, kind, profile), join(scratch, `old-${kind}`));
|
|
145
|
-
moved.push(kind);
|
|
146
|
-
await rename(join(scratch, kind), join(stagePhysicalHome, kind, profile));
|
|
147
|
-
installed.push(kind);
|
|
148
|
-
await io.syncDirectory(join(stagePhysicalHome, kind));
|
|
149
|
-
}
|
|
150
|
-
const proof = { schemaVersion: 1, dshHome: logicalHome, profile,
|
|
151
|
-
preparationDigest: prepared.receiptDigest,
|
|
152
|
-
original: Object.fromEntries(kinds.map(kind => [kind, hash(JSON.stringify(original[kind]))])),
|
|
153
|
-
candidate: Object.fromEntries(kinds.map(kind => [kind, hash(JSON.stringify(candidate[kind]))])) };
|
|
154
|
-
await verifyRsiLocalUpdateResources({ physicalHome: stagePhysicalHome, proof, signal });
|
|
155
|
-
verified = true;
|
|
156
|
-
await rm(scratch, { recursive: true });
|
|
157
|
-
return { cohort, sourceBuild, releaseBuild, proof };
|
|
158
|
-
}
|
|
159
|
-
catch (error) {
|
|
160
|
-
// Once backup cleanup begins, an incomplete cleanup is not permission to
|
|
161
|
-
// restore from backups that may already have been removed.
|
|
162
|
-
if (verified)
|
|
163
|
-
throw error;
|
|
164
|
-
// A failed restore deliberately keeps the scratch tree and surfaces the error.
|
|
165
|
-
for (const kind of moved.reverse()) {
|
|
166
|
-
if (installed.includes(kind))
|
|
167
|
-
await rm(join(stagePhysicalHome, kind, profile), { recursive: true });
|
|
168
|
-
await rename(join(scratch, `old-${kind}`), join(stagePhysicalHome, kind, profile));
|
|
169
|
-
await io.syncDirectory(join(stagePhysicalHome, kind));
|
|
170
|
-
}
|
|
171
|
-
await rm(scratch, { recursive: true });
|
|
172
|
-
throw error;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
export async function verifyRsiLocalUpdateResources(input) {
|
|
176
|
-
const { proof, physicalHome } = input;
|
|
177
|
-
if (proof.schemaVersion !== 1 || !exact(physicalHome) || await realpath(physicalHome) !== physicalHome
|
|
178
|
-
|| !exact(proof.dshHome) || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u.test(proof.profile)
|
|
179
|
-
|| !/^[a-f0-9]{64}$/u.test(proof.preparationDigest))
|
|
180
|
-
fail('invalid resource proof binding');
|
|
181
|
-
const signal = input.signal ?? new AbortController().signal;
|
|
182
|
-
for (const kind of kinds) {
|
|
183
|
-
await io.directory(join(physicalHome, kind));
|
|
184
|
-
if (hash(JSON.stringify(await inventory(join(physicalHome, kind, proof.profile), signal)))
|
|
185
|
-
!== (input.original ? proof.original : proof.candidate)[kind])
|
|
186
|
-
fail(`resource proof differs: ${kind}`);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
//# sourceMappingURL=rsi-local-resources.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rsi-local-resources.js","sourceRoot":"","sources":["../src/rsi-local-resources.ts"],"names":[],"mappings":"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"}
|