@songsid/agend 2.2.0-beta.1 → 2.2.0-beta.10
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 +1 -1
- package/README.zh-TW.md +1 -1
- package/dist/agent-cli-instructions.md +16 -9
- package/dist/agent-cli.js +15 -7
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +21 -9
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-whats-new.d.ts +47 -0
- package/dist/agent-whats-new.js +147 -0
- package/dist/agent-whats-new.js.map +1 -0
- package/dist/auth-api.d.ts +2 -2
- package/dist/auth-api.js +4 -2
- package/dist/auth-api.js.map +1 -1
- package/dist/backend/antigravity.d.ts +3 -0
- package/dist/backend/antigravity.js +9 -0
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-carry.d.ts +22 -0
- package/dist/backend/claude-carry.js +170 -0
- package/dist/backend/claude-carry.js.map +1 -0
- package/dist/backend/claude-code.d.ts +65 -2
- package/dist/backend/claude-code.js +226 -33
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +33 -0
- package/dist/backend/codex-metadata.js +122 -18
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex.d.ts +3 -0
- package/dist/backend/codex.js +17 -1
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/credential-profile.d.ts +40 -3
- package/dist/backend/credential-profile.js +113 -5
- package/dist/backend/credential-profile.js.map +1 -1
- package/dist/backend/effort-metadata.d.ts +1 -1
- package/dist/backend/effort-metadata.js +3 -2
- package/dist/backend/effort-metadata.js.map +1 -1
- package/dist/backend/grok.d.ts +4 -0
- package/dist/backend/grok.js +14 -0
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-engine-ledger.d.ts +5 -0
- package/dist/backend/kiro-engine-ledger.js +20 -0
- package/dist/backend/kiro-engine-ledger.js.map +1 -1
- package/dist/backend/kiro-identity.d.ts +6 -0
- package/dist/backend/kiro-identity.js +19 -5
- package/dist/backend/kiro-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +39 -3
- package/dist/backend/kiro.js +143 -19
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/launch-effort.d.ts +33 -0
- package/dist/backend/launch-effort.js +123 -0
- package/dist/backend/launch-effort.js.map +1 -0
- package/dist/backend/muse.d.ts +84 -0
- package/dist/backend/muse.js +449 -53
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +33 -4
- package/dist/backend/types.js +2 -1
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-command.d.ts +91 -0
- package/dist/backend-command.js +122 -0
- package/dist/backend-command.js.map +1 -0
- package/dist/background-work-ended.d.ts +18 -0
- package/dist/background-work-ended.js +30 -0
- package/dist/background-work-ended.js.map +1 -0
- package/dist/cache-service.d.ts +2 -0
- package/dist/cache-service.js +2 -1
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +24 -1
- package/dist/channel/adapters/discord.js +87 -2
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +24 -2
- package/dist/channel/adapters/telegram.js +118 -20
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-server.js +9 -1
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.d.ts +11 -0
- package/dist/channel/mcp-tools.js +24 -13
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/message-edit-errors.d.ts +5 -0
- package/dist/channel/message-edit-errors.js +24 -0
- package/dist/channel/message-edit-errors.js.map +1 -0
- package/dist/channel/telegram-markdown.d.ts +6 -0
- package/dist/channel/telegram-markdown.js +104 -0
- package/dist/channel/telegram-markdown.js.map +1 -0
- package/dist/channel/tool-router.js +9 -3
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +39 -3
- package/dist/cli.js +133 -28
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +2 -2
- package/dist/command-table.js +6 -3
- package/dist/command-table.js.map +1 -1
- package/dist/config-validator.js +59 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/cross-instance-envelope.d.ts +15 -2
- package/dist/cross-instance-envelope.js +29 -5
- package/dist/cross-instance-envelope.js.map +1 -1
- package/dist/daemon.d.ts +156 -1
- package/dist/daemon.js +764 -89
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-outbox.d.ts +62 -7
- package/dist/delivery-outbox.js +309 -22
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +18 -1
- package/dist/delivery-reconciliation.js +67 -2
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/fleet-context.d.ts +10 -1
- package/dist/fleet-manager.d.ts +345 -10
- package/dist/fleet-manager.js +1868 -174
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-knowledge/skills/backend-providers/SKILL.md +1 -1
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +92 -21
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +27 -3
- package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +8 -8
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +5 -5
- package/dist/general-knowledge/skills/fleet-health/SKILL.md +4 -4
- package/dist/general-knowledge/skills/fleet-restart/SKILL.md +13 -13
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -2
- package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +6 -0
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +9 -9
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +8 -2
- package/dist/general-knowledge/skills/scheduling/SKILL.md +5 -3
- package/dist/general-knowledge/skills/session-management/SKILL.md +6 -5
- package/dist/general-knowledge/skills/tui-effort/SKILL.md +2 -2
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +8 -3
- package/dist/general-knowledge/steering/core-rules.md +8 -7
- package/dist/host-memory.d.ts +10 -0
- package/dist/host-memory.js +33 -1
- package/dist/host-memory.js.map +1 -1
- package/dist/human-delivery-receipts.d.ts +83 -0
- package/dist/human-delivery-receipts.js +194 -0
- package/dist/human-delivery-receipts.js.map +1 -0
- package/dist/instance-avatar.d.ts +36 -0
- package/dist/instance-avatar.js +57 -0
- package/dist/instance-avatar.js.map +1 -0
- package/dist/instance-config-impact.js +6 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +29 -6
- package/dist/instance-lifecycle.js +79 -28
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +3 -1
- package/dist/instructions.js +11 -8
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-log-gate.d.ts +42 -0
- package/dist/kiro-log-gate.js +39 -0
- package/dist/kiro-log-gate.js.map +1 -0
- package/dist/locale.js +200 -44
- package/dist/locale.js.map +1 -1
- package/dist/log-service.d.ts +99 -0
- package/dist/log-service.js +243 -0
- package/dist/log-service.js.map +1 -0
- package/dist/log-steps.d.ts +169 -0
- package/dist/log-steps.js +858 -0
- package/dist/log-steps.js.map +1 -0
- package/dist/login-controller.d.ts +20 -3
- package/dist/login-controller.js +71 -19
- package/dist/login-controller.js.map +1 -1
- package/dist/login-flows.d.ts +5 -2
- package/dist/login-flows.js +5 -4
- package/dist/login-flows.js.map +1 -1
- package/dist/memory-pressure.d.ts +13 -1
- package/dist/memory-pressure.js +50 -10
- package/dist/memory-pressure.js.map +1 -1
- package/dist/needs-you-hub.js +2 -0
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you-live.d.ts +6 -0
- package/dist/needs-you-live.js +23 -3
- package/dist/needs-you-live.js.map +1 -1
- package/dist/next-steps.js +1 -1
- package/dist/next-steps.js.map +1 -1
- package/dist/outbound-handlers.d.ts +100 -0
- package/dist/outbound-handlers.js +263 -96
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +26 -15
- package/dist/outbound-schemas.js +24 -7
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-link-progress.d.ts +1 -1
- package/dist/public-link-progress.js +8 -2
- package/dist/public-link-progress.js.map +1 -1
- package/dist/public-preview.d.ts +101 -0
- package/dist/public-preview.js +236 -0
- package/dist/public-preview.js.map +1 -0
- package/dist/public-web-gateway.js +11 -4
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +24 -1
- package/dist/public-web-link.js +63 -9
- package/dist/public-web-link.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +3 -0
- package/dist/reply-buttons-controller.js +3 -2
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/restart-guard.d.ts +6 -3
- package/dist/restart-guard.js +6 -3
- package/dist/restart-guard.js.map +1 -1
- package/dist/restart-progress.d.ts +33 -0
- package/dist/restart-progress.js +30 -0
- package/dist/restart-progress.js.map +1 -1
- package/dist/service-activation.d.ts +15 -7
- package/dist/service-activation.js +46 -29
- package/dist/service-activation.js.map +1 -1
- package/dist/service-installer.d.ts +31 -0
- package/dist/service-installer.js +41 -2
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.js +85 -25
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +72 -1
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +28 -4
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +7 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +1 -1
- package/dist/spawn-gate.js +5 -1
- package/dist/spawn-gate.js.map +1 -1
- package/dist/spawn-hold-reply.d.ts +12 -0
- package/dist/spawn-hold-reply.js +39 -0
- package/dist/spawn-hold-reply.js.map +1 -0
- package/dist/status-emojis.d.ts +10 -3
- package/dist/status-emojis.js +11 -2
- package/dist/status-emojis.js.map +1 -1
- package/dist/systemd-peer-bus.d.ts +95 -0
- package/dist/systemd-peer-bus.js +430 -0
- package/dist/systemd-peer-bus.js.map +1 -0
- package/dist/systemd-runtime.d.ts +27 -1
- package/dist/systemd-runtime.js +69 -7
- package/dist/systemd-runtime.js.map +1 -1
- package/dist/tips.js +4 -4
- package/dist/tips.js.map +1 -1
- package/dist/tool-progress.js +3 -2
- package/dist/tool-progress.js.map +1 -1
- package/dist/topic-commands.d.ts +42 -2
- package/dist/topic-commands.js +92 -7
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.d.ts +3 -3
- package/dist/transcript-delta-reader.js +8 -8
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-jsonl.d.ts +80 -3
- package/dist/transcript-jsonl.js +147 -10
- package/dist/transcript-jsonl.js.map +1 -1
- package/dist/transcript-monitor.d.ts +19 -0
- package/dist/transcript-monitor.js +87 -15
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +78 -0
- package/dist/transcript-sources.js +375 -64
- package/dist/transcript-sources.js.map +1 -1
- package/dist/transcript-turns.d.ts +15 -2
- package/dist/transcript-turns.js +15 -2
- package/dist/transcript-turns.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +7 -15
- package/dist/tunnel/cloudflared.js +36 -1
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/purpose-lane.d.ts +5 -1
- package/dist/tunnel/purpose-lane.js +14 -7
- package/dist/tunnel/purpose-lane.js.map +1 -1
- package/dist/tunnel/types.d.ts +5 -1
- package/dist/tunnel/types.js.map +1 -1
- package/dist/turn-resume.d.ts +2 -0
- package/dist/turn-resume.js +1 -1
- package/dist/turn-resume.js.map +1 -1
- package/dist/types.d.ts +25 -0
- package/dist/ui/chat-commands.js +1 -0
- package/dist/ui/chat-emojis.js +33 -0
- package/dist/ui/chat-mentions.js +63 -0
- package/dist/ui/chat-render.js +42 -2
- package/dist/ui/chat-store.js +2 -2
- package/dist/ui/chat-strings.js +38 -20
- package/dist/ui/chat-thread.js +69 -12
- package/dist/ui/chat-time.js +80 -0
- package/dist/ui/panel-chat.js +39 -10
- package/dist/ui/panel-details.js +2 -0
- package/dist/ui/panel-fleet.js +199 -57
- package/dist/ui/panel-log.js +428 -0
- package/dist/ui/panel-needs.js +6 -2
- package/dist/ui/panel-settings.js +137 -32
- package/dist/ui/preview-panel.js +55 -15
- package/dist/ui/preview-status.js +28 -0
- package/dist/ui/preview.js +44 -3
- package/dist/ui/settings-dialogs.js +7 -2
- package/dist/ui/settings-model.js +2 -1
- package/dist/ui/settings-strings.js +46 -4
- package/dist/ui/settings-token.js +1 -1
- package/dist/ui/shared/app-i18n.js +43 -17
- package/dist/ui/shared/app-prefs.js +250 -0
- package/dist/ui/shared/app-route.js +7 -2
- package/dist/ui/shared/app-shell.js +165 -8
- package/dist/ui/shared/app-store.js +5 -1
- package/dist/ui/shared/app-stream.js +23 -5
- package/dist/ui/shared/app.css +155 -22
- package/dist/ui/shared/app.js +11 -1
- package/dist/ui/shared/fonts/README.md +1 -1
- package/dist/ui/shared/header-tools.js +55 -5
- package/dist/ui/shared/instance-nav.js +241 -45
- package/dist/ui/shared/instance-switch.js +4 -4
- package/dist/ui/shared/panel-view.js +6 -0
- package/dist/ui/shared/signin.js +7 -7
- package/dist/ui/shared/theme.js +39 -7
- package/dist/ui/shared/tokens.css +1 -1
- package/dist/ui/shared/ui-icons.js +1 -0
- package/dist/ui/shared/usage-dialog.js +23 -5
- package/dist/ui/shared/view-strings.js +32 -4
- package/dist/ui/signin.html +1 -1
- package/dist/unrecognised-prompt.d.ts +23 -0
- package/dist/unrecognised-prompt.js +74 -0
- package/dist/unrecognised-prompt.js.map +1 -0
- package/dist/update-install.d.ts +28 -2
- package/dist/update-install.js +22 -4
- package/dist/update-install.js.map +1 -1
- package/dist/update-marker.d.ts +51 -0
- package/dist/update-marker.js +61 -0
- package/dist/update-marker.js.map +1 -1
- package/dist/update-preflight.d.ts +100 -0
- package/dist/update-preflight.js +264 -0
- package/dist/update-preflight.js.map +1 -0
- package/dist/updater-caller.d.ts +31 -0
- package/dist/updater-caller.js +109 -0
- package/dist/updater-caller.js.map +1 -0
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +1 -1
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/providers.d.ts +34 -5
- package/dist/usage/providers.js +160 -27
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/statusline-usage.d.ts +6 -2
- package/dist/usage/statusline-usage.js +10 -4
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/view-api.d.ts +1 -1
- package/dist/view-api.js +38 -8
- package/dist/view-api.js.map +1 -1
- package/dist/wake-coordinator.d.ts +11 -0
- package/dist/wake-coordinator.js +38 -4
- package/dist/wake-coordinator.js.map +1 -1
- package/dist/web-api.d.ts +49 -2
- package/dist/web-api.js +421 -31
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.d.ts +2 -2
- package/dist/web-auth.js +9 -4
- package/dist/web-auth.js.map +1 -1
- package/dist/web-commands.d.ts +27 -4
- package/dist/web-commands.js +19 -4
- package/dist/web-commands.js.map +1 -1
- package/dist/web-host-guard.d.ts +3 -11
- package/dist/web-host-guard.js +3 -12
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-images.d.ts +47 -0
- package/dist/web-images.js +169 -0
- package/dist/web-images.js.map +1 -0
- package/dist/web-mentions.d.ts +44 -0
- package/dist/web-mentions.js +75 -0
- package/dist/web-mentions.js.map +1 -0
- package/dist/web-prefs.d.ts +63 -0
- package/dist/web-prefs.js +265 -0
- package/dist/web-prefs.js.map +1 -0
- package/dist/web-preview.d.ts +14 -1
- package/dist/web-preview.js +35 -13
- package/dist/web-preview.js.map +1 -1
- package/dist/web-reply-files.d.ts +45 -0
- package/dist/web-reply-files.js +223 -0
- package/dist/web-reply-files.js.map +1 -0
- package/dist/web-schedules.d.ts +12 -0
- package/dist/web-schedules.js +34 -0
- package/dist/web-schedules.js.map +1 -0
- package/dist/web-server-drain.d.ts +10 -0
- package/dist/web-server-drain.js +50 -0
- package/dist/web-server-drain.js.map +1 -0
- package/dist/web-session.d.ts +36 -1
- package/dist/web-session.js +53 -6
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +23 -0
- package/dist/web-settings-patch.js +77 -0
- package/dist/web-settings-patch.js.map +1 -0
- package/dist/web-shell-routes.d.ts +5 -1
- package/dist/web-shell-routes.js +10 -1
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-upload.d.ts +17 -4
- package/dist/web-upload.js +64 -13
- package/dist/web-upload.js.map +1 -1
- package/dist/workflow-templates/default.md +1 -1
- package/package.json +1 -1
- package/templates/launchd.plist.ejs +3 -1
- package/templates/systemd.service.ejs +2 -1
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1804: systemd's private socket — `$XDG_RUNTIME_DIR/systemd/private` for a user manager, `/run/systemd/private` for
|
|
3
|
+
* the system one — the manager's own peer-to-peer D-Bus endpoint, which `systemctl` uses when there is no bus (a host
|
|
4
|
+
* without dbus-user-session). busctl cannot use it: it always sends Hello(), which a peer connection has no bus driver
|
|
5
|
+
* to answer ("Invalid request descriptor"; busctl 249 has no way to skip it). This speaks the D-Bus wire protocol to it
|
|
6
|
+
* directly — SASL EXTERNAL, then one method call, no Hello — and returns what `busctl --json=short` prints for the same
|
|
7
|
+
* call, so every reader keeps the exact D-Bus values (argv as `as`, never `systemctl show`'s joined text) and the same
|
|
8
|
+
* proof as on a bus.
|
|
9
|
+
*
|
|
10
|
+
* The update's code is synchronous, so the call runs in a worker thread while this thread waits on an Atomics flag,
|
|
11
|
+
* bounded. The worker's code is this module's own function text, evaluated: nothing is loaded from disk, where npm may
|
|
12
|
+
* already have put the next package (#1450 C6).
|
|
13
|
+
*/
|
|
14
|
+
import { lstatSync, realpathSync } from "node:fs";
|
|
15
|
+
import { basename, dirname } from "node:path";
|
|
16
|
+
import { MessageChannel, Worker, receiveMessageOnPort } from "node:worker_threads";
|
|
17
|
+
/** How long one call may take, connection and authentication included. */
|
|
18
|
+
export const PEER_TIMEOUT_MS = 10_000;
|
|
19
|
+
/**
|
|
20
|
+
* The D-Bus wire format (specification, "Message Protocol"): what this client sends and reads. Self-contained, like
|
|
21
|
+
* peerWorker: the worker receives it as source text.
|
|
22
|
+
*/
|
|
23
|
+
function peerCodecFactory() {
|
|
24
|
+
const ALIGN = { y: 1, b: 4, n: 2, q: 2, i: 4, u: 4, x: 8, t: 8, d: 8, h: 4, s: 4, o: 4, g: 1, v: 1, a: 4, "(": 8, "{": 8 };
|
|
25
|
+
/** The end of the single complete type starting at `i`. */
|
|
26
|
+
const typeEnd = (sig, i) => {
|
|
27
|
+
const c = sig[i];
|
|
28
|
+
if (c === undefined)
|
|
29
|
+
throw Error(`truncated signature ${JSON.stringify(sig)}`);
|
|
30
|
+
if (c === "a")
|
|
31
|
+
return typeEnd(sig, i + 1);
|
|
32
|
+
if (c === "(" || c === "{") {
|
|
33
|
+
const close = c === "(" ? ")" : "}";
|
|
34
|
+
let j = i + 1;
|
|
35
|
+
while (sig[j] !== close) {
|
|
36
|
+
if (j >= sig.length)
|
|
37
|
+
throw Error(`unclosed ${c} in ${JSON.stringify(sig)}`);
|
|
38
|
+
j = typeEnd(sig, j);
|
|
39
|
+
}
|
|
40
|
+
if (j === i + 1)
|
|
41
|
+
throw Error(`empty struct in ${JSON.stringify(sig)}`);
|
|
42
|
+
return j + 1;
|
|
43
|
+
}
|
|
44
|
+
if (!(c in ALIGN))
|
|
45
|
+
throw Error(`unsupported type ${JSON.stringify(c)}`);
|
|
46
|
+
return i + 1;
|
|
47
|
+
};
|
|
48
|
+
const types = (sig) => { const out = []; for (let i = 0; i < sig.length;) {
|
|
49
|
+
const e = typeEnd(sig, i);
|
|
50
|
+
out.push(sig.slice(i, e));
|
|
51
|
+
i = e;
|
|
52
|
+
} return out; };
|
|
53
|
+
function encodeCall(request, serial) {
|
|
54
|
+
const bytes = [];
|
|
55
|
+
const pad = (n) => { while (bytes.length % n)
|
|
56
|
+
bytes.push(0); };
|
|
57
|
+
const u32 = (n) => { pad(4); bytes.push(n & 0xff, (n >>> 8) & 0xff, (n >>> 16) & 0xff, (n >>> 24) & 0xff); };
|
|
58
|
+
const str = (s) => { const b = Buffer.from(s, "utf8"); u32(b.length); bytes.push(...b, 0); };
|
|
59
|
+
const sig = (s) => { const b = Buffer.from(s, "ascii"); bytes.push(b.length, ...b, 0); };
|
|
60
|
+
if (request.signature !== "" && request.signature !== "s".repeat(request.body.length))
|
|
61
|
+
throw Error(`unsupported call signature ${request.signature}`);
|
|
62
|
+
// Body first, to know its length: every argument is a string, starting 8-aligned (the body's own offset 0).
|
|
63
|
+
for (const arg of request.body)
|
|
64
|
+
str(arg);
|
|
65
|
+
const body = Buffer.from(bytes);
|
|
66
|
+
bytes.length = 0;
|
|
67
|
+
bytes.push(0x6c, 1, 0, 1); // little-endian, METHOD_CALL, no flags, version 1
|
|
68
|
+
u32(body.length);
|
|
69
|
+
u32(serial);
|
|
70
|
+
u32(0); // the field array's length, filled in below
|
|
71
|
+
const fields = [
|
|
72
|
+
[1, "o", request.path], [2, "s", request.iface], [3, "s", request.member], [6, "s", "org.freedesktop.systemd1"],
|
|
73
|
+
...(request.signature ? [[8, "g", request.signature]] : []),
|
|
74
|
+
];
|
|
75
|
+
for (const [code, type, value] of fields) {
|
|
76
|
+
pad(8);
|
|
77
|
+
bytes.push(code);
|
|
78
|
+
sig(type);
|
|
79
|
+
if (type === "g")
|
|
80
|
+
sig(value);
|
|
81
|
+
else
|
|
82
|
+
str(value);
|
|
83
|
+
}
|
|
84
|
+
const fieldBytes = bytes.length - 16;
|
|
85
|
+
bytes[12] = fieldBytes & 0xff;
|
|
86
|
+
bytes[13] = (fieldBytes >>> 8) & 0xff;
|
|
87
|
+
bytes[14] = (fieldBytes >>> 16) & 0xff;
|
|
88
|
+
bytes[15] = (fieldBytes >>> 24) & 0xff;
|
|
89
|
+
pad(8);
|
|
90
|
+
return Buffer.concat([Buffer.from(bytes), body]);
|
|
91
|
+
}
|
|
92
|
+
/** One whole message from the start of `buf`, or null if more bytes are needed. Malformed input throws. */
|
|
93
|
+
function decode(buf) {
|
|
94
|
+
if (buf.length < 16)
|
|
95
|
+
return null;
|
|
96
|
+
const le = buf[0] === 0x6c;
|
|
97
|
+
if (!le && buf[0] !== 0x42)
|
|
98
|
+
throw Error(`bad endianness byte ${buf[0]}`);
|
|
99
|
+
if (buf[3] !== 1)
|
|
100
|
+
throw Error(`unsupported protocol version ${buf[3]}`);
|
|
101
|
+
const u32at = (o) => (le ? buf.readUInt32LE(o) : buf.readUInt32BE(o));
|
|
102
|
+
const bodyLength = u32at(4), fieldBytes = u32at(12);
|
|
103
|
+
if (bodyLength > 1 << 27 || fieldBytes > 1 << 26)
|
|
104
|
+
throw Error("message too large");
|
|
105
|
+
const bodyStart = Math.ceil((16 + fieldBytes) / 8) * 8, total = bodyStart + bodyLength;
|
|
106
|
+
if (buf.length < total)
|
|
107
|
+
return null;
|
|
108
|
+
const msg = buf.subarray(0, total);
|
|
109
|
+
let pos = 0;
|
|
110
|
+
const align = (n) => {
|
|
111
|
+
const next = Math.ceil(pos / n) * n;
|
|
112
|
+
for (let k = pos; k < next; k++)
|
|
113
|
+
if (msg[k] !== 0)
|
|
114
|
+
throw Error("nonzero padding");
|
|
115
|
+
pos = next;
|
|
116
|
+
};
|
|
117
|
+
const need = (n) => { if (pos + n > total)
|
|
118
|
+
throw Error("value runs past the message"); };
|
|
119
|
+
const read = (type) => {
|
|
120
|
+
const c = type[0];
|
|
121
|
+
align(ALIGN[c] ?? 1);
|
|
122
|
+
switch (c) {
|
|
123
|
+
case "y":
|
|
124
|
+
need(1);
|
|
125
|
+
return msg[pos++];
|
|
126
|
+
case "b": {
|
|
127
|
+
need(4);
|
|
128
|
+
const v = le ? msg.readUInt32LE(pos) : msg.readUInt32BE(pos);
|
|
129
|
+
pos += 4;
|
|
130
|
+
if (v > 1)
|
|
131
|
+
throw Error(`boolean ${v}`);
|
|
132
|
+
return v === 1;
|
|
133
|
+
}
|
|
134
|
+
case "n": {
|
|
135
|
+
need(2);
|
|
136
|
+
const v = le ? msg.readInt16LE(pos) : msg.readInt16BE(pos);
|
|
137
|
+
pos += 2;
|
|
138
|
+
return v;
|
|
139
|
+
}
|
|
140
|
+
case "q": {
|
|
141
|
+
need(2);
|
|
142
|
+
const v = le ? msg.readUInt16LE(pos) : msg.readUInt16BE(pos);
|
|
143
|
+
pos += 2;
|
|
144
|
+
return v;
|
|
145
|
+
}
|
|
146
|
+
case "i": {
|
|
147
|
+
need(4);
|
|
148
|
+
const v = le ? msg.readInt32LE(pos) : msg.readInt32BE(pos);
|
|
149
|
+
pos += 4;
|
|
150
|
+
return v;
|
|
151
|
+
}
|
|
152
|
+
case "u":
|
|
153
|
+
case "h": {
|
|
154
|
+
need(4);
|
|
155
|
+
const v = le ? msg.readUInt32LE(pos) : msg.readUInt32BE(pos);
|
|
156
|
+
pos += 4;
|
|
157
|
+
return v;
|
|
158
|
+
}
|
|
159
|
+
case "x": {
|
|
160
|
+
need(8);
|
|
161
|
+
const v = le ? msg.readBigInt64LE(pos) : msg.readBigInt64BE(pos);
|
|
162
|
+
pos += 8;
|
|
163
|
+
return Number(v);
|
|
164
|
+
}
|
|
165
|
+
case "t": {
|
|
166
|
+
need(8);
|
|
167
|
+
const v = le ? msg.readBigUInt64LE(pos) : msg.readBigUInt64BE(pos);
|
|
168
|
+
pos += 8;
|
|
169
|
+
return Number(v);
|
|
170
|
+
}
|
|
171
|
+
case "d": {
|
|
172
|
+
need(8);
|
|
173
|
+
const v = le ? msg.readDoubleLE(pos) : msg.readDoubleBE(pos);
|
|
174
|
+
pos += 8;
|
|
175
|
+
return v;
|
|
176
|
+
}
|
|
177
|
+
case "s":
|
|
178
|
+
case "o": {
|
|
179
|
+
need(4);
|
|
180
|
+
const n = le ? msg.readUInt32LE(pos) : msg.readUInt32BE(pos);
|
|
181
|
+
pos += 4;
|
|
182
|
+
need(n + 1);
|
|
183
|
+
if (msg[pos + n] !== 0)
|
|
184
|
+
throw Error("unterminated string");
|
|
185
|
+
// ignoreBOM: a leading U+FEFF is part of the string (Prism r2): stripped, "\uFEFF/x/cli.js" would read as "/x/cli.js".
|
|
186
|
+
const text = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(msg.subarray(pos, pos + n));
|
|
187
|
+
if (text.includes("\0"))
|
|
188
|
+
throw Error("NUL inside a string");
|
|
189
|
+
pos += n + 1;
|
|
190
|
+
return text;
|
|
191
|
+
}
|
|
192
|
+
case "g": {
|
|
193
|
+
need(1);
|
|
194
|
+
const n = msg[pos++];
|
|
195
|
+
need(n + 1);
|
|
196
|
+
if (msg[pos + n] !== 0)
|
|
197
|
+
throw Error("unterminated signature");
|
|
198
|
+
const text = msg.subarray(pos, pos + n).toString("ascii");
|
|
199
|
+
pos += n + 1;
|
|
200
|
+
return text;
|
|
201
|
+
}
|
|
202
|
+
case "v": {
|
|
203
|
+
const sig = read("g");
|
|
204
|
+
const inner = types(sig);
|
|
205
|
+
if (inner.length !== 1)
|
|
206
|
+
throw Error(`variant signature ${JSON.stringify(sig)}`);
|
|
207
|
+
return { type: sig, data: read(sig) };
|
|
208
|
+
}
|
|
209
|
+
case "a": {
|
|
210
|
+
need(4);
|
|
211
|
+
const n = le ? msg.readUInt32LE(pos) : msg.readUInt32BE(pos);
|
|
212
|
+
pos += 4;
|
|
213
|
+
if (n > 1 << 26)
|
|
214
|
+
throw Error("array too large");
|
|
215
|
+
const element = type.slice(1);
|
|
216
|
+
align(ALIGN[element[0]] ?? 1);
|
|
217
|
+
const end = pos + n;
|
|
218
|
+
if (end > total)
|
|
219
|
+
throw Error("array runs past the message");
|
|
220
|
+
const items = [];
|
|
221
|
+
while (pos < end)
|
|
222
|
+
items.push(read(element));
|
|
223
|
+
if (pos !== end)
|
|
224
|
+
throw Error("array length mismatch");
|
|
225
|
+
return items;
|
|
226
|
+
}
|
|
227
|
+
case "(":
|
|
228
|
+
case "{": return types(type.slice(1, -1)).map(read);
|
|
229
|
+
default: throw Error(`unsupported type ${JSON.stringify(c)}`);
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
pos = 12;
|
|
233
|
+
const fields = read("a(yv)");
|
|
234
|
+
align(8);
|
|
235
|
+
if (pos !== bodyStart)
|
|
236
|
+
throw Error("header length mismatch");
|
|
237
|
+
const field = (code, type) => {
|
|
238
|
+
const f = fields.find(([c]) => c === code);
|
|
239
|
+
if (!f)
|
|
240
|
+
return null;
|
|
241
|
+
if (f[1].type !== type)
|
|
242
|
+
throw Error(`header field ${code} has type ${f[1].type}`);
|
|
243
|
+
return f[1].data;
|
|
244
|
+
};
|
|
245
|
+
const signature = field(8, "g") ?? "";
|
|
246
|
+
const values = types(signature).map(read);
|
|
247
|
+
if (pos !== total)
|
|
248
|
+
throw Error("body length mismatch");
|
|
249
|
+
return { length: total, type: msg[1], replySerial: field(5, "u"), signature, errorName: field(4, "s"), values };
|
|
250
|
+
}
|
|
251
|
+
return { encodeCall, decode };
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* The worker: connect, authenticate, one call, post the reply, set the flag. Self-contained — it runs from its own
|
|
255
|
+
* source text, so it may use nothing from this module's scope but what it is handed.
|
|
256
|
+
*/
|
|
257
|
+
function peerWorker(require, codecFactory) {
|
|
258
|
+
const codec = codecFactory();
|
|
259
|
+
const net = require("node:net");
|
|
260
|
+
const { workerData } = require("node:worker_threads");
|
|
261
|
+
const { socket, uid, request, port, flag } = workerData;
|
|
262
|
+
let finished = false;
|
|
263
|
+
const finish = (reply) => {
|
|
264
|
+
if (finished)
|
|
265
|
+
return;
|
|
266
|
+
finished = true;
|
|
267
|
+
port.postMessage(reply);
|
|
268
|
+
Atomics.store(flag, 0, 1);
|
|
269
|
+
Atomics.notify(flag, 0);
|
|
270
|
+
conn.destroy();
|
|
271
|
+
};
|
|
272
|
+
let authed = false;
|
|
273
|
+
let pending = Buffer.alloc(0);
|
|
274
|
+
const conn = net.createConnection(socket);
|
|
275
|
+
conn.on("error", error => finish({ ok: false, stage: authed ? "protocol" : "connect", message: error.message }));
|
|
276
|
+
conn.on("close", () => finish({ ok: false, stage: authed ? "protocol" : "connect", message: "the connection closed before a reply" }));
|
|
277
|
+
// As systemctl does: AUTH and BEGIN together, the call only after the server's OK. systemd 249 drops bytes that
|
|
278
|
+
// arrive in the same read as BEGIN — a call written right behind it is never answered.
|
|
279
|
+
conn.on("connect", () => {
|
|
280
|
+
conn.write(Buffer.concat([Buffer.from([0]), Buffer.from(`AUTH EXTERNAL ${Buffer.from(String(uid)).toString("hex")}\r\nBEGIN\r\n`, "ascii")]));
|
|
281
|
+
});
|
|
282
|
+
conn.on("data", (chunk) => {
|
|
283
|
+
pending = Buffer.concat([pending, chunk]);
|
|
284
|
+
try {
|
|
285
|
+
if (!authed) {
|
|
286
|
+
const end = pending.indexOf("\r\n");
|
|
287
|
+
if (end < 0)
|
|
288
|
+
return;
|
|
289
|
+
const line = pending.subarray(0, end).toString("latin1");
|
|
290
|
+
pending = pending.subarray(end + 2);
|
|
291
|
+
if (!/^OK [0-9a-f]{32}$/.test(line))
|
|
292
|
+
return finish({ ok: false, stage: "connect", message: `authentication refused (${JSON.stringify(line.slice(0, 80))})` });
|
|
293
|
+
authed = true;
|
|
294
|
+
conn.write(codec.encodeCall(request, 1));
|
|
295
|
+
}
|
|
296
|
+
for (;;) {
|
|
297
|
+
const message = codec.decode(pending);
|
|
298
|
+
if (!message)
|
|
299
|
+
return;
|
|
300
|
+
pending = pending.subarray(message.length);
|
|
301
|
+
if (message.replySerial !== 1)
|
|
302
|
+
continue; // not ours (a signal): skip it
|
|
303
|
+
if (message.type === 3) {
|
|
304
|
+
const text = typeof message.values[0] === "string" ? `: ${message.values[0]}` : "";
|
|
305
|
+
return finish({ ok: false, stage: "call", message: `${message.errorName ?? "error"}${text}` });
|
|
306
|
+
}
|
|
307
|
+
if (message.type !== 2)
|
|
308
|
+
return finish({ ok: false, stage: "protocol", message: `unexpected message type ${message.type}` });
|
|
309
|
+
return finish({ ok: true, signature: message.signature, values: message.values });
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
finish({ ok: false, stage: "protocol", message: error instanceof Error ? error.message : String(error) });
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
/** The codec the worker uses, for tests. */
|
|
318
|
+
export const peerCodec = () => peerCodecFactory();
|
|
319
|
+
/** busctl arguments → the method call: `call <dest> <path> <iface> <member> [<sig> <args…>]` or `get-property <dest> <path> <iface> <prop>`. */
|
|
320
|
+
export function peerRequestFor(args) {
|
|
321
|
+
if (args[0] === "call" && args[1] === "org.freedesktop.systemd1" && args.length >= 5) {
|
|
322
|
+
const [, , path, iface, member, signature = "", ...body] = args;
|
|
323
|
+
return signature === "s".repeat(body.length) ? { path, iface, member, signature, body } : null;
|
|
324
|
+
}
|
|
325
|
+
if (args[0] === "get-property" && args[1] === "org.freedesktop.systemd1" && args.length === 5) {
|
|
326
|
+
return { path: args[2], iface: "org.freedesktop.DBus.Properties", member: "Get", signature: "ss", body: [args[3], args[4]] };
|
|
327
|
+
}
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
/** A reply as `busctl --json=short` prints it: a call's out-arguments as an array, a property's variant unwrapped. */
|
|
331
|
+
export function peerReplyAsBusctl(args, reply, socket) {
|
|
332
|
+
if (!reply.ok) {
|
|
333
|
+
return { status: 1, signal: null, stdout: "", stderr: reply.stage === "connect" ? `Failed to connect to ${socket}: ${reply.message}\n` : `Call failed: ${reply.message}\n` };
|
|
334
|
+
}
|
|
335
|
+
if (args[0] === "get-property") {
|
|
336
|
+
const variant = reply.values[0];
|
|
337
|
+
if (reply.signature !== "v" || !variant || typeof variant.type !== "string")
|
|
338
|
+
return { status: 1, signal: null, stdout: "", stderr: `Call failed: Get returned ${reply.signature}\n` };
|
|
339
|
+
return { status: 0, signal: null, stdout: `${JSON.stringify({ type: variant.type, data: variant.data })}\n`, stderr: "" };
|
|
340
|
+
}
|
|
341
|
+
return { status: 0, signal: null, stdout: `${JSON.stringify({ type: reply.signature, data: reply.values })}\n`, stderr: "" };
|
|
342
|
+
}
|
|
343
|
+
/** Where the manager's private socket is. */
|
|
344
|
+
export function privateSocketPath(user, env = process.env, uid = process.getuid?.() ?? 0) {
|
|
345
|
+
return user ? `${env.XDG_RUNTIME_DIR || `/run/user/${uid}`}/systemd/private` : "/run/systemd/private";
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Prism r2/r3: whose server answers. SASL EXTERNAL proves who WE are; systemctl separately accepts only a peer running
|
|
349
|
+
* as root or as itself (bus_check_peercred). Node cannot read a unix socket's peer credentials, so the same boundary is
|
|
350
|
+
* established from ownership instead: only root or this user can have bound the socket when the socket itself is owned
|
|
351
|
+
* by one of them, and every directory above it is owned by one of them and writable by no one else (a root-owned
|
|
352
|
+
* sticky directory such as /tmp excepted: no one else can replace an entry in it).
|
|
353
|
+
*
|
|
354
|
+
* The path is resolved ONCE, here: the canonical socket path (its directory's realpath + its own name) is the one
|
|
355
|
+
* checked and the one returned for connecting — never the original, whose symlinks someone else could retarget between
|
|
356
|
+
* the check and the connect (r3). Every component of the canonical path is then a real directory nobody but root or
|
|
357
|
+
* this user can change. Anything unknown or unresolvable is refused.
|
|
358
|
+
*/
|
|
359
|
+
export function peerEndpoint(socket, deps) {
|
|
360
|
+
const trusted = (uid) => uid === 0 || uid === deps.euid;
|
|
361
|
+
const refuse = (reason) => ({ ok: false, reason });
|
|
362
|
+
try {
|
|
363
|
+
if (!socket.startsWith("/"))
|
|
364
|
+
return refuse(`${socket} is not an absolute path`);
|
|
365
|
+
const name = basename(socket);
|
|
366
|
+
if (!name || name === "." || name === ".." || socket.endsWith("/"))
|
|
367
|
+
return refuse(`${socket} does not name a socket`);
|
|
368
|
+
const parent = deps.realpath(dirname(socket));
|
|
369
|
+
if (!parent.startsWith("/"))
|
|
370
|
+
return refuse(`${dirname(socket)} resolves to ${parent}, not an absolute path`);
|
|
371
|
+
const path = parent === "/" ? `/${name}` : `${parent}/${name}`;
|
|
372
|
+
const own = deps.lstat(path);
|
|
373
|
+
if (!own.isSocket())
|
|
374
|
+
return refuse(`${path} is not a socket`);
|
|
375
|
+
if (!trusted(own.uid))
|
|
376
|
+
return refuse(`${path} is owned by uid ${own.uid}, neither root nor ${deps.euid}`);
|
|
377
|
+
for (let dir = parent;; dir = dirname(dir)) {
|
|
378
|
+
const st = deps.lstat(dir);
|
|
379
|
+
if (!st.isDirectory())
|
|
380
|
+
return refuse(`${dir} is not a directory`);
|
|
381
|
+
if (!trusted(st.uid))
|
|
382
|
+
return refuse(`${dir} is owned by uid ${st.uid}, neither root nor ${deps.euid}`);
|
|
383
|
+
const othersWrite = (st.mode & 0o022) !== 0, sticky = (st.mode & 0o1000) !== 0;
|
|
384
|
+
if (othersWrite && !(sticky && st.uid === 0))
|
|
385
|
+
return refuse(`${dir} is writable by others (mode ${(st.mode & 0o7777).toString(8)})`);
|
|
386
|
+
if (dir === "/")
|
|
387
|
+
return { ok: true, path };
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
return refuse(error instanceof Error ? error.message : String(error));
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/** One call over a private socket, synchronously, bounded. `socket`/`timeoutMs`/`endpoint` are for tests. */
|
|
395
|
+
export function callPeer(user, args, opts = {}) {
|
|
396
|
+
const request = peerRequestFor(args);
|
|
397
|
+
if (!request)
|
|
398
|
+
return { status: 2, signal: null, stdout: "", stderr: `unsupported call ${args.slice(0, 2).join(" ")}\n` };
|
|
399
|
+
const named = opts.socket ?? privateSocketPath(user);
|
|
400
|
+
const endpoint = peerEndpoint(named, opts.endpoint ?? { lstat: path => lstatSync(path), realpath: path => realpathSync(path), euid: process.geteuid?.() ?? 0 });
|
|
401
|
+
if (!endpoint.ok)
|
|
402
|
+
return { status: 1, signal: null, stdout: "", stderr: `Failed to connect to ${named}: not systemd's own socket (${endpoint.reason})\n` };
|
|
403
|
+
const socket = endpoint.path; // the checked path, and only it, is connected
|
|
404
|
+
const timeoutMs = opts.timeoutMs ?? PEER_TIMEOUT_MS;
|
|
405
|
+
const flag = new Int32Array(new SharedArrayBuffer(4));
|
|
406
|
+
const { port1, port2 } = new MessageChannel();
|
|
407
|
+
let worker;
|
|
408
|
+
try {
|
|
409
|
+
worker = new Worker(`(${peerWorker.toString()})(require, ${peerCodecFactory.toString()})`, {
|
|
410
|
+
eval: true, workerData: { socket, uid: process.getuid?.() ?? 0, request, port: port2, flag }, transferList: [port2],
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
catch (error) {
|
|
414
|
+
port1.close();
|
|
415
|
+
return { status: null, signal: null, stdout: "", stderr: `the private-socket worker did not start: ${error instanceof Error ? error.message : String(error)}\n` };
|
|
416
|
+
}
|
|
417
|
+
worker.unref();
|
|
418
|
+
Atomics.wait(flag, 0, 0, timeoutMs);
|
|
419
|
+
const received = receiveMessageOnPort(port1);
|
|
420
|
+
port1.close();
|
|
421
|
+
void worker.terminate();
|
|
422
|
+
if (!received)
|
|
423
|
+
return { status: null, signal: "SIGTERM", stdout: "", stderr: `${socket} did not answer within ${timeoutMs / 1000}s\n` };
|
|
424
|
+
return peerReplyAsBusctl(args, received.message, socket);
|
|
425
|
+
}
|
|
426
|
+
/** The production PeerBus: the manager's own private socket. */
|
|
427
|
+
export const systemdPeerBus = (user, args) => callPeer(user, args);
|
|
428
|
+
/** The private socket could not be reached or authenticated to (not: the call failed). */
|
|
429
|
+
export const peerUnreachable = (result) => result.signal === null && result.status !== 0 && /^Failed to connect to /m.test(result.stderr);
|
|
430
|
+
//# sourceMappingURL=systemd-peer-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemd-peer-bus.js","sourceRoot":"","sources":["../src/systemd-peer-bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CommandResult } from "./update-install.js";
|
|
2
|
+
import { type PeerBus } from "./systemd-peer-bus.js";
|
|
2
3
|
/** Runtime evidence is independent of the definition on disk. Unknown is never stopped. */
|
|
3
4
|
export interface SystemdRuntime {
|
|
4
5
|
active: string;
|
|
@@ -10,6 +11,31 @@ export interface SystemdRuntime {
|
|
|
10
11
|
killMode: string;
|
|
11
12
|
sendSigkill: boolean;
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
+
/**
|
|
15
|
+
* #1804: busctl could not reach the bus at all — no D-Bus user bus (a host without dbus-user-session, where systemctl
|
|
16
|
+
* still reaches the manager through `$XDG_RUNTIME_DIR/systemd/private`, a peer socket busctl cannot use: it always sends
|
|
17
|
+
* Hello(), which that socket answers with "Invalid request descriptor"), or no busctl to run. Only then do the readers
|
|
18
|
+
* turn to the private socket (systemd-peer-bus.ts); any other busctl failure keeps its bus-path meaning.
|
|
19
|
+
*/
|
|
20
|
+
export declare function busUnreachable(result: CommandResult): boolean;
|
|
21
|
+
/** One line for a failed command: how it ended, then the first line it printed. */
|
|
22
|
+
export declare function commandFailure(result: CommandResult): string;
|
|
23
|
+
/** The D-Bus channel for one reader: busctl, or — only when busctl cannot reach a bus — the private socket. */
|
|
24
|
+
export type SystemdChannel = {
|
|
25
|
+
ok: true;
|
|
26
|
+
call: (args: string[]) => CommandResult;
|
|
27
|
+
objectPath: string;
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
reason: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* #1804: load `name` (LoadUnit) over busctl; if busctl cannot reach a bus at all, over the manager's private socket
|
|
34
|
+
* through `peer` (systemdPeerBus), and every later read of this unit goes the same way. Each failure says which:
|
|
35
|
+
* neither reachable, the call refused on a reachable channel, or no private socket offered.
|
|
36
|
+
*/
|
|
37
|
+
export declare function systemdChannel(run: (command: string, args: string[]) => CommandResult, user: boolean, name: string, peer?: PeerBus): SystemdChannel;
|
|
38
|
+
/** `peer`: the manager's private socket, for a host where busctl cannot reach a bus (#1804). */
|
|
39
|
+
export declare function readSystemdRuntime(run: (command: string, args: string[]) => CommandResult, user: boolean, unit: string, peer?: PeerBus): SystemdRuntime | null;
|
|
14
40
|
export declare const systemdStopped: (s: SystemdRuntime | null) => boolean;
|
|
15
41
|
export declare const systemdRunning: (s: SystemdRuntime | null) => boolean;
|
package/dist/systemd-runtime.js
CHANGED
|
@@ -1,8 +1,74 @@
|
|
|
1
|
-
|
|
1
|
+
import { peerUnreachable } from "./systemd-peer-bus.js";
|
|
2
|
+
/**
|
|
3
|
+
* #1804: busctl could not reach the bus at all — no D-Bus user bus (a host without dbus-user-session, where systemctl
|
|
4
|
+
* still reaches the manager through `$XDG_RUNTIME_DIR/systemd/private`, a peer socket busctl cannot use: it always sends
|
|
5
|
+
* Hello(), which that socket answers with "Invalid request descriptor"), or no busctl to run. Only then do the readers
|
|
6
|
+
* turn to the private socket (systemd-peer-bus.ts); any other busctl failure keeps its bus-path meaning.
|
|
7
|
+
*/
|
|
8
|
+
export function busUnreachable(result) {
|
|
9
|
+
if (result.signal !== null)
|
|
10
|
+
return false;
|
|
11
|
+
if (result.status === null)
|
|
12
|
+
return true;
|
|
13
|
+
return result.status !== 0 && /^Failed to connect to bus\b/m.test(result.stderr);
|
|
14
|
+
}
|
|
15
|
+
/** One line for a failed command: how it ended, then the first line it printed. */
|
|
16
|
+
export function commandFailure(result) {
|
|
17
|
+
const said = (result.stderr || result.stdout).trim().split("\n", 1)[0] ?? "";
|
|
18
|
+
return `${result.signal ? `killed by ${result.signal}` : result.status === null ? "did not run" : `exited ${result.status}`}${said ? `: ${said}` : ""}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* #1804: load `name` (LoadUnit) over busctl; if busctl cannot reach a bus at all, over the manager's private socket
|
|
22
|
+
* through `peer` (systemdPeerBus), and every later read of this unit goes the same way. Each failure says which:
|
|
23
|
+
* neither reachable, the call refused on a reachable channel, or no private socket offered.
|
|
24
|
+
*/
|
|
25
|
+
export function systemdChannel(run, user, name, peer) {
|
|
2
26
|
const scope = user ? ["--user"] : [];
|
|
27
|
+
const loadUnit = ["call", "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "LoadUnit", "s", name];
|
|
28
|
+
const viaBusctl = (args) => run("busctl", [...scope, "--json=short", ...args]);
|
|
29
|
+
const objectPath = (r) => {
|
|
30
|
+
if (r.status !== 0 || r.signal !== null)
|
|
31
|
+
return null;
|
|
32
|
+
try {
|
|
33
|
+
const parsed = JSON.parse(r.stdout);
|
|
34
|
+
const path = parsed.type === "o" && Array.isArray(parsed.data) && parsed.data.length === 1 ? parsed.data[0] : null;
|
|
35
|
+
return typeof path === "string" && path.startsWith("/org/freedesktop/systemd1/unit/") ? path : null;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const viaBus = viaBusctl(loadUnit);
|
|
42
|
+
if (!busUnreachable(viaBus)) {
|
|
43
|
+
const path = objectPath(viaBus);
|
|
44
|
+
return path ? { ok: true, call: viaBusctl, objectPath: path } : { ok: false, reason: `busctl could not load ${name} (${commandFailure(viaBus)})` };
|
|
45
|
+
}
|
|
46
|
+
const bus = `the D-Bus ${user ? "user " : ""}bus cannot be reached (busctl ${commandFailure(viaBus)})`;
|
|
47
|
+
if (!peer)
|
|
48
|
+
return { ok: false, reason: `${bus}, and systemd's private socket was not tried` };
|
|
49
|
+
const viaPeer = (args) => peer(user, args);
|
|
50
|
+
const loaded = viaPeer(loadUnit);
|
|
51
|
+
if (peerUnreachable(loaded))
|
|
52
|
+
return { ok: false, reason: `neither busctl nor the systemd${user ? " --user" : ""} manager's private socket can be reached (busctl ${commandFailure(viaBus)}; ${commandFailure(loaded)})` };
|
|
53
|
+
const path = objectPath(loaded);
|
|
54
|
+
return path ? { ok: true, call: viaPeer, objectPath: path } : { ok: false, reason: `${bus}, and systemd could not load ${name} over its private socket (${commandFailure(loaded)})` };
|
|
55
|
+
}
|
|
56
|
+
/** `peer`: the manager's private socket, for a host where busctl cannot reach a bus (#1804). */
|
|
57
|
+
export function readSystemdRuntime(run, user, unit, peer) {
|
|
58
|
+
const name = unit.endsWith(".service") ? unit : `${unit}.service`;
|
|
59
|
+
let channel;
|
|
60
|
+
try {
|
|
61
|
+
channel = systemdChannel(run, user, name, peer);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
if (!channel.ok)
|
|
67
|
+
return null;
|
|
68
|
+
const { call, objectPath } = channel;
|
|
3
69
|
const bus = (args, type) => {
|
|
4
70
|
try {
|
|
5
|
-
const r =
|
|
71
|
+
const r = call(args);
|
|
6
72
|
if (r.status !== 0 || r.signal !== null)
|
|
7
73
|
return null;
|
|
8
74
|
const parsed = JSON.parse(r.stdout);
|
|
@@ -12,11 +78,7 @@ export function readSystemdRuntime(run, user, unit) {
|
|
|
12
78
|
return null;
|
|
13
79
|
}
|
|
14
80
|
};
|
|
15
|
-
const
|
|
16
|
-
const path = bus(["call", "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "LoadUnit", "s", name], "o");
|
|
17
|
-
if (!Array.isArray(path) || path.length !== 1 || typeof path[0] !== "string" || !path[0].startsWith("/org/freedesktop/systemd1/unit/"))
|
|
18
|
-
return null;
|
|
19
|
-
const prop = (iface, property, type) => bus(["get-property", "org.freedesktop.systemd1", path[0], `org.freedesktop.systemd1.${iface}`, property], type);
|
|
81
|
+
const prop = (iface, property, type) => bus(["get-property", "org.freedesktop.systemd1", objectPath, `org.freedesktop.systemd1.${iface}`, property], type);
|
|
20
82
|
const active = prop("Unit", "ActiveState", "s"), sub = prop("Unit", "SubState", "s");
|
|
21
83
|
const job = prop("Unit", "Job", "(uo)");
|
|
22
84
|
const type = prop("Service", "Type", "s"), killMode = prop("Service", "KillMode", "s");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"systemd-runtime.js","sourceRoot":"","sources":["../src/systemd-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"systemd-runtime.js","sourceRoot":"","sources":["../src/systemd-runtime.ts"],"names":[],"mappings":"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"}
|