@dsh-enhanced/lark-channel 0.1.47 → 0.1.49
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 +19 -8
- package/docs/rsi-setup.md +123 -11
- package/docs/setup.md +27 -14
- package/docs/supervised-growth.md +2 -0
- package/lib/adapter.d.ts +6 -0
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +79 -8
- package/lib/adapter.js.map +1 -1
- package/lib/business-cli-install.d.ts +9 -0
- package/lib/business-cli-install.d.ts.map +1 -0
- package/lib/business-cli-install.js +367 -0
- package/lib/business-cli-install.js.map +1 -0
- package/lib/business-environment.d.ts +2 -0
- package/lib/business-environment.d.ts.map +1 -0
- package/lib/business-environment.js +16 -0
- package/lib/business-environment.js.map +1 -0
- package/lib/business-skill.d.ts +32 -0
- package/lib/business-skill.d.ts.map +1 -0
- package/lib/business-skill.js +202 -0
- package/lib/business-skill.js.map +1 -0
- package/lib/rsi-authority-config.d.ts +29 -0
- package/lib/rsi-authority-config.d.ts.map +1 -0
- package/lib/rsi-authority-config.js +233 -0
- package/lib/rsi-authority-config.js.map +1 -0
- package/lib/rsi-authority-resources.d.ts +36 -0
- package/lib/rsi-authority-resources.d.ts.map +1 -0
- package/lib/rsi-authority-resources.js +139 -0
- package/lib/rsi-authority-resources.js.map +1 -0
- package/lib/rsi-authority-runtime.d.ts +50 -0
- package/lib/rsi-authority-runtime.d.ts.map +1 -0
- package/lib/rsi-authority-runtime.js +393 -0
- package/lib/rsi-authority-runtime.js.map +1 -0
- package/lib/rsi-bootstrap-manifest.d.ts +39 -0
- package/lib/rsi-bootstrap-manifest.d.ts.map +1 -0
- package/lib/rsi-bootstrap-manifest.js +366 -0
- package/lib/rsi-bootstrap-manifest.js.map +1 -0
- package/lib/rsi-bootstrap.d.ts +30 -0
- package/lib/rsi-bootstrap.d.ts.map +1 -0
- package/lib/rsi-bootstrap.js +363 -0
- package/lib/rsi-bootstrap.js.map +1 -0
- package/lib/rsi-build.d.ts +45 -0
- package/lib/rsi-build.d.ts.map +1 -0
- package/lib/rsi-build.js +404 -0
- package/lib/rsi-build.js.map +1 -0
- package/lib/rsi-creation-build.d.ts +47 -0
- package/lib/rsi-creation-build.d.ts.map +1 -0
- package/lib/rsi-creation-build.js +333 -0
- package/lib/rsi-creation-build.js.map +1 -0
- package/lib/rsi-host-authorities.d.ts +18 -0
- package/lib/rsi-host-authorities.d.ts.map +1 -0
- package/lib/rsi-host-authorities.js +129 -0
- package/lib/rsi-host-authorities.js.map +1 -0
- package/lib/rsi-host-update.d.ts +113 -0
- package/lib/rsi-host-update.d.ts.map +1 -0
- package/lib/rsi-host-update.js +316 -0
- package/lib/rsi-host-update.js.map +1 -0
- package/lib/rsi-install-inputs.d.ts +43 -0
- package/lib/rsi-install-inputs.d.ts.map +1 -0
- package/lib/rsi-install-inputs.js +342 -0
- package/lib/rsi-install-inputs.js.map +1 -0
- package/lib/rsi-install.d.ts +54 -0
- package/lib/rsi-install.d.ts.map +1 -0
- package/lib/rsi-install.js +404 -0
- package/lib/rsi-install.js.map +1 -0
- package/lib/rsi-local-activation.d.ts +78 -0
- package/lib/rsi-local-activation.d.ts.map +1 -0
- package/lib/rsi-local-activation.js +485 -0
- package/lib/rsi-local-activation.js.map +1 -0
- package/lib/rsi-local-cohort.d.ts +70 -0
- package/lib/rsi-local-cohort.d.ts.map +1 -0
- package/lib/rsi-local-cohort.js +781 -0
- package/lib/rsi-local-cohort.js.map +1 -0
- package/lib/rsi-local-install.d.ts +40 -0
- package/lib/rsi-local-install.d.ts.map +1 -0
- package/lib/rsi-local-install.js +221 -0
- package/lib/rsi-local-install.js.map +1 -0
- package/lib/rsi-local-pair-install.d.ts +38 -0
- package/lib/rsi-local-pair-install.d.ts.map +1 -0
- package/lib/rsi-local-pair-install.js +200 -0
- package/lib/rsi-local-pair-install.js.map +1 -0
- package/lib/rsi-local-profile-update.d.ts +25 -0
- package/lib/rsi-local-profile-update.d.ts.map +1 -0
- package/lib/rsi-local-profile-update.js +226 -0
- package/lib/rsi-local-profile-update.js.map +1 -0
- package/lib/rsi-local-resources.d.ts +37 -0
- package/lib/rsi-local-resources.d.ts.map +1 -0
- package/lib/rsi-local-resources.js +184 -0
- package/lib/rsi-local-resources.js.map +1 -0
- package/lib/rsi-local-roots-extension.d.ts +11 -0
- package/lib/rsi-local-roots-extension.d.ts.map +1 -0
- package/lib/rsi-local-roots-extension.js +31 -0
- package/lib/rsi-local-roots-extension.js.map +1 -0
- package/lib/rsi-local-update-build.d.ts +18 -0
- package/lib/rsi-local-update-build.d.ts.map +1 -0
- package/lib/rsi-local-update-build.js +37 -0
- package/lib/rsi-local-update-build.js.map +1 -0
- package/lib/rsi-local-update.d.ts +39 -0
- package/lib/rsi-local-update.d.ts.map +1 -0
- package/lib/rsi-local-update.js +205 -0
- package/lib/rsi-local-update.js.map +1 -0
- package/lib/rsi-memory-learning.d.ts +22 -0
- package/lib/rsi-memory-learning.d.ts.map +1 -0
- package/lib/rsi-memory-learning.js +76 -0
- package/lib/rsi-memory-learning.js.map +1 -0
- package/lib/rsi-owner-profile.d.ts +37 -0
- package/lib/rsi-owner-profile.d.ts.map +1 -0
- package/lib/rsi-owner-profile.js +178 -0
- package/lib/rsi-owner-profile.js.map +1 -0
- package/lib/rsi-plugin-creation.d.ts +31 -0
- package/lib/rsi-plugin-creation.d.ts.map +1 -0
- package/lib/rsi-plugin-creation.js +179 -0
- package/lib/rsi-plugin-creation.js.map +1 -0
- package/lib/rsi-profile.d.ts +23 -0
- package/lib/rsi-profile.d.ts.map +1 -1
- package/lib/rsi-profile.js +154 -43
- package/lib/rsi-profile.js.map +1 -1
- package/lib/rsi-release-build.d.ts +41 -0
- package/lib/rsi-release-build.d.ts.map +1 -0
- package/lib/rsi-release-build.js +223 -0
- package/lib/rsi-release-build.js.map +1 -0
- package/lib/rsi-service-environment.d.ts +6 -0
- package/lib/rsi-service-environment.d.ts.map +1 -0
- package/lib/rsi-service-environment.js +113 -0
- package/lib/rsi-service-environment.js.map +1 -0
- package/lib/rsi-service-setup.d.ts +10 -0
- package/lib/rsi-service-setup.d.ts.map +1 -0
- package/lib/rsi-service-setup.js +34 -0
- package/lib/rsi-service-setup.js.map +1 -0
- package/lib/rsi-setup.d.ts +35 -2
- package/lib/rsi-setup.d.ts.map +1 -1
- package/lib/rsi-setup.js +459 -32
- package/lib/rsi-setup.js.map +1 -1
- package/lib/rsi-source-maintenance.d.ts +25 -0
- package/lib/rsi-source-maintenance.d.ts.map +1 -0
- package/lib/rsi-source-maintenance.js +348 -0
- package/lib/rsi-source-maintenance.js.map +1 -0
- package/lib/rsi-source-update.d.ts +26 -0
- package/lib/rsi-source-update.d.ts.map +1 -0
- package/lib/rsi-source-update.js +276 -0
- package/lib/rsi-source-update.js.map +1 -0
- package/lib/rsi-source.d.ts +34 -0
- package/lib/rsi-source.d.ts.map +1 -0
- package/lib/rsi-source.js +375 -0
- package/lib/rsi-source.js.map +1 -0
- package/lib/rsi-systemd-bootstrap.d.ts +46 -0
- package/lib/rsi-systemd-bootstrap.d.ts.map +1 -0
- package/lib/rsi-systemd-bootstrap.js +271 -0
- package/lib/rsi-systemd-bootstrap.js.map +1 -0
- package/lib/sdk.d.ts.map +1 -1
- package/lib/sdk.js +26 -1
- package/lib/sdk.js.map +1 -1
- package/lib/setup-business.d.ts +49 -0
- package/lib/setup-business.d.ts.map +1 -0
- package/lib/setup-business.js +335 -0
- package/lib/setup-business.js.map +1 -0
- package/lib/setup-profile.d.ts +1 -1
- package/lib/setup-profile.d.ts.map +1 -1
- package/lib/setup-profile.js +25 -2
- package/lib/setup-profile.js.map +1 -1
- package/lib/setup.d.ts +12 -1
- package/lib/setup.d.ts.map +1 -1
- package/lib/setup.js +138 -34
- package/lib/setup.js.map +1 -1
- package/lib/systemd.d.ts +10 -0
- package/lib/systemd.d.ts.map +1 -1
- package/lib/systemd.js +23 -6
- package/lib/systemd.js.map +1 -1
- package/lib/types.d.ts +7 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +32 -20
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { constants } from 'node:fs';
|
|
4
|
+
import { chmod, lstat, mkdir, mkdtemp, open, readdir, realpath, rename, rm, stat } from 'node:fs/promises';
|
|
5
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
6
|
+
const OFFICIAL = 'https://github.com/22-ai-00/dsh-enhanced.git';
|
|
7
|
+
const PROFILE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
|
|
8
|
+
const VERSION = /^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z]+(?:[.-][0-9A-Za-z]+)*)?$/u;
|
|
9
|
+
const COMMIT = /^[a-f0-9]{40}$/u;
|
|
10
|
+
const ZERO = '0'.repeat(40);
|
|
11
|
+
const MAX_OUTPUT = 65_536;
|
|
12
|
+
const GIT_FLAGS = ['-c', 'core.hooksPath=/dev/null', '-c', 'core.fsmonitor=false', '-c', 'protocol.allow=never',
|
|
13
|
+
'-c', 'protocol.https.allow=always', '-c', 'protocol.file.allow=always',
|
|
14
|
+
'-c', 'credential.helper=', '-c', 'gc.auto=0'];
|
|
15
|
+
function fail(message) { throw new Error(`rsi source: ${message}`); }
|
|
16
|
+
function digest(value) { return createHash('sha256').update(JSON.stringify(value)).digest('hex'); }
|
|
17
|
+
function canonicalPath(value, label) {
|
|
18
|
+
if (!isAbsolute(value) || resolve(value) !== value || value.includes('\0'))
|
|
19
|
+
fail(`${label} must be canonical absolute`);
|
|
20
|
+
}
|
|
21
|
+
async function privateDirectory(path) {
|
|
22
|
+
const metadata = await lstat(path);
|
|
23
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink() || metadata.mode & 0o077
|
|
24
|
+
|| process.getuid && metadata.uid !== process.getuid() || await realpath(path) !== path)
|
|
25
|
+
fail(`unsafe private directory: ${path}`);
|
|
26
|
+
}
|
|
27
|
+
async function safeHome(path) {
|
|
28
|
+
const metadata = await lstat(path);
|
|
29
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink() || metadata.mode & 0o022
|
|
30
|
+
|| process.getuid && metadata.uid !== process.getuid() || await realpath(path) !== path)
|
|
31
|
+
fail(`unsafe DSH_HOME: ${path}`);
|
|
32
|
+
}
|
|
33
|
+
async function syncDirectory(path) {
|
|
34
|
+
const fd = await open(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
|
|
35
|
+
try {
|
|
36
|
+
await fd.sync();
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await fd.close();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function writeExclusive(path, bytes) {
|
|
43
|
+
const fd = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
|
|
44
|
+
try {
|
|
45
|
+
await fd.writeFile(bytes);
|
|
46
|
+
await fd.sync();
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await fd.close();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function readStable(path, maximum, ownerPrivate) {
|
|
53
|
+
const fd = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
54
|
+
try {
|
|
55
|
+
const before = await fd.stat();
|
|
56
|
+
if (!before.isFile() || before.size > maximum || ownerPrivate && (before.mode & 0o077)
|
|
57
|
+
|| process.getuid && before.uid !== process.getuid())
|
|
58
|
+
fail(`unsafe source file: ${path}`);
|
|
59
|
+
const bytes = await fd.readFile();
|
|
60
|
+
const after = await fd.stat(), name = await lstat(path);
|
|
61
|
+
if (bytes.length !== before.size || after.dev !== before.dev || after.ino !== before.ino
|
|
62
|
+
|| after.size !== before.size || after.mtimeMs !== before.mtimeMs
|
|
63
|
+
|| name.dev !== before.dev || name.ino !== before.ino || name.isSymbolicLink())
|
|
64
|
+
fail(`source file changed during read: ${path}`);
|
|
65
|
+
return bytes;
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
await fd.close();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function fileDigest(path) {
|
|
72
|
+
return createHash('sha256').update(await readStable(path, 65_536, true)).digest('hex');
|
|
73
|
+
}
|
|
74
|
+
async function staticFiles(repository, remote) {
|
|
75
|
+
return { checkoutConfig: await fileDigest(join(repository, '.git', 'config')),
|
|
76
|
+
checkoutHead: await fileDigest(join(repository, '.git', 'HEAD')),
|
|
77
|
+
bareConfig: await fileDigest(join(remote, 'config')),
|
|
78
|
+
bareHead: await fileDigest(join(remote, 'HEAD')) };
|
|
79
|
+
}
|
|
80
|
+
function gitEnvironment() {
|
|
81
|
+
const environment = { PATH: '/usr/bin:/bin', LANG: 'C', LC_ALL: 'C', HOME: '/nonexistent',
|
|
82
|
+
GIT_CONFIG_NOSYSTEM: '1', GIT_CONFIG_GLOBAL: '/dev/null', GIT_CONFIG_SYSTEM: '/dev/null',
|
|
83
|
+
GIT_CONFIG_COUNT: '0', GIT_ALLOW_PROTOCOL: 'https:file', GIT_NO_REPLACE_OBJECTS: '1',
|
|
84
|
+
GIT_TERMINAL_PROMPT: '0', GIT_ASKPASS: '/bin/false', GCM_INTERACTIVE: 'never',
|
|
85
|
+
GIT_LFS_SKIP_SMUDGE: '1', GIT_NO_LAZY_FETCH: '1' };
|
|
86
|
+
// A fixed HTTPS upstream still needs the caller's ordinary corporate proxy
|
|
87
|
+
// and CA routing. Do not pass arbitrary Git configuration or credential hooks.
|
|
88
|
+
for (const key of ['HTTPS_PROXY', 'https_proxy', 'HTTP_PROXY', 'http_proxy', 'ALL_PROXY', 'all_proxy',
|
|
89
|
+
'NO_PROXY', 'no_proxy', 'GIT_SSL_CAINFO', 'GIT_SSL_CAPATH', 'SSL_CERT_FILE', 'SSL_CERT_DIR', 'CURL_CA_BUNDLE']) {
|
|
90
|
+
const value = process.env[key];
|
|
91
|
+
if (value !== undefined)
|
|
92
|
+
environment[key] = value;
|
|
93
|
+
}
|
|
94
|
+
return environment;
|
|
95
|
+
}
|
|
96
|
+
/** Every Git invocation is bounded and receives only fixed argv and a minimal environment. */
|
|
97
|
+
async function git(cwd, args, signal) {
|
|
98
|
+
signal.throwIfAborted();
|
|
99
|
+
const bounded = AbortSignal.any([signal, AbortSignal.timeout(60_000)]);
|
|
100
|
+
return new Promise((resolvePromise, reject) => {
|
|
101
|
+
let child;
|
|
102
|
+
try {
|
|
103
|
+
child = spawn('/usr/bin/git', [...GIT_FLAGS, ...args], { cwd, env: gitEnvironment(),
|
|
104
|
+
stdio: ['ignore', 'pipe', 'pipe'], detached: process.platform !== 'win32', windowsHide: true });
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
reject(new Error('rsi source: Git invocation failed'));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const chunks = [];
|
|
111
|
+
let size = 0, overLimit = false, spawnError = false;
|
|
112
|
+
const terminate = () => {
|
|
113
|
+
if (!child.pid)
|
|
114
|
+
return;
|
|
115
|
+
try {
|
|
116
|
+
if (process.platform === 'win32')
|
|
117
|
+
child.kill('SIGKILL');
|
|
118
|
+
else
|
|
119
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error.code !== 'ESRCH')
|
|
123
|
+
child.kill('SIGKILL');
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
const abort = () => terminate();
|
|
127
|
+
bounded.addEventListener('abort', abort, { once: true });
|
|
128
|
+
if (bounded.aborted)
|
|
129
|
+
terminate();
|
|
130
|
+
const collect = (data) => {
|
|
131
|
+
size += data.length;
|
|
132
|
+
if (size > MAX_OUTPUT) {
|
|
133
|
+
overLimit = true;
|
|
134
|
+
terminate();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
chunks.push(data);
|
|
138
|
+
};
|
|
139
|
+
child.stdout.on('data', collect);
|
|
140
|
+
child.stderr.on('data', collect);
|
|
141
|
+
child.once('error', () => { spawnError = true; terminate(); });
|
|
142
|
+
child.once('close', (code, killed) => {
|
|
143
|
+
bounded.removeEventListener('abort', abort);
|
|
144
|
+
if (spawnError || overLimit || code !== 0 || killed !== null || bounded.aborted)
|
|
145
|
+
reject(new Error('rsi source: Git command failed, timed out, or exceeded output limit'));
|
|
146
|
+
else
|
|
147
|
+
resolvePromise(Buffer.concat(chunks).toString('utf8').trim());
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
async function ref(repository, name, signal) {
|
|
152
|
+
const output = await git(repository, ['for-each-ref', '--format=%(refname)%00%(objectname)%00%(symref)', name], signal);
|
|
153
|
+
if (output === '')
|
|
154
|
+
return undefined;
|
|
155
|
+
const fields = output.split('\0');
|
|
156
|
+
if (fields.length !== 3 || fields[0] !== name || !COMMIT.test(fields[1]) || fields[2] !== '')
|
|
157
|
+
fail(`malformed or symbolic Git ref ${name}`);
|
|
158
|
+
return fields[1];
|
|
159
|
+
}
|
|
160
|
+
async function validateSource(repository, version, commit, signal) {
|
|
161
|
+
if (!COMMIT.test(commit) || await git(repository, ['cat-file', '-t', commit], signal) !== 'commit')
|
|
162
|
+
fail('source is not a SHA-1 commit');
|
|
163
|
+
const file = join(repository, 'package.json');
|
|
164
|
+
const value = JSON.parse((await readStable(file, 1_048_576, false)).toString('utf8'));
|
|
165
|
+
if (value.name !== 'dsh-enhanced' || value.version !== version)
|
|
166
|
+
fail('source package name/version differs from installed cohort');
|
|
167
|
+
}
|
|
168
|
+
async function inspectWorkspace(value, signal) {
|
|
169
|
+
const repository = value.repository, remote = value.baseline.remote, commit = value.sourceCommit;
|
|
170
|
+
await privateDirectory(repository);
|
|
171
|
+
await privateDirectory(remote);
|
|
172
|
+
const gitDir = await lstat(join(repository, '.git'));
|
|
173
|
+
if (!gitDir.isDirectory() || gitDir.isSymbolicLink() || gitDir.mode & 0o022
|
|
174
|
+
|| await realpath(join(repository, '.git')) !== join(repository, '.git'))
|
|
175
|
+
fail('checkout Git directory changed identity');
|
|
176
|
+
if (await git(repository, ['rev-parse', '--show-toplevel'], signal) !== repository
|
|
177
|
+
|| await git(repository, ['rev-parse', '--is-bare-repository'], signal) !== 'false'
|
|
178
|
+
|| await git(repository, ['rev-parse', '--show-object-format=storage'], signal) !== 'sha1'
|
|
179
|
+
|| await git(repository, ['rev-parse', 'HEAD'], signal) !== commit
|
|
180
|
+
|| await git(repository, ['symbolic-ref', 'HEAD'], signal) !== 'refs/heads/repairs'
|
|
181
|
+
|| await ref(repository, 'refs/heads/repairs', signal) !== commit
|
|
182
|
+
|| await git(repository, ['status', '--porcelain=v1', '--untracked-files=all'], signal) !== '')
|
|
183
|
+
fail('checkout provenance or cleanliness changed');
|
|
184
|
+
await validateSource(repository, value.version, commit, signal);
|
|
185
|
+
if (await git(remote, ['rev-parse', '--is-bare-repository'], signal) !== 'true'
|
|
186
|
+
|| await git(remote, ['rev-parse', '--show-object-format=storage'], signal) !== 'sha1'
|
|
187
|
+
|| await git(remote, ['symbolic-ref', 'HEAD'], signal) !== 'refs/heads/repairs')
|
|
188
|
+
fail('release repository changed identity');
|
|
189
|
+
for (const path of [join(repository, '.git', 'objects', 'info', 'alternates'), join(remote, 'objects', 'info', 'alternates')]) {
|
|
190
|
+
try {
|
|
191
|
+
await lstat(path);
|
|
192
|
+
fail('external Git object alternates are forbidden');
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (error.code !== 'ENOENT')
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
for (const [location, name] of [[repository, value.baseline.ref], [remote, 'refs/heads/repairs']]) {
|
|
200
|
+
const current = await ref(location, name, signal);
|
|
201
|
+
if (!current || await git(location, ['cat-file', '-t', current], signal) !== 'commit')
|
|
202
|
+
fail('managed release ref is missing');
|
|
203
|
+
await git(location, ['merge-base', '--is-ancestor', commit, current], signal);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async function existing(path, expected, signal) {
|
|
207
|
+
await privateDirectory(path);
|
|
208
|
+
const names = (await readdir(path)).sort();
|
|
209
|
+
if (JSON.stringify(names) !== JSON.stringify(['bootstrap.json', 'checkout', 'release.git']))
|
|
210
|
+
fail('workspace has unexpected or incomplete contents');
|
|
211
|
+
const receiptPath = join(path, 'bootstrap.json');
|
|
212
|
+
const value = JSON.parse((await readStable(receiptPath, 16_384, true)).toString('utf8'));
|
|
213
|
+
const { receiptDigest, ...content } = value;
|
|
214
|
+
if (Object.keys(value).sort().join('\0') !== ['schemaVersion', 'version', 'origin', 'sourceCommit', 'repository', 'baseline', 'dshHome', 'profile', 'staticFiles', 'receiptDigest'].sort().join('\0')
|
|
215
|
+
|| value.schemaVersion !== 1 || !COMMIT.test(value.sourceCommit) || digest(content) !== receiptDigest
|
|
216
|
+
|| value.dshHome !== expected.dshHome || value.profile !== expected.profile || value.version !== expected.version
|
|
217
|
+
|| JSON.stringify(value.origin) !== JSON.stringify(expected.origin)
|
|
218
|
+
|| value.repository !== expected.repository || value.baseline?.ref !== expected.baseline.ref
|
|
219
|
+
|| value.baseline?.remote !== expected.baseline.remote || value.baseline?.targetBranch !== expected.baseline.targetBranch
|
|
220
|
+
|| value.baseline?.initialCommit !== value.sourceCommit)
|
|
221
|
+
fail('workspace receipt provenance differs from requested source');
|
|
222
|
+
if (JSON.stringify(await staticFiles(value.repository, value.baseline.remote)) !== JSON.stringify(value.staticFiles))
|
|
223
|
+
fail('workspace static Git files changed');
|
|
224
|
+
await inspectWorkspace(value, signal);
|
|
225
|
+
const { dshHome: _home, profile: _profile, staticFiles: _files, receiptDigest: _digest, ...result } = value;
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
/** Read the registered source without creating or repairing any workspace. */
|
|
229
|
+
export async function readRsiSourceWorkspace(input) {
|
|
230
|
+
canonicalPath(input.dshHome, 'DSH_HOME');
|
|
231
|
+
if (!PROFILE.test(input.profile) || input.version !== undefined && !VERSION.test(input.version))
|
|
232
|
+
fail('invalid profile or exact version');
|
|
233
|
+
await safeHome(input.dshHome);
|
|
234
|
+
const final = join(input.dshHome, 'rsi-sources', input.profile);
|
|
235
|
+
await privateDirectory(join(input.dshHome, 'rsi-sources'));
|
|
236
|
+
await privateDirectory(final);
|
|
237
|
+
const receipt = JSON.parse((await readStable(join(final, 'bootstrap.json'), 16_384, true)).toString('utf8'));
|
|
238
|
+
if (!VERSION.test(receipt.version) || !receipt.origin || !['local-head', 'official-tag'].includes(receipt.origin.kind))
|
|
239
|
+
fail('source bootstrap identity is invalid');
|
|
240
|
+
if (input.sourceRepository !== undefined)
|
|
241
|
+
canonicalPath(input.sourceRepository, 'source repository');
|
|
242
|
+
const origin = input.sourceRepository === undefined ? receipt.origin
|
|
243
|
+
: { kind: 'local-head', locator: input.sourceRepository, ref: 'HEAD' };
|
|
244
|
+
if (origin.kind === 'local-head')
|
|
245
|
+
canonicalPath(origin.locator, 'source repository');
|
|
246
|
+
else if (origin.locator !== OFFICIAL || origin.ref !== `refs/tags/v${receipt.version}`)
|
|
247
|
+
fail('official source identity differs');
|
|
248
|
+
const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(180_000)]);
|
|
249
|
+
const expected = { schemaVersion: 1, version: receipt.version, origin,
|
|
250
|
+
repository: join(final, 'checkout'), dshHome: input.dshHome, profile: input.profile,
|
|
251
|
+
baseline: { ref: 'refs/dsh-source/repairs', remote: join(final, 'release.git'), targetBranch: 'repairs' } };
|
|
252
|
+
let maintained = false;
|
|
253
|
+
try {
|
|
254
|
+
await lstat(join(final, 'maintenance.json'));
|
|
255
|
+
maintained = true;
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
if (error.code !== 'ENOENT')
|
|
259
|
+
throw error;
|
|
260
|
+
}
|
|
261
|
+
const result = maintained
|
|
262
|
+
? (await (await import('./rsi-source-maintenance.js')).readRsiSourceMaintenance({
|
|
263
|
+
logicalHome: input.dshHome, physicalHome: input.dshHome, profile: input.profile, signal
|
|
264
|
+
})).workspace
|
|
265
|
+
: await existing(final, expected, signal);
|
|
266
|
+
if (JSON.stringify(result.origin) !== JSON.stringify(origin)
|
|
267
|
+
|| input.version !== undefined && result.version !== input.version)
|
|
268
|
+
fail('effective source identity differs');
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
/** Caller must hold the DSH_HOME lifecycle lock across this operation and setup. */
|
|
272
|
+
export async function prepareRsiSourceWorkspace(input) {
|
|
273
|
+
canonicalPath(input.dshHome, 'DSH_HOME');
|
|
274
|
+
if (!PROFILE.test(input.profile) || !VERSION.test(input.version))
|
|
275
|
+
fail('invalid profile or exact version');
|
|
276
|
+
await safeHome(input.dshHome);
|
|
277
|
+
const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(180_000)]);
|
|
278
|
+
let local;
|
|
279
|
+
if (input.sourceRepository !== undefined) {
|
|
280
|
+
canonicalPath(input.sourceRepository, 'source repository');
|
|
281
|
+
local = await realpath(input.sourceRepository);
|
|
282
|
+
if (local !== input.sourceRepository || await git(local, ['rev-parse', '--show-toplevel'], signal) !== local
|
|
283
|
+
|| await git(local, ['rev-parse', '--is-bare-repository'], signal) !== 'false'
|
|
284
|
+
|| await git(local, ['rev-parse', '--show-object-format=storage'], signal) !== 'sha1')
|
|
285
|
+
fail('local source is not a canonical SHA-1 checkout');
|
|
286
|
+
}
|
|
287
|
+
const parent = join(input.dshHome, 'rsi-sources');
|
|
288
|
+
try {
|
|
289
|
+
await mkdir(parent, { mode: 0o700 });
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
if (error.code !== 'EEXIST')
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
295
|
+
await privateDirectory(parent);
|
|
296
|
+
const final = join(parent, input.profile), repository = join(final, 'checkout'), remote = join(final, 'release.git');
|
|
297
|
+
const origin = local
|
|
298
|
+
? { kind: 'local-head', locator: local, ref: 'HEAD' }
|
|
299
|
+
: { kind: 'official-tag', locator: OFFICIAL, ref: `refs/tags/v${input.version}` };
|
|
300
|
+
const expected = { schemaVersion: 1, version: input.version, origin, repository,
|
|
301
|
+
dshHome: input.dshHome, profile: input.profile,
|
|
302
|
+
baseline: { ref: 'refs/dsh-source/repairs', remote, targetBranch: 'repairs' } };
|
|
303
|
+
try {
|
|
304
|
+
await lstat(final);
|
|
305
|
+
return readRsiSourceWorkspace({ ...input, signal });
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
if (error.code !== 'ENOENT')
|
|
309
|
+
throw error;
|
|
310
|
+
}
|
|
311
|
+
const stage = await mkdtemp(join(parent, `.${input.profile}-stage-`));
|
|
312
|
+
await chmod(stage, 0o700);
|
|
313
|
+
let claimed = false, claimIdentity;
|
|
314
|
+
try {
|
|
315
|
+
const checkout = join(stage, 'checkout'), bare = join(stage, 'release.git');
|
|
316
|
+
await mkdir(checkout, { mode: 0o700 });
|
|
317
|
+
await git(checkout, ['init', '--object-format=sha1', '--initial-branch=repairs', '.'], signal);
|
|
318
|
+
let commit;
|
|
319
|
+
if (local) {
|
|
320
|
+
commit = await git(local, ['rev-parse', 'HEAD'], signal);
|
|
321
|
+
if (!COMMIT.test(commit))
|
|
322
|
+
fail('local source HEAD is not SHA-1');
|
|
323
|
+
await git(checkout, ['fetch', '--no-tags', '--no-write-fetch-head', '--no-recurse-submodules', local,
|
|
324
|
+
`+${commit}:refs/dsh-bootstrap/source`], signal);
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
await git(checkout, ['fetch', '--no-tags', '--no-write-fetch-head', '--no-recurse-submodules', OFFICIAL,
|
|
328
|
+
`+refs/tags/v${input.version}:refs/dsh-bootstrap/source`], signal);
|
|
329
|
+
commit = await git(checkout, ['rev-parse', 'refs/dsh-bootstrap/source^{commit}'], signal);
|
|
330
|
+
}
|
|
331
|
+
await git(checkout, ['switch', '--create', 'repairs', commit], signal);
|
|
332
|
+
await git(checkout, ['update-ref', '--no-deref', 'refs/dsh-source/repairs', commit, ZERO], signal);
|
|
333
|
+
await git(checkout, ['update-ref', '-d', 'refs/dsh-bootstrap/source'], signal);
|
|
334
|
+
await validateSource(checkout, input.version, commit, signal);
|
|
335
|
+
await git(stage, ['init', '--bare', '--object-format=sha1', '--initial-branch=repairs', bare], signal);
|
|
336
|
+
await chmod(bare, 0o700);
|
|
337
|
+
await git(bare, ['fetch', '--no-tags', '--no-write-fetch-head', '--no-recurse-submodules', checkout,
|
|
338
|
+
`+${commit}:refs/heads/repairs`], signal);
|
|
339
|
+
for (const path of [join(checkout, '.git', 'config'), join(checkout, '.git', 'HEAD'),
|
|
340
|
+
join(bare, 'config'), join(bare, 'HEAD')])
|
|
341
|
+
await chmod(path, 0o600);
|
|
342
|
+
const value = { schemaVersion: 1, version: input.version, origin, sourceCommit: commit,
|
|
343
|
+
repository, baseline: { ...expected.baseline, initialCommit: commit } };
|
|
344
|
+
await mkdir(final, { mode: 0o700 }); // O_EXCL-like directory claim: never replace another owner's tree.
|
|
345
|
+
claimed = true;
|
|
346
|
+
const identity = await stat(final);
|
|
347
|
+
claimIdentity = { dev: identity.dev, ino: identity.ino };
|
|
348
|
+
await rename(checkout, repository);
|
|
349
|
+
await rename(bare, remote);
|
|
350
|
+
await inspectWorkspace(value, signal);
|
|
351
|
+
await syncDirectory(final);
|
|
352
|
+
const content = { ...value, dshHome: input.dshHome, profile: input.profile,
|
|
353
|
+
staticFiles: await staticFiles(repository, remote) };
|
|
354
|
+
await writeExclusive(join(final, 'bootstrap.json'), JSON.stringify({ ...content, receiptDigest: digest(content) }));
|
|
355
|
+
await syncDirectory(final);
|
|
356
|
+
await syncDirectory(parent);
|
|
357
|
+
return value;
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
if (claimed && claimIdentity) {
|
|
361
|
+
const current = await lstat(final).catch(() => undefined);
|
|
362
|
+
if (current?.isDirectory() && current.dev === claimIdentity.dev && current.ino === claimIdentity.ino) {
|
|
363
|
+
const names = await readdir(final).catch(() => []);
|
|
364
|
+
if (names.every(name => ['checkout', 'release.git', 'bootstrap.json'].includes(name)))
|
|
365
|
+
await rm(final, { recursive: true, force: true });
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
throw error;
|
|
369
|
+
}
|
|
370
|
+
finally {
|
|
371
|
+
await rm(stage, { recursive: true, force: true });
|
|
372
|
+
await syncDirectory(parent);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=rsi-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsi-source.js","sourceRoot":"","sources":["../src/rsi-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { SystemdHostAuthorityConfig } from '@dsh-enhanced/plugin-control-plane';
|
|
2
|
+
import type { Pin } from './rsi-authority-runtime.js';
|
|
3
|
+
import type { RsiServiceEnvironment } from './rsi-service-environment.js';
|
|
4
|
+
import { type SystemdInstallOptions } from './systemd.js';
|
|
5
|
+
declare const statusKeys: readonly ["Id", "LoadState", "ActiveState", "SubState", "MainPID", "ControlPID", "ControlGroup", "Job"];
|
|
6
|
+
type UnitProperties = SystemdHostAuthorityConfig['template']['unitProperties'];
|
|
7
|
+
export type RsiSystemdStatus = Record<typeof statusKeys[number], string>;
|
|
8
|
+
export interface RsiSystemdCommand {
|
|
9
|
+
command: string;
|
|
10
|
+
fd: number;
|
|
11
|
+
args: readonly string[];
|
|
12
|
+
env: NodeJS.ProcessEnv;
|
|
13
|
+
timeoutMs: number;
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
}
|
|
16
|
+
export interface RsiSystemdResult {
|
|
17
|
+
status: number | null;
|
|
18
|
+
stdout: string;
|
|
19
|
+
stderr: string;
|
|
20
|
+
error?: Error;
|
|
21
|
+
}
|
|
22
|
+
export type RsiSystemdRunner = (request: RsiSystemdCommand) => RsiSystemdResult | Promise<RsiSystemdResult>;
|
|
23
|
+
export interface RsiSystemdCaptureOptions extends Pick<SystemdInstallOptions, 'home' | 'nodePath' | 'dshPath' | 'path'> {
|
|
24
|
+
environment?: RsiServiceEnvironment;
|
|
25
|
+
systemctl: Pin & {
|
|
26
|
+
interpreter: null;
|
|
27
|
+
};
|
|
28
|
+
timeoutMs?: number;
|
|
29
|
+
signal?: AbortSignal;
|
|
30
|
+
run?: RsiSystemdRunner;
|
|
31
|
+
}
|
|
32
|
+
export declare function parseRsiSystemdShow(source: string, keys?: readonly string[]): Record<string, string>;
|
|
33
|
+
export declare function assertRsiSystemdUnitStopped(status: RsiSystemdStatus, unitName: string): void;
|
|
34
|
+
export declare function readRsiSystemdUnitStatus(unitName: string, options: RsiSystemdCaptureOptions): Promise<RsiSystemdStatus>;
|
|
35
|
+
/** Reads the currently loaded service for post-install and post-start comparison with the frozen Host grant. */
|
|
36
|
+
export declare function readRsiSystemdUnitProperties(input: {
|
|
37
|
+
dshHome: string;
|
|
38
|
+
profile: string;
|
|
39
|
+
}, options: RsiSystemdCaptureOptions): Promise<UnitProperties>;
|
|
40
|
+
/** Caller owns the DSH_HOME lifecycle lock and has stopped the target service. No command here can start it. */
|
|
41
|
+
export declare function captureRsiSystemdUnitProperties(input: {
|
|
42
|
+
dshHome: string;
|
|
43
|
+
profile: string;
|
|
44
|
+
}, options: RsiSystemdCaptureOptions): Promise<UnitProperties>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=rsi-systemd-bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsi-systemd-bootstrap.d.ts","sourceRoot":"","sources":["../src/rsi-systemd-bootstrap.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAA;AACpF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAgD,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAGvG,QAAA,MAAM,UAAU,yGAA0G,CAAA;AAE1H,KAAK,cAAc,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAAC,CAAA;AAC9E,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;AACxE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IACvB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AACD,MAAM,WAAW,gBAAgB;IAAG,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE;AAC1G,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,iBAAiB,KAAK,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;AAC3G,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACrH,WAAW,CAAC,EAAE,qBAAqB,CAAA;IACnC,SAAS,EAAE,GAAG,GAAG;QAAE,WAAW,EAAE,IAAI,CAAA;KAAE,CAAA;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,GAAG,CAAC,EAAE,gBAAgB,CAAA;CACvB;AAsDD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,SAAS,MAAM,EAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU7G;AAMD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAK5F;AACD,wBAAsB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAG7H;AACD,gHAAgH;AAChH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,wBAAwB,GAC7E,OAAO,CAAC,cAAc,CAAC,CAUzB;AAoDD,gHAAgH;AAChH,wBAAsB,+BAA+B,CACnD,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,wBAAwB,GAC7E,OAAO,CAAC,cAAc,CAAC,CAiDzB"}
|