fix(daemon): preserve explicit systemd unit during refresh · openclaw/openclaw@3fea219
TurboTheTurt
·
2026-05-28
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -685,6 +685,33 @@ describe("buildServiceEnvironment", () => {
|
685 | 685 | } |
686 | 686 | }); |
687 | 687 | |
| 688 | +it("preserves explicit systemd unit overrides", () => { |
| 689 | +const env = buildServiceEnvironment({ |
| 690 | +env: { |
| 691 | +HOME: "/home/user", |
| 692 | +OPENCLAW_PROFILE: "work", |
| 693 | +OPENCLAW_SYSTEMD_UNIT: "openclaw-gateway-maintenance", |
| 694 | +}, |
| 695 | +port: 18789, |
| 696 | +platform: "linux", |
| 697 | +}); |
| 698 | + |
| 699 | +expect(env.OPENCLAW_SYSTEMD_UNIT).toBe("openclaw-gateway-maintenance.service"); |
| 700 | +}); |
| 701 | + |
| 702 | +it("preserves explicit systemd unit overrides with service suffix", () => { |
| 703 | +const env = buildServiceEnvironment({ |
| 704 | +env: { |
| 705 | +HOME: "/home/user", |
| 706 | +OPENCLAW_SYSTEMD_UNIT: "openclaw-gateway-maintenance.service", |
| 707 | +}, |
| 708 | +port: 18789, |
| 709 | +platform: "linux", |
| 710 | +}); |
| 711 | + |
| 712 | +expect(env.OPENCLAW_SYSTEMD_UNIT).toBe("openclaw-gateway-maintenance.service"); |
| 713 | +}); |
| 714 | + |
688 | 715 | it("sets a profile-specific launchd marker for macOS gateway services", () => { |
689 | 716 | const env = buildServiceEnvironment({ |
690 | 717 | env: { HOME: "/Users/user", OPENCLAW_PROFILE: "work" }, |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -391,6 +391,14 @@ export function buildMinimalServicePath(options: BuildServicePathOptions = {}):
|
391 | 391 | return getMinimalServicePathPartsFromEnv({ ...options, env }).join(path.posix.delimiter); |
392 | 392 | } |
393 | 393 | |
| 394 | +function resolveGatewaySystemdUnitEnv(env: Record<string, string | undefined>): string { |
| 395 | +const override = normalizeOptionalString(env.OPENCLAW_SYSTEMD_UNIT); |
| 396 | +if (override) { |
| 397 | +return override.endsWith(".service") ? override : `${override}.service`; |
| 398 | +} |
| 399 | +return `${resolveGatewaySystemdServiceName(env.OPENCLAW_PROFILE)}.service`; |
| 400 | +} |
| 401 | + |
394 | 402 | export function buildServiceEnvironment(params: { |
395 | 403 | env: Record<string, string | undefined>; |
396 | 404 | port: number; |
@@ -411,7 +419,7 @@ export function buildServiceEnvironment(params: {
|
411 | 419 | const wrapperPath = normalizeOptionalString(env.OPENCLAW_WRAPPER); |
412 | 420 | const resolvedLaunchdLabel = |
413 | 421 | launchdLabel || (platform === "darwin" ? resolveGatewayLaunchAgentLabel(profile) : undefined); |
414 | | -const systemdUnit = `${resolveGatewaySystemdServiceName(profile)}.service`; |
| 422 | +const systemdUnit = resolveGatewaySystemdUnitEnv(env); |
415 | 423 | return { |
416 | 424 | ...buildCommonServiceEnvironment(env, sharedEnv), |
417 | 425 | OPENCLAW_PROFILE: profile, |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -112,6 +112,32 @@ describe("readGatewayServiceState", () => {
|
112 | 112 | expect(state.running).toBe(true); |
113 | 113 | expect(state.env.OPENCLAW_GATEWAY_PORT).toBe("18789"); |
114 | 114 | }); |
| 115 | + |
| 116 | +it("keeps the caller-selected service identity when merging persisted env", async () => { |
| 117 | +const readRuntime = vi.fn(async () => ({ status: "running" })); |
| 118 | +const service = createService({ |
| 119 | +isLoaded: vi.fn(async () => true), |
| 120 | +readCommand: vi.fn(async () => ({ |
| 121 | +programArguments: ["openclaw", "gateway", "run"], |
| 122 | +environment: { |
| 123 | +OPENCLAW_GATEWAY_PORT: "18789", |
| 124 | +OPENCLAW_SYSTEMD_UNIT: "openclaw-gateway.service", |
| 125 | +}, |
| 126 | +})), |
| 127 | + readRuntime, |
| 128 | +}); |
| 129 | + |
| 130 | +const state = await readGatewayServiceState(service, { |
| 131 | +env: { OPENCLAW_SYSTEMD_UNIT: "openclaw-gateway-maintenance.service" }, |
| 132 | +}); |
| 133 | + |
| 134 | +expect(state.env.OPENCLAW_SYSTEMD_UNIT).toBe("openclaw-gateway-maintenance.service"); |
| 135 | +expect(readRuntime).toHaveBeenCalledWith( |
| 136 | +expect.objectContaining({ |
| 137 | +OPENCLAW_SYSTEMD_UNIT: "openclaw-gateway-maintenance.service", |
| 138 | +}), |
| 139 | +); |
| 140 | +}); |
115 | 141 | }); |
116 | 142 | |
117 | 143 | describe("startGatewayService", () => { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -91,10 +91,21 @@ function mergeGatewayServiceEnv(
|
91 | 91 | if (!command?.environment) { |
92 | 92 | return baseEnv; |
93 | 93 | } |
94 | | -return { |
| 94 | +const merged = { |
95 | 95 | ...baseEnv, |
96 | 96 | ...command.environment, |
97 | 97 | }; |
| 98 | +for (const key of [ |
| 99 | +"OPENCLAW_LAUNCHD_LABEL", |
| 100 | +"OPENCLAW_SYSTEMD_UNIT", |
| 101 | +"OPENCLAW_WINDOWS_TASK_NAME", |
| 102 | +]) { |
| 103 | +const value = baseEnv[key]?.trim(); |
| 104 | +if (value) { |
| 105 | +merged[key] = value; |
| 106 | +} |
| 107 | +} |
| 108 | +return merged; |
98 | 109 | } |
99 | 110 | |
100 | 111 | const TEMP_PROGRAM_ROOTS = [os.tmpdir(), "/tmp", "/private/tmp", "/var/tmp"].map((entry) => |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。