fix: harden onboarding for non-systemd environments

This commit is contained in:
Peter Steinberger
2026-01-09 22:16:17 +01:00
parent 402c35b91c
commit 55e830b009
11 changed files with 409 additions and 170 deletions

View File

@@ -0,0 +1,35 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const execFileMock = vi.hoisted(() => vi.fn());
vi.mock("node:child_process", () => ({
execFile: execFileMock,
}));
import { isSystemdUserServiceAvailable } from "./systemd.js";
describe("systemd availability", () => {
beforeEach(() => {
execFileMock.mockReset();
});
it("returns true when systemctl --user succeeds", async () => {
execFileMock.mockImplementation((_cmd, _args, _opts, cb) => {
cb(null, "", "");
});
await expect(isSystemdUserServiceAvailable()).resolves.toBe(true);
});
it("returns false when systemd user bus is unavailable", async () => {
execFileMock.mockImplementation((_cmd, _args, _opts, cb) => {
const err = new Error("Failed to connect to bus") as Error & {
stderr?: string;
code?: number;
};
err.stderr = "Failed to connect to bus";
err.code = 1;
cb(err, "", "");
});
await expect(isSystemdUserServiceAvailable()).resolves.toBe(false);
});
});

View File

@@ -337,6 +337,19 @@ async function execSystemctl(
}
}
export async function isSystemdUserServiceAvailable(): Promise<boolean> {
const res = await execSystemctl(["--user", "status"]);
if (res.code === 0) return true;
const detail = `${res.stderr} ${res.stdout}`.toLowerCase();
if (!detail) return false;
if (detail.includes("not found")) return false;
if (detail.includes("failed to connect")) return false;
if (detail.includes("not been booted")) return false;
if (detail.includes("no such file or directory")) return false;
if (detail.includes("not supported")) return false;
return false;
}
async function assertSystemdAvailable() {
const res = await execSystemctl(["--user", "status"]);
if (res.code === 0) return;