@dsh-enhanced/lark-channel 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 +20 -8
- package/docs/rsi-setup.md +145 -12
- package/docs/setup.md +29 -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/launchd-control.d.ts +24 -0
- package/lib/launchd-control.d.ts.map +1 -0
- package/lib/launchd-control.js +68 -0
- package/lib/launchd-control.js.map +1 -0
- package/lib/launchd-identity.d.ts +34 -0
- package/lib/launchd-identity.d.ts.map +1 -0
- package/lib/launchd-identity.js +184 -0
- package/lib/launchd-identity.js.map +1 -0
- package/lib/launchd-target-lock.d.ts +6 -0
- package/lib/launchd-target-lock.d.ts.map +1 -0
- package/lib/launchd-target-lock.js +48 -0
- package/lib/launchd-target-lock.js.map +1 -0
- package/lib/launchd.d.ts +18 -0
- package/lib/launchd.d.ts.map +1 -1
- package/lib/launchd.js +211 -54
- package/lib/launchd.js.map +1 -1
- 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 +345 -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 +54 -0
- package/lib/rsi-build.d.ts.map +1 -0
- package/lib/rsi-build.js +478 -0
- package/lib/rsi-build.js.map +1 -0
- package/lib/rsi-creation-build.d.ts +48 -0
- package/lib/rsi-creation-build.d.ts.map +1 -0
- package/lib/rsi-creation-build.js +363 -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 +68 -0
- package/lib/rsi-local-install.d.ts.map +1 -0
- package/lib/rsi-local-install.js +322 -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 +30 -0
- package/lib/rsi-memory-learning.d.ts.map +1 -0
- package/lib/rsi-memory-learning.js +104 -0
- package/lib/rsi-memory-learning.js.map +1 -0
- package/lib/rsi-native-install.d.ts +38 -0
- package/lib/rsi-native-install.d.ts.map +1 -0
- package/lib/rsi-native-install.js +254 -0
- package/lib/rsi-native-install.js.map +1 -0
- package/lib/rsi-native-launchd.d.ts +7 -0
- package/lib/rsi-native-launchd.d.ts.map +1 -0
- package/lib/rsi-native-launchd.js +49 -0
- package/lib/rsi-native-launchd.js.map +1 -0
- package/lib/rsi-native-profile.d.ts +64 -0
- package/lib/rsi-native-profile.d.ts.map +1 -0
- package/lib/rsi-native-profile.js +283 -0
- package/lib/rsi-native-profile.js.map +1 -0
- package/lib/rsi-native-runtime-bootstrap.d.ts +35 -0
- package/lib/rsi-native-runtime-bootstrap.d.ts.map +1 -0
- package/lib/rsi-native-runtime-bootstrap.js +385 -0
- package/lib/rsi-native-runtime-bootstrap.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 +32 -0
- package/lib/rsi-plugin-creation.d.ts.map +1 -0
- package/lib/rsi-plugin-creation.js +189 -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 +475 -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 +487 -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 +265 -48
- 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 +33 -20
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import { createHash, randomUUID } 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 { dirname, 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 LEGACY_MAC_VERSION = '0.1.49';
|
|
13
|
+
const LEGACY_MAC_COMMIT = '172bc31ddf0c00a6f0b3252354f2170a14dd7fc2';
|
|
14
|
+
const GIT_FLAGS = ['-c', 'core.hooksPath=/dev/null', '-c', 'core.fsmonitor=false', '-c', 'protocol.allow=never',
|
|
15
|
+
'-c', 'protocol.https.allow=always', '-c', 'protocol.file.allow=always',
|
|
16
|
+
'-c', 'credential.helper=', '-c', 'gc.auto=0'];
|
|
17
|
+
function fail(message) { throw new Error(`rsi source: ${message}`); }
|
|
18
|
+
function digest(value) { return createHash('sha256').update(JSON.stringify(value)).digest('hex'); }
|
|
19
|
+
function canonicalPath(value, label) {
|
|
20
|
+
if (!isAbsolute(value) || resolve(value) !== value || value.includes('\0'))
|
|
21
|
+
fail(`${label} must be canonical absolute`);
|
|
22
|
+
}
|
|
23
|
+
async function privateDirectory(path) {
|
|
24
|
+
const metadata = await lstat(path);
|
|
25
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink() || metadata.mode & 0o077
|
|
26
|
+
|| process.getuid && metadata.uid !== process.getuid() || await realpath(path) !== path)
|
|
27
|
+
fail(`unsafe private directory: ${path}`);
|
|
28
|
+
}
|
|
29
|
+
async function safeHome(path) {
|
|
30
|
+
const metadata = await lstat(path);
|
|
31
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink() || metadata.mode & 0o022
|
|
32
|
+
|| process.getuid && metadata.uid !== process.getuid() || await realpath(path) !== path)
|
|
33
|
+
fail(`unsafe DSH_HOME: ${path}`);
|
|
34
|
+
}
|
|
35
|
+
async function syncDirectory(path) {
|
|
36
|
+
const fd = await open(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
|
|
37
|
+
try {
|
|
38
|
+
await fd.sync();
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await fd.close();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async function writeExclusive(path, bytes) {
|
|
45
|
+
const fd = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
|
|
46
|
+
try {
|
|
47
|
+
await fd.writeFile(bytes);
|
|
48
|
+
await fd.sync();
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
await fd.close();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function readStable(path, maximum, ownerPrivate) {
|
|
55
|
+
const fd = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
56
|
+
try {
|
|
57
|
+
const before = await fd.stat();
|
|
58
|
+
if (!before.isFile() || before.size > maximum || ownerPrivate && (before.mode & 0o077)
|
|
59
|
+
|| process.getuid && before.uid !== process.getuid())
|
|
60
|
+
fail(`unsafe source file: ${path}`);
|
|
61
|
+
const bytes = await fd.readFile();
|
|
62
|
+
const after = await fd.stat(), name = await lstat(path);
|
|
63
|
+
if (bytes.length !== before.size || after.dev !== before.dev || after.ino !== before.ino
|
|
64
|
+
|| after.size !== before.size || after.mtimeMs !== before.mtimeMs
|
|
65
|
+
|| name.dev !== before.dev || name.ino !== before.ino || name.isSymbolicLink())
|
|
66
|
+
fail(`source file changed during read: ${path}`);
|
|
67
|
+
return bytes;
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await fd.close();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async function fileDigest(path) {
|
|
74
|
+
return createHash('sha256').update(await readStable(path, 65_536, true)).digest('hex');
|
|
75
|
+
}
|
|
76
|
+
async function staticFiles(repository, remote) {
|
|
77
|
+
return { checkoutConfig: await fileDigest(join(repository, '.git', 'config')),
|
|
78
|
+
checkoutHead: await fileDigest(join(repository, '.git', 'HEAD')),
|
|
79
|
+
bareConfig: await fileDigest(join(remote, 'config')),
|
|
80
|
+
bareHead: await fileDigest(join(remote, 'HEAD')) };
|
|
81
|
+
}
|
|
82
|
+
function gitEnvironment() {
|
|
83
|
+
const environment = { PATH: '/usr/bin:/bin', LANG: 'C', LC_ALL: 'C', HOME: '/nonexistent',
|
|
84
|
+
GIT_CONFIG_NOSYSTEM: '1', GIT_CONFIG_GLOBAL: '/dev/null', GIT_CONFIG_SYSTEM: '/dev/null',
|
|
85
|
+
GIT_CONFIG_COUNT: '0', GIT_ALLOW_PROTOCOL: 'https:file', GIT_NO_REPLACE_OBJECTS: '1',
|
|
86
|
+
GIT_TERMINAL_PROMPT: '0', GIT_ASKPASS: '/bin/false', GCM_INTERACTIVE: 'never',
|
|
87
|
+
GIT_LFS_SKIP_SMUDGE: '1', GIT_NO_LAZY_FETCH: '1' };
|
|
88
|
+
// A fixed HTTPS upstream still needs the caller's ordinary corporate proxy
|
|
89
|
+
// and CA routing. Do not pass arbitrary Git configuration or credential hooks.
|
|
90
|
+
for (const key of ['HTTPS_PROXY', 'https_proxy', 'HTTP_PROXY', 'http_proxy', 'ALL_PROXY', 'all_proxy',
|
|
91
|
+
'NO_PROXY', 'no_proxy', 'GIT_SSL_CAINFO', 'GIT_SSL_CAPATH', 'SSL_CERT_FILE', 'SSL_CERT_DIR', 'CURL_CA_BUNDLE']) {
|
|
92
|
+
const value = process.env[key];
|
|
93
|
+
if (value !== undefined)
|
|
94
|
+
environment[key] = value;
|
|
95
|
+
}
|
|
96
|
+
return environment;
|
|
97
|
+
}
|
|
98
|
+
/** Every Git invocation is bounded and receives only fixed argv and a minimal environment. */
|
|
99
|
+
async function git(cwd, args, signal) {
|
|
100
|
+
signal.throwIfAborted();
|
|
101
|
+
const bounded = AbortSignal.any([signal, AbortSignal.timeout(60_000)]);
|
|
102
|
+
return new Promise((resolvePromise, reject) => {
|
|
103
|
+
let child;
|
|
104
|
+
try {
|
|
105
|
+
child = spawn('/usr/bin/git', [...GIT_FLAGS, ...args], { cwd, env: gitEnvironment(),
|
|
106
|
+
stdio: ['ignore', 'pipe', 'pipe'], detached: process.platform !== 'win32', windowsHide: true });
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
reject(new Error('rsi source: Git invocation failed'));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const chunks = [];
|
|
113
|
+
let size = 0, overLimit = false, spawnError = false;
|
|
114
|
+
const terminate = () => {
|
|
115
|
+
if (!child.pid)
|
|
116
|
+
return;
|
|
117
|
+
try {
|
|
118
|
+
if (process.platform === 'win32')
|
|
119
|
+
child.kill('SIGKILL');
|
|
120
|
+
else
|
|
121
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (error.code !== 'ESRCH')
|
|
125
|
+
child.kill('SIGKILL');
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const abort = () => terminate();
|
|
129
|
+
bounded.addEventListener('abort', abort, { once: true });
|
|
130
|
+
if (bounded.aborted)
|
|
131
|
+
terminate();
|
|
132
|
+
const collect = (data) => {
|
|
133
|
+
size += data.length;
|
|
134
|
+
if (size > MAX_OUTPUT) {
|
|
135
|
+
overLimit = true;
|
|
136
|
+
terminate();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
chunks.push(data);
|
|
140
|
+
};
|
|
141
|
+
child.stdout.on('data', collect);
|
|
142
|
+
child.stderr.on('data', collect);
|
|
143
|
+
child.once('error', () => { spawnError = true; terminate(); });
|
|
144
|
+
child.once('close', (code, killed) => {
|
|
145
|
+
bounded.removeEventListener('abort', abort);
|
|
146
|
+
if (spawnError || overLimit || code !== 0 || killed !== null || bounded.aborted)
|
|
147
|
+
reject(new Error('rsi source: Git command failed, timed out, or exceeded output limit'));
|
|
148
|
+
else
|
|
149
|
+
resolvePromise(Buffer.concat(chunks).toString('utf8').trim());
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
async function ref(repository, name, signal) {
|
|
154
|
+
const output = await git(repository, ['for-each-ref', '--format=%(refname)%00%(objectname)%00%(symref)', name], signal);
|
|
155
|
+
if (output === '')
|
|
156
|
+
return undefined;
|
|
157
|
+
const fields = output.split('\0');
|
|
158
|
+
if (fields.length !== 3 || fields[0] !== name || !COMMIT.test(fields[1]) || fields[2] !== '')
|
|
159
|
+
fail(`malformed or symbolic Git ref ${name}`);
|
|
160
|
+
return fields[1];
|
|
161
|
+
}
|
|
162
|
+
async function validateSource(repository, version, commit, signal) {
|
|
163
|
+
if (!COMMIT.test(commit) || await git(repository, ['cat-file', '-t', commit], signal) !== 'commit')
|
|
164
|
+
fail('source is not a SHA-1 commit');
|
|
165
|
+
const file = join(repository, 'package.json');
|
|
166
|
+
const value = JSON.parse((await readStable(file, 1_048_576, false)).toString('utf8'));
|
|
167
|
+
if (value.name !== 'dsh-enhanced' || value.version !== version)
|
|
168
|
+
fail('source package name/version differs from installed cohort');
|
|
169
|
+
}
|
|
170
|
+
async function inspectWorkspace(value, signal) {
|
|
171
|
+
const repository = value.repository, remote = value.baseline.remote, commit = value.sourceCommit;
|
|
172
|
+
await privateDirectory(repository);
|
|
173
|
+
await privateDirectory(remote);
|
|
174
|
+
const gitDir = await lstat(join(repository, '.git'));
|
|
175
|
+
if (!gitDir.isDirectory() || gitDir.isSymbolicLink() || gitDir.mode & 0o022
|
|
176
|
+
|| await realpath(join(repository, '.git')) !== join(repository, '.git'))
|
|
177
|
+
fail('checkout Git directory changed identity');
|
|
178
|
+
if (await git(repository, ['rev-parse', '--show-toplevel'], signal) !== repository
|
|
179
|
+
|| await git(repository, ['rev-parse', '--is-bare-repository'], signal) !== 'false'
|
|
180
|
+
|| await git(repository, ['rev-parse', '--show-object-format=storage'], signal) !== 'sha1'
|
|
181
|
+
|| await git(repository, ['rev-parse', 'HEAD'], signal) !== commit
|
|
182
|
+
|| await git(repository, ['symbolic-ref', 'HEAD'], signal) !== 'refs/heads/repairs'
|
|
183
|
+
|| await ref(repository, 'refs/heads/repairs', signal) !== commit
|
|
184
|
+
|| await git(repository, ['status', '--porcelain=v1', '--untracked-files=all'], signal) !== '')
|
|
185
|
+
fail('checkout provenance or cleanliness changed');
|
|
186
|
+
await validateSource(repository, value.version, commit, signal);
|
|
187
|
+
if (await git(remote, ['rev-parse', '--is-bare-repository'], signal) !== 'true'
|
|
188
|
+
|| await git(remote, ['rev-parse', '--show-object-format=storage'], signal) !== 'sha1'
|
|
189
|
+
|| await git(remote, ['symbolic-ref', 'HEAD'], signal) !== 'refs/heads/repairs')
|
|
190
|
+
fail('release repository changed identity');
|
|
191
|
+
for (const path of [join(repository, '.git', 'objects', 'info', 'alternates'), join(remote, 'objects', 'info', 'alternates')]) {
|
|
192
|
+
try {
|
|
193
|
+
await lstat(path);
|
|
194
|
+
fail('external Git object alternates are forbidden');
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
if (error.code !== 'ENOENT')
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
for (const [location, name] of [[repository, value.baseline.ref], [remote, 'refs/heads/repairs']]) {
|
|
202
|
+
const current = await ref(location, name, signal);
|
|
203
|
+
if (!current || await git(location, ['cat-file', '-t', current], signal) !== 'commit')
|
|
204
|
+
fail('managed release ref is missing');
|
|
205
|
+
await git(location, ['merge-base', '--is-ancestor', commit, current], signal);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async function existing(path, expected, signal) {
|
|
209
|
+
await privateDirectory(path);
|
|
210
|
+
const names = (await readdir(path)).sort();
|
|
211
|
+
if (JSON.stringify(names) !== JSON.stringify(['bootstrap.json', 'checkout', 'release.git']))
|
|
212
|
+
fail('workspace has unexpected or incomplete contents');
|
|
213
|
+
const receiptPath = join(path, 'bootstrap.json');
|
|
214
|
+
const value = JSON.parse((await readStable(receiptPath, 16_384, true)).toString('utf8'));
|
|
215
|
+
const { receiptDigest, ...content } = value;
|
|
216
|
+
if (Object.keys(value).sort().join('\0') !== ['schemaVersion', 'version', 'origin', 'sourceCommit', 'repository', 'baseline', 'dshHome', 'profile', 'staticFiles', 'receiptDigest'].sort().join('\0')
|
|
217
|
+
|| value.schemaVersion !== 1 || !COMMIT.test(value.sourceCommit) || digest(content) !== receiptDigest
|
|
218
|
+
|| value.dshHome !== expected.dshHome || value.profile !== expected.profile || value.version !== expected.version
|
|
219
|
+
|| JSON.stringify(value.origin) !== JSON.stringify(expected.origin)
|
|
220
|
+
|| value.repository !== expected.repository || value.baseline?.ref !== expected.baseline.ref
|
|
221
|
+
|| value.baseline?.remote !== expected.baseline.remote || value.baseline?.targetBranch !== expected.baseline.targetBranch
|
|
222
|
+
|| value.baseline?.initialCommit !== value.sourceCommit)
|
|
223
|
+
fail('workspace receipt provenance differs from requested source');
|
|
224
|
+
if (JSON.stringify(await staticFiles(value.repository, value.baseline.remote)) !== JSON.stringify(value.staticFiles))
|
|
225
|
+
fail('workspace static Git files changed');
|
|
226
|
+
await inspectWorkspace(value, signal);
|
|
227
|
+
const { dshHome: _home, profile: _profile, staticFiles: _files, receiptDigest: _digest, ...result } = value;
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
async function absent(path) {
|
|
231
|
+
try {
|
|
232
|
+
await lstat(path);
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (error.code === 'ENOENT')
|
|
237
|
+
return true;
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async function initialRefs(repository, expected, signal) {
|
|
242
|
+
const rows = (await git(repository, ['for-each-ref', '--format=%(refname)%00%(objectname)%00%(symref)'], signal))
|
|
243
|
+
.split('\n').filter(Boolean).sort();
|
|
244
|
+
return JSON.stringify(rows) === JSON.stringify(expected.map(name => `${name}\0${LEGACY_MAC_COMMIT}\0`).sort());
|
|
245
|
+
}
|
|
246
|
+
/** Retire only the verified official 0.1.49 Mac source preparation.
|
|
247
|
+
* No prepared grant, build or coordinator resource or noninitial ref may exist.
|
|
248
|
+
* The old tree is retained byte-for-byte with its original receipt paths. */
|
|
249
|
+
async function archiveUnusedLegacyMacWorkspace(home, profile, old, signal) {
|
|
250
|
+
if (old.version !== LEGACY_MAC_VERSION || old.origin.kind !== 'official-tag'
|
|
251
|
+
|| old.origin.locator !== OFFICIAL || old.origin.ref !== 'refs/tags/v0.1.49'
|
|
252
|
+
|| old.sourceCommit !== LEGACY_MAC_COMMIT || old.baseline.initialCommit !== LEGACY_MAC_COMMIT
|
|
253
|
+
|| !await initialRefs(old.repository, ['refs/dsh-source/repairs', 'refs/heads/repairs'], signal)
|
|
254
|
+
|| !await initialRefs(old.baseline.remote, ['refs/heads/repairs'], signal)) {
|
|
255
|
+
fail('legacy Mac source has maintenance or unknown Git refs; preserve it and resolve the existing source authority manually');
|
|
256
|
+
}
|
|
257
|
+
const resourcePaths = [
|
|
258
|
+
...['rsi-authorities', 'rsi-authority-runtimes', 'rsi-builds', 'rsi-creation-builds',
|
|
259
|
+
'rsi-release-builds', 'rsi-local-cohorts'].map(kind => join(home, kind, profile)),
|
|
260
|
+
join(home, 'rsi-service-environments', `${profile}.json`),
|
|
261
|
+
join(home, 'rsi-coordinators'), join(home, '.rsi-setup-journal.json'),
|
|
262
|
+
join(home, '.rsi-systemd-capture-journal.json'),
|
|
263
|
+
join(home, `.rsi-coordinator-${createHash('sha256').update(profile).digest('hex').slice(0, 16)}.json`),
|
|
264
|
+
join(home, `.rsi-${createHash('sha256').update(profile).digest('hex').slice(0, 12)}`),
|
|
265
|
+
join(dirname(home), `.dsh-rsi-local-updates-${createHash('sha256').update(home).digest('hex').slice(0, 16)}`),
|
|
266
|
+
];
|
|
267
|
+
for (const path of resourcePaths)
|
|
268
|
+
if (!await absent(path)) {
|
|
269
|
+
fail(`legacy Mac source may already have prepared or active RSI resources at ${path}; preserve its authority and resolve manually`);
|
|
270
|
+
}
|
|
271
|
+
for (const kind of ['rsi-sources', 'rsi-authority-runtimes', 'rsi-builds', 'rsi-creation-builds',
|
|
272
|
+
'rsi-release-builds', 'rsi-local-cohorts']) {
|
|
273
|
+
const parent = join(home, kind);
|
|
274
|
+
if (await absent(parent))
|
|
275
|
+
continue;
|
|
276
|
+
const names = await readdir(parent);
|
|
277
|
+
if (names.some(name => name.startsWith(`.${profile}-stage-`)
|
|
278
|
+
|| name.startsWith(`.${profile}-update-`) || name.startsWith(`.${profile}-previous-`))) {
|
|
279
|
+
fail(`legacy Mac source has unfinished RSI preparation in ${parent}; preserve it and resolve manually`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if ((await readdir(home)).some(name => name.startsWith('.rsi-coordinator-'))) {
|
|
283
|
+
fail('legacy Mac source has a coordinator marker; preserve its authority and resolve manually');
|
|
284
|
+
}
|
|
285
|
+
// A previous successful migration is not a license to rebase again. An
|
|
286
|
+
// interrupted attempt may have created only the empty private archive slot.
|
|
287
|
+
const archiveParent = join(home, 'rsi-source-archives');
|
|
288
|
+
try {
|
|
289
|
+
await mkdir(archiveParent, { mode: 0o700 });
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
if (error.code !== 'EEXIST')
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
295
|
+
await privateDirectory(archiveParent);
|
|
296
|
+
if ((await lstat(archiveParent)).uid !== process.getuid?.())
|
|
297
|
+
fail('legacy archive parent is not owned by the current user');
|
|
298
|
+
const profileArchive = join(archiveParent, profile);
|
|
299
|
+
try {
|
|
300
|
+
await mkdir(profileArchive, { mode: 0o700 });
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
if (error.code !== 'EEXIST')
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
await privateDirectory(profileArchive);
|
|
307
|
+
if ((await lstat(profileArchive)).uid !== process.getuid?.())
|
|
308
|
+
fail('legacy archive slot is not owned by the current user');
|
|
309
|
+
if ((await readdir(profileArchive)).length !== 0) {
|
|
310
|
+
fail('legacy Mac source has an existing archive; preserve both histories and resolve manually');
|
|
311
|
+
}
|
|
312
|
+
const destination = join(profileArchive, randomUUID());
|
|
313
|
+
signal.throwIfAborted();
|
|
314
|
+
let archived = false;
|
|
315
|
+
try {
|
|
316
|
+
await rename(join(home, 'rsi-sources', profile), destination);
|
|
317
|
+
archived = true;
|
|
318
|
+
await syncDirectory(profileArchive);
|
|
319
|
+
await syncDirectory(join(home, 'rsi-sources'));
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
if (archived)
|
|
323
|
+
throw new Error(`rsi source: legacy archive was moved to ${destination}; verify it before retrying`, { cause: error });
|
|
324
|
+
throw error;
|
|
325
|
+
}
|
|
326
|
+
return destination;
|
|
327
|
+
}
|
|
328
|
+
/** Read the registered source without creating or repairing any workspace. */
|
|
329
|
+
export async function readRsiSourceWorkspace(input) {
|
|
330
|
+
canonicalPath(input.dshHome, 'DSH_HOME');
|
|
331
|
+
if (!PROFILE.test(input.profile) || input.version !== undefined && !VERSION.test(input.version))
|
|
332
|
+
fail('invalid profile or exact version');
|
|
333
|
+
await safeHome(input.dshHome);
|
|
334
|
+
const final = join(input.dshHome, 'rsi-sources', input.profile);
|
|
335
|
+
await privateDirectory(join(input.dshHome, 'rsi-sources'));
|
|
336
|
+
await privateDirectory(final);
|
|
337
|
+
const receipt = JSON.parse((await readStable(join(final, 'bootstrap.json'), 16_384, true)).toString('utf8'));
|
|
338
|
+
if (!VERSION.test(receipt.version) || !receipt.origin || !['local-head', 'official-tag'].includes(receipt.origin.kind))
|
|
339
|
+
fail('source bootstrap identity is invalid');
|
|
340
|
+
if (input.sourceRepository !== undefined)
|
|
341
|
+
canonicalPath(input.sourceRepository, 'source repository');
|
|
342
|
+
const origin = input.sourceRepository === undefined ? receipt.origin
|
|
343
|
+
: { kind: 'local-head', locator: input.sourceRepository, ref: 'HEAD' };
|
|
344
|
+
if (origin.kind === 'local-head')
|
|
345
|
+
canonicalPath(origin.locator, 'source repository');
|
|
346
|
+
else if (origin.locator !== OFFICIAL || origin.ref !== `refs/tags/v${receipt.version}`)
|
|
347
|
+
fail('official source identity differs');
|
|
348
|
+
const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(180_000)]);
|
|
349
|
+
const expected = { schemaVersion: 1, version: receipt.version, origin,
|
|
350
|
+
repository: join(final, 'checkout'), dshHome: input.dshHome, profile: input.profile,
|
|
351
|
+
baseline: { ref: 'refs/dsh-source/repairs', remote: join(final, 'release.git'), targetBranch: 'repairs' } };
|
|
352
|
+
let maintained = false;
|
|
353
|
+
try {
|
|
354
|
+
await lstat(join(final, 'maintenance.json'));
|
|
355
|
+
maintained = true;
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
if (error.code !== 'ENOENT')
|
|
359
|
+
throw error;
|
|
360
|
+
}
|
|
361
|
+
const result = maintained
|
|
362
|
+
? (await (await import('./rsi-source-maintenance.js')).readRsiSourceMaintenance({
|
|
363
|
+
logicalHome: input.dshHome, physicalHome: input.dshHome, profile: input.profile, signal
|
|
364
|
+
})).workspace
|
|
365
|
+
: await existing(final, expected, signal);
|
|
366
|
+
if (JSON.stringify(result.origin) !== JSON.stringify(origin)
|
|
367
|
+
|| input.version !== undefined && result.version !== input.version)
|
|
368
|
+
fail('effective source identity differs');
|
|
369
|
+
return result;
|
|
370
|
+
}
|
|
371
|
+
/** Caller must hold the DSH_HOME lifecycle lock across this operation and setup. */
|
|
372
|
+
export async function prepareRsiSourceWorkspace(input) {
|
|
373
|
+
canonicalPath(input.dshHome, 'DSH_HOME');
|
|
374
|
+
if (!PROFILE.test(input.profile) || !VERSION.test(input.version))
|
|
375
|
+
fail('invalid profile or exact version');
|
|
376
|
+
await safeHome(input.dshHome);
|
|
377
|
+
const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(180_000)]);
|
|
378
|
+
let local;
|
|
379
|
+
if (input.sourceRepository !== undefined) {
|
|
380
|
+
canonicalPath(input.sourceRepository, 'source repository');
|
|
381
|
+
local = await realpath(input.sourceRepository);
|
|
382
|
+
if (local !== input.sourceRepository || await git(local, ['rev-parse', '--show-toplevel'], signal) !== local
|
|
383
|
+
|| await git(local, ['rev-parse', '--is-bare-repository'], signal) !== 'false'
|
|
384
|
+
|| await git(local, ['rev-parse', '--show-object-format=storage'], signal) !== 'sha1')
|
|
385
|
+
fail('local source is not a canonical SHA-1 checkout');
|
|
386
|
+
}
|
|
387
|
+
const parent = join(input.dshHome, 'rsi-sources');
|
|
388
|
+
try {
|
|
389
|
+
await mkdir(parent, { mode: 0o700 });
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
if (error.code !== 'EEXIST')
|
|
393
|
+
throw error;
|
|
394
|
+
}
|
|
395
|
+
await privateDirectory(parent);
|
|
396
|
+
const final = join(parent, input.profile), repository = join(final, 'checkout'), remote = join(final, 'release.git');
|
|
397
|
+
const origin = local
|
|
398
|
+
? { kind: 'local-head', locator: local, ref: 'HEAD' }
|
|
399
|
+
: { kind: 'official-tag', locator: OFFICIAL, ref: `refs/tags/v${input.version}` };
|
|
400
|
+
const expected = { schemaVersion: 1, version: input.version, origin, repository,
|
|
401
|
+
dshHome: input.dshHome, profile: input.profile,
|
|
402
|
+
baseline: { ref: 'refs/dsh-source/repairs', remote, targetBranch: 'repairs' } };
|
|
403
|
+
const present = await lstat(final).then(() => true, error => {
|
|
404
|
+
if (error.code === 'ENOENT')
|
|
405
|
+
return false;
|
|
406
|
+
throw error;
|
|
407
|
+
});
|
|
408
|
+
if (present) {
|
|
409
|
+
if (process.platform !== 'darwin')
|
|
410
|
+
return readRsiSourceWorkspace({ ...input, signal });
|
|
411
|
+
const old = await readRsiSourceWorkspace({ dshHome: input.dshHome, profile: input.profile, signal });
|
|
412
|
+
if (old.version === input.version && (input.sourceRepository === undefined
|
|
413
|
+
|| JSON.stringify(old.origin) === JSON.stringify(origin)))
|
|
414
|
+
return old;
|
|
415
|
+
const archive = await archiveUnusedLegacyMacWorkspace(input.dshHome, input.profile, old, signal);
|
|
416
|
+
try {
|
|
417
|
+
return await prepareRsiSourceWorkspace(input);
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
throw new Error(`rsi source: replacement preparation failed; untouched legacy source is retained at ${archive}`, { cause: error });
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
const stage = await mkdtemp(join(parent, `.${input.profile}-stage-`));
|
|
424
|
+
await chmod(stage, 0o700);
|
|
425
|
+
let claimed = false, claimIdentity;
|
|
426
|
+
try {
|
|
427
|
+
const checkout = join(stage, 'checkout'), bare = join(stage, 'release.git');
|
|
428
|
+
await mkdir(checkout, { mode: 0o700 });
|
|
429
|
+
await git(checkout, ['init', '--object-format=sha1', '--initial-branch=repairs', '.'], signal);
|
|
430
|
+
let commit;
|
|
431
|
+
if (local) {
|
|
432
|
+
commit = await git(local, ['rev-parse', 'HEAD'], signal);
|
|
433
|
+
if (!COMMIT.test(commit))
|
|
434
|
+
fail('local source HEAD is not SHA-1');
|
|
435
|
+
await git(checkout, ['fetch', '--no-tags', '--no-write-fetch-head', '--no-recurse-submodules', local,
|
|
436
|
+
`+${commit}:refs/dsh-bootstrap/source`], signal);
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
await git(checkout, ['fetch', '--no-tags', '--no-write-fetch-head', '--no-recurse-submodules', OFFICIAL,
|
|
440
|
+
`+refs/tags/v${input.version}:refs/dsh-bootstrap/source`], signal);
|
|
441
|
+
commit = await git(checkout, ['rev-parse', 'refs/dsh-bootstrap/source^{commit}'], signal);
|
|
442
|
+
}
|
|
443
|
+
await git(checkout, ['switch', '--create', 'repairs', commit], signal);
|
|
444
|
+
await git(checkout, ['update-ref', '--no-deref', 'refs/dsh-source/repairs', commit, ZERO], signal);
|
|
445
|
+
await git(checkout, ['update-ref', '-d', 'refs/dsh-bootstrap/source'], signal);
|
|
446
|
+
await validateSource(checkout, input.version, commit, signal);
|
|
447
|
+
await git(stage, ['init', '--bare', '--object-format=sha1', '--initial-branch=repairs', bare], signal);
|
|
448
|
+
await chmod(bare, 0o700);
|
|
449
|
+
await git(bare, ['fetch', '--no-tags', '--no-write-fetch-head', '--no-recurse-submodules', checkout,
|
|
450
|
+
`+${commit}:refs/heads/repairs`], signal);
|
|
451
|
+
for (const path of [join(checkout, '.git', 'config'), join(checkout, '.git', 'HEAD'),
|
|
452
|
+
join(bare, 'config'), join(bare, 'HEAD')])
|
|
453
|
+
await chmod(path, 0o600);
|
|
454
|
+
const value = { schemaVersion: 1, version: input.version, origin, sourceCommit: commit,
|
|
455
|
+
repository, baseline: { ...expected.baseline, initialCommit: commit } };
|
|
456
|
+
await mkdir(final, { mode: 0o700 }); // O_EXCL-like directory claim: never replace another owner's tree.
|
|
457
|
+
claimed = true;
|
|
458
|
+
const identity = await stat(final);
|
|
459
|
+
claimIdentity = { dev: identity.dev, ino: identity.ino };
|
|
460
|
+
await rename(checkout, repository);
|
|
461
|
+
await rename(bare, remote);
|
|
462
|
+
await inspectWorkspace(value, signal);
|
|
463
|
+
await syncDirectory(final);
|
|
464
|
+
const content = { ...value, dshHome: input.dshHome, profile: input.profile,
|
|
465
|
+
staticFiles: await staticFiles(repository, remote) };
|
|
466
|
+
await writeExclusive(join(final, 'bootstrap.json'), JSON.stringify({ ...content, receiptDigest: digest(content) }));
|
|
467
|
+
await syncDirectory(final);
|
|
468
|
+
await syncDirectory(parent);
|
|
469
|
+
return value;
|
|
470
|
+
}
|
|
471
|
+
catch (error) {
|
|
472
|
+
if (claimed && claimIdentity) {
|
|
473
|
+
const current = await lstat(final).catch(() => undefined);
|
|
474
|
+
if (current?.isDirectory() && current.dev === claimIdentity.dev && current.ino === claimIdentity.ino) {
|
|
475
|
+
const names = await readdir(final).catch(() => []);
|
|
476
|
+
if (names.every(name => ['checkout', 'release.git', 'bootstrap.json'].includes(name)))
|
|
477
|
+
await rm(final, { recursive: true, force: true });
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
throw error;
|
|
481
|
+
}
|
|
482
|
+
finally {
|
|
483
|
+
await rm(stage, { recursive: true, force: true });
|
|
484
|
+
await syncDirectory(parent);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
//# 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"}
|