@legioncodeinc/hive 0.5.1 → 0.6.0
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 +2 -0
- package/dist/cli-commands.d.ts +20 -0
- package/dist/cli-commands.js +93 -2
- package/dist/cli-commands.js.map +1 -1
- package/dist/cli.js +8 -2
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/web/wire.d.ts +2 -2
- package/dist/install/registry.d.ts +6 -0
- package/dist/install/registry.js +68 -1
- package/dist/install/registry.js.map +1 -1
- package/dist/install/state-dir.d.ts +11 -0
- package/dist/install/state-dir.js +40 -0
- package/dist/install/state-dir.js.map +1 -0
- package/dist/service/commands.d.ts +1 -0
- package/dist/service/commands.js +10 -0
- package/dist/service/commands.js.map +1 -1
- package/dist/service/index.d.ts +25 -1
- package/dist/service/index.js +146 -6
- package/dist/service/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -157,8 +157,10 @@ The `hive` binary keeps a deliberately small surface. It's a portal daemon, not
|
|
|
157
157
|
|
|
158
158
|
```bash
|
|
159
159
|
hive start # run the portal daemon on :3853 (the default verb)
|
|
160
|
+
hive stop # stop the portal daemon (service manager or direct SIGTERM)
|
|
160
161
|
hive install-service # install the OS service unit (launchd / systemd / schtasks)
|
|
161
162
|
hive uninstall-service # remove the service unit
|
|
163
|
+
hive uninstall # stop, remove service, registry entry, and hive state dir
|
|
162
164
|
hive register # append Hive to Doctor's daemon registry
|
|
163
165
|
```
|
|
164
166
|
|
package/dist/cli-commands.d.ts
CHANGED
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { type StartHiveOptions } from "./daemon/server.js";
|
|
15
15
|
import { type RegistryUpsertOptions } from "./install/registry.js";
|
|
16
|
+
import { type StateDirFs } from "./install/state-dir.js";
|
|
16
17
|
import { type ServiceModule } from "./service/index.js";
|
|
18
|
+
import { type FleetRootDeps } from "./shared/apiary-root.js";
|
|
17
19
|
import { type EmitDeps } from "./telemetry/emit.js";
|
|
18
20
|
/** A sink for user-facing output lines (defaults to `process.stdout`). */
|
|
19
21
|
export type OutputWriter = (text: string) => void;
|
|
@@ -39,3 +41,21 @@ export interface RegisterCommandDeps {
|
|
|
39
41
|
readonly out?: OutputWriter;
|
|
40
42
|
}
|
|
41
43
|
export declare function runRegisterCommand(deps?: RegisterCommandDeps): Promise<number>;
|
|
44
|
+
/** Injectable deps for the `stop` verb. */
|
|
45
|
+
export interface StopCommandDeps {
|
|
46
|
+
readonly service?: ServiceModule;
|
|
47
|
+
readonly fleetRoot?: FleetRootDeps;
|
|
48
|
+
readonly pidPath?: string;
|
|
49
|
+
readonly readPid?: (path: string) => number | null;
|
|
50
|
+
readonly isPidAlive?: (pid: number) => boolean;
|
|
51
|
+
readonly kill?: (pid: number, signal: NodeJS.Signals) => void;
|
|
52
|
+
readonly out?: OutputWriter;
|
|
53
|
+
}
|
|
54
|
+
export declare function runStopCommand(cliEntryPath: string, deps?: StopCommandDeps): Promise<number>;
|
|
55
|
+
/** Injectable deps for the `uninstall` verb. */
|
|
56
|
+
export interface UninstallCommandDeps extends ServiceCommandDeps {
|
|
57
|
+
readonly fleetRoot?: FleetRootDeps;
|
|
58
|
+
readonly stateDirFs?: StateDirFs;
|
|
59
|
+
readonly stop?: (cliEntryPath: string) => Promise<number>;
|
|
60
|
+
}
|
|
61
|
+
export declare function runUninstallCommand(cliEntryPath: string, deps?: UninstallCommandDeps): Promise<number>;
|
package/dist/cli-commands.js
CHANGED
|
@@ -12,8 +12,11 @@
|
|
|
12
12
|
* A telemetry failure NEVER changes a verb's exit code: emit helpers resolve, never reject.
|
|
13
13
|
*/
|
|
14
14
|
import { startHive } from "./daemon/server.js";
|
|
15
|
-
import { registerHiveWithDoctor } from "./install/registry.js";
|
|
15
|
+
import { deleteHiveFromDoctor, registerHiveWithDoctor, registryContainsHiveEntry } from "./install/registry.js";
|
|
16
|
+
import { hiveStateDirExists, removeHiveStateDir } from "./install/state-dir.js";
|
|
16
17
|
import { createServiceModule } from "./service/index.js";
|
|
18
|
+
import { isPidAlive, readPidFile } from "./lock.js";
|
|
19
|
+
import { resolveHivePidPath } from "./shared/apiary-root.js";
|
|
17
20
|
import { emitInstalled, emitUninstalled, recordStartLifecycle } from "./telemetry/emit.js";
|
|
18
21
|
const defaultOut = (text) => {
|
|
19
22
|
process.stdout.write(text);
|
|
@@ -63,7 +66,9 @@ export async function runUninstallServiceCommand(cliEntryPath, deps = {}) {
|
|
|
63
66
|
const result = await service.uninstall();
|
|
64
67
|
out(`${result.message}\n`);
|
|
65
68
|
await uninstallTelemetry;
|
|
66
|
-
|
|
69
|
+
// M-2 / b-AC-6: the current unit having already been absent is a friendly no-op,
|
|
70
|
+
// not a failure - only a genuine deregister error should flip the exit code.
|
|
71
|
+
return result.ok || result.alreadyAbsent ? 0 : 1;
|
|
67
72
|
}
|
|
68
73
|
export async function runRegisterCommand(deps = {}) {
|
|
69
74
|
const out = deps.out ?? defaultOut;
|
|
@@ -73,4 +78,90 @@ export async function runRegisterCommand(deps = {}) {
|
|
|
73
78
|
: `Registered hive in ${registration.registryPath}\n`);
|
|
74
79
|
return 0;
|
|
75
80
|
}
|
|
81
|
+
function isHiveProcessRunning(deps) {
|
|
82
|
+
const pidPath = deps.pidPath ?? resolveHivePidPath(deps.fleetRoot);
|
|
83
|
+
const pid = (deps.readPid ?? readPidFile)(pidPath);
|
|
84
|
+
return pid !== null && (deps.isPidAlive ?? isPidAlive)(pid);
|
|
85
|
+
}
|
|
86
|
+
export async function runStopCommand(cliEntryPath, deps = {}) {
|
|
87
|
+
const out = deps.out ?? defaultOut;
|
|
88
|
+
const service = deps.service ?? createServiceModule({ execPath: cliEntryPath });
|
|
89
|
+
if (await service.isRegistered()) {
|
|
90
|
+
const result = await service.stop();
|
|
91
|
+
if (!result.ok && !isHiveProcessRunning(deps)) {
|
|
92
|
+
out("hive is not running.\n");
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
out(`${result.message}\n`);
|
|
96
|
+
return result.ok ? 0 : 1;
|
|
97
|
+
}
|
|
98
|
+
if (!isHiveProcessRunning(deps)) {
|
|
99
|
+
out("hive is not running.\n");
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
const pidPath = deps.pidPath ?? resolveHivePidPath(deps.fleetRoot);
|
|
103
|
+
const pid = (deps.readPid ?? readPidFile)(pidPath);
|
|
104
|
+
if (pid === null) {
|
|
105
|
+
out("hive is not running.\n");
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
(deps.kill ?? ((targetPid, signal) => process.kill(targetPid, signal)))(pid, "SIGTERM");
|
|
110
|
+
out(`Sent SIGTERM to hive (pid ${pid}).\n`);
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
out(`Could not stop hive: ${error instanceof Error ? error.message : "unknown error"}.\n`);
|
|
115
|
+
return 1;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function hiveHasInstallArtifacts(cliEntryPath, deps) {
|
|
119
|
+
const service = deps.service ?? createServiceModule({ execPath: cliEntryPath });
|
|
120
|
+
if (await service.isRegistered())
|
|
121
|
+
return true;
|
|
122
|
+
if (registryContainsHiveEntry(deps.registry))
|
|
123
|
+
return true;
|
|
124
|
+
if (hiveStateDirExists(deps.fleetRoot, deps.stateDirFs))
|
|
125
|
+
return true;
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
export async function runUninstallCommand(cliEntryPath, deps = {}) {
|
|
129
|
+
const out = deps.out ?? defaultOut;
|
|
130
|
+
if (!(await hiveHasInstallArtifacts(cliEntryPath, deps))) {
|
|
131
|
+
out("hive is not installed; nothing to remove.\n");
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
const stop = deps.stop ?? ((entryPath) => runStopCommand(entryPath, deps));
|
|
135
|
+
const service = deps.service ?? createServiceModule({ execPath: cliEntryPath });
|
|
136
|
+
const uninstallTelemetry = emitUninstalled(deps.telemetry);
|
|
137
|
+
const stopCode = await stop(cliEntryPath);
|
|
138
|
+
out(stopCode === 0 ? "Stopped hive daemon.\n" : "Stop step reported an issue; continuing uninstall.\n");
|
|
139
|
+
const serviceResult = await service.uninstall();
|
|
140
|
+
out(`${serviceResult.message}\n`);
|
|
141
|
+
const registryResult = deleteHiveFromDoctor(deps.registry);
|
|
142
|
+
out(registryResult.removed
|
|
143
|
+
? `Removed hive from doctor registry (${registryResult.registryPaths.join(", ")}).\n`
|
|
144
|
+
: "No hive registry entry to remove.\n");
|
|
145
|
+
let stateRemoved = false;
|
|
146
|
+
try {
|
|
147
|
+
stateRemoved = removeHiveStateDir(deps.fleetRoot, deps.stateDirFs);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
out(`Could not remove hive state dir: ${error instanceof Error ? error.message : "unknown error"}.\n`);
|
|
151
|
+
await uninstallTelemetry;
|
|
152
|
+
return 1;
|
|
153
|
+
}
|
|
154
|
+
out(stateRemoved ? "Removed hive state dir.\n" : "No hive state dir to remove.\n");
|
|
155
|
+
await uninstallTelemetry;
|
|
156
|
+
// M-2 / b-AC-6: the current unit having already been absent (e.g. the stop step
|
|
157
|
+
// above already boot-ed it out on macOS) is a friendly no-op, not a failure.
|
|
158
|
+
// AC-9: never print the success line on the failure path - a contradictory
|
|
159
|
+
// "hive uninstalled." after a real deregister error hides the failure.
|
|
160
|
+
if (serviceResult.ok || serviceResult.alreadyAbsent) {
|
|
161
|
+
out("hive uninstalled.\n");
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
out("hive uninstall completed with errors: the service unit may still be registered. Fix the error above and re-run 'hive uninstall'.\n");
|
|
165
|
+
return 1;
|
|
166
|
+
}
|
|
76
167
|
//# sourceMappingURL=cli-commands.js.map
|
package/dist/cli-commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-commands.js","sourceRoot":"","sources":["../src/cli-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAyB,MAAM,oBAAoB,CAAC;AACtE,OAAO,
|
|
1
|
+
{"version":3,"file":"cli-commands.js","sourceRoot":"","sources":["../src/cli-commands.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
-
import { runInstallServiceCommand, runRegisterCommand, runStartCommand, runUninstallServiceCommand } from "./cli-commands.js";
|
|
3
|
+
import { runInstallServiceCommand, runRegisterCommand, runStartCommand, runStopCommand, runUninstallCommand, runUninstallServiceCommand } from "./cli-commands.js";
|
|
4
4
|
import { DaemonAlreadyRunningError } from "./errors.js";
|
|
5
5
|
function printUsage() {
|
|
6
|
-
process.stderr.write("Usage: hive <start|install-service|uninstall-service|register>\n");
|
|
6
|
+
process.stderr.write("Usage: hive <start|stop|install-service|uninstall-service|uninstall|register>\n");
|
|
7
7
|
}
|
|
8
8
|
async function run() {
|
|
9
9
|
const command = process.argv[2] ?? "start";
|
|
@@ -13,12 +13,18 @@ async function run() {
|
|
|
13
13
|
case "start":
|
|
14
14
|
process.exitCode = await runStartCommand();
|
|
15
15
|
return;
|
|
16
|
+
case "stop":
|
|
17
|
+
process.exitCode = await runStopCommand(cliEntryPath);
|
|
18
|
+
return;
|
|
16
19
|
case "install-service":
|
|
17
20
|
process.exitCode = await runInstallServiceCommand(cliEntryPath);
|
|
18
21
|
return;
|
|
19
22
|
case "uninstall-service":
|
|
20
23
|
process.exitCode = await runUninstallServiceCommand(cliEntryPath);
|
|
21
24
|
return;
|
|
25
|
+
case "uninstall":
|
|
26
|
+
process.exitCode = await runUninstallCommand(cliEntryPath);
|
|
27
|
+
return;
|
|
22
28
|
case "register":
|
|
23
29
|
process.exitCode = await runRegisterCommand();
|
|
24
30
|
return;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,0BAA0B,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,SAAS,UAAU;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,0BAA0B,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,SAAS,UAAU;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;AAC1G,CAAC;AAED,KAAK,UAAU,GAAG;IAChB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAC3C,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,OAAO;gBACV,OAAO,CAAC,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC;gBAC3C,OAAO;YACT,KAAK,MAAM;gBACT,OAAO,CAAC,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,CAAC;gBACtD,OAAO;YACT,KAAK,iBAAiB;gBACpB,OAAO,CAAC,QAAQ,GAAG,MAAM,wBAAwB,CAAC,YAAY,CAAC,CAAC;gBAChE,OAAO;YACT,KAAK,mBAAmB;gBACtB,OAAO,CAAC,QAAQ,GAAG,MAAM,0BAA0B,CAAC,YAAY,CAAC,CAAC;gBAClE,OAAO;YACT,KAAK,WAAW;gBACd,OAAO,CAAC,QAAQ,GAAG,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;gBAC3D,OAAO;YACT,KAAK,UAAU;gBACb,OAAO,CAAC,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;gBAC9C,OAAO;YACT;gBACE,UAAU,EAAE,CAAC;gBACb,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;QACX,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,yBAAyB,EAAE,CAAC;YAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,GAAG,EAAE,CAAC"}
|
|
@@ -1414,8 +1414,8 @@ export declare const SetupStateSchema: z.ZodObject<{
|
|
|
1414
1414
|
migration: z.ZodOptional<z.ZodObject<{
|
|
1415
1415
|
phase: z.ZodCatch<z.ZodEnum<{
|
|
1416
1416
|
link: "link";
|
|
1417
|
-
backup: "backup";
|
|
1418
1417
|
uninstall: "uninstall";
|
|
1418
|
+
backup: "backup";
|
|
1419
1419
|
done: "done";
|
|
1420
1420
|
rolled_back: "rolled_back";
|
|
1421
1421
|
}>>;
|
|
@@ -1452,8 +1452,8 @@ export declare const SetupMigrateSchema: z.ZodObject<{
|
|
|
1452
1452
|
ok: z.ZodCatch<z.ZodBoolean>;
|
|
1453
1453
|
phase: z.ZodCatch<z.ZodEnum<{
|
|
1454
1454
|
link: "link";
|
|
1455
|
-
backup: "backup";
|
|
1456
1455
|
uninstall: "uninstall";
|
|
1456
|
+
backup: "backup";
|
|
1457
1457
|
done: "done";
|
|
1458
1458
|
rolled_back: "rolled_back";
|
|
1459
1459
|
}>>;
|
|
@@ -32,4 +32,10 @@ export type RegistryDaemonEntry = Record<string, unknown> & {
|
|
|
32
32
|
export declare function createNodeRegistryFs(): RegistryFs;
|
|
33
33
|
export declare function buildHiveRegistryEntry(): RegistryDaemonEntry;
|
|
34
34
|
export declare function registerHiveWithDoctor(options?: RegistryUpsertOptions): RegistryUpsertResult;
|
|
35
|
+
export interface RegistryDeleteResult {
|
|
36
|
+
readonly removed: boolean;
|
|
37
|
+
readonly registryPaths: readonly string[];
|
|
38
|
+
}
|
|
39
|
+
export declare function deleteHiveFromDoctor(options?: RegistryUpsertOptions): RegistryDeleteResult;
|
|
40
|
+
export declare function registryContainsHiveEntry(options?: RegistryUpsertOptions): boolean;
|
|
35
41
|
export { resolveRegistryWritePath } from "../shared/registry-paths.js";
|
package/dist/install/registry.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
|
-
import { resolveHiveRegistryPidPath } from "../shared/apiary-root.js";
|
|
3
|
+
import { resolveFleetRegistryPath, resolveHiveRegistryPidPath } from "../shared/apiary-root.js";
|
|
4
|
+
import { resolveLegacyDoctorRegistryPath } from "../shared/legacy-paths.js";
|
|
4
5
|
import { resolveRegistryWritePath } from "../shared/registry-paths.js";
|
|
5
6
|
// NOTE: there is deliberately NO exported DOCTOR_REGISTRY_PATH constant on the write side.
|
|
6
7
|
// The write target is window-dependent (`resolveRegistryWritePath()` answers differently before
|
|
@@ -113,5 +114,71 @@ export function registerHiveWithDoctor(options = {}) {
|
|
|
113
114
|
updatedExistingEntry: index >= 0
|
|
114
115
|
};
|
|
115
116
|
}
|
|
117
|
+
function registryHasHiveEntry(path, fs) {
|
|
118
|
+
const parsed = readRegistryDocument(path, fs);
|
|
119
|
+
return parsed.daemons.some((entry) => entry["name"] === HIVE_REGISTRY_NAME);
|
|
120
|
+
}
|
|
121
|
+
function deleteHiveEntryAtPath(path, fs) {
|
|
122
|
+
let parsed;
|
|
123
|
+
try {
|
|
124
|
+
parsed = readRegistryDocument(path, fs);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
const code = error.code;
|
|
128
|
+
if (code === "ENOENT")
|
|
129
|
+
return false;
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
const index = parsed.daemons.findIndex((entry) => entry["name"] === HIVE_REGISTRY_NAME);
|
|
133
|
+
if (index < 0)
|
|
134
|
+
return false;
|
|
135
|
+
const nextDaemons = parsed.daemons.filter((_, entryIndex) => entryIndex !== index);
|
|
136
|
+
const nextRoot = { ...parsed.root, daemons: nextDaemons };
|
|
137
|
+
const serialized = `${JSON.stringify(nextRoot, null, 2)}\n`;
|
|
138
|
+
const tempPath = nextTempPath(path);
|
|
139
|
+
fs.mkdirp(dirname(path));
|
|
140
|
+
fs.writeFile(tempPath, serialized);
|
|
141
|
+
try {
|
|
142
|
+
fs.rename(tempPath, path);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
fs.removeFile(tempPath);
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
export function deleteHiveFromDoctor(options = {}) {
|
|
151
|
+
const fs = options.fs ?? createNodeRegistryFs();
|
|
152
|
+
const explicitPath = options.registryPath;
|
|
153
|
+
const candidatePaths = explicitPath !== undefined
|
|
154
|
+
? [explicitPath]
|
|
155
|
+
: [resolveRegistryWritePath(), resolveFleetRegistryPath(), resolveLegacyDoctorRegistryPath()];
|
|
156
|
+
const registryPaths = [];
|
|
157
|
+
for (const path of [...new Set(candidatePaths)]) {
|
|
158
|
+
if (deleteHiveEntryAtPath(path, fs))
|
|
159
|
+
registryPaths.push(path);
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
removed: registryPaths.length > 0,
|
|
163
|
+
registryPaths
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function registryContainsHiveEntry(options = {}) {
|
|
167
|
+
const fs = options.fs ?? createNodeRegistryFs();
|
|
168
|
+
const explicitPath = options.registryPath;
|
|
169
|
+
const candidatePaths = explicitPath !== undefined
|
|
170
|
+
? [explicitPath]
|
|
171
|
+
: [resolveRegistryWritePath(), resolveFleetRegistryPath(), resolveLegacyDoctorRegistryPath()];
|
|
172
|
+
for (const path of [...new Set(candidatePaths)]) {
|
|
173
|
+
try {
|
|
174
|
+
if (registryHasHiveEntry(path, fs))
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Unreadable registry files are treated as absent for uninstall no-op detection.
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
116
183
|
export { resolveRegistryWritePath } from "../shared/registry-paths.js";
|
|
117
184
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/install/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/install/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type FleetRootDeps } from "../shared/apiary-root.js";
|
|
2
|
+
export interface StateDirFs {
|
|
3
|
+
exists(path: string): boolean;
|
|
4
|
+
lstat(path: string): {
|
|
5
|
+
readonly isSymbolicLink: () => boolean;
|
|
6
|
+
};
|
|
7
|
+
removeDir(path: string): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function createNodeStateDirFs(): StateDirFs;
|
|
10
|
+
export declare function removeHiveStateDir(deps?: FleetRootDeps, fs?: StateDirFs): boolean;
|
|
11
|
+
export declare function hiveStateDirExists(deps?: FleetRootDeps, fs?: StateDirFs): boolean;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { existsSync, lstatSync, rmSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
3
|
+
import { resolveFleetRoot, resolveHiveStateDir } from "../shared/apiary-root.js";
|
|
4
|
+
export function createNodeStateDirFs() {
|
|
5
|
+
return {
|
|
6
|
+
exists(path) {
|
|
7
|
+
return existsSync(path);
|
|
8
|
+
},
|
|
9
|
+
lstat(path) {
|
|
10
|
+
return lstatSync(path);
|
|
11
|
+
},
|
|
12
|
+
removeDir(path) {
|
|
13
|
+
rmSync(path, { recursive: true, force: true });
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function isPathWithinRoot(targetPath, rootPath) {
|
|
18
|
+
const resolvedTarget = resolve(targetPath);
|
|
19
|
+
const resolvedRoot = resolve(rootPath);
|
|
20
|
+
const rel = relative(resolvedRoot, resolvedTarget);
|
|
21
|
+
return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
22
|
+
}
|
|
23
|
+
export function removeHiveStateDir(deps = {}, fs = createNodeStateDirFs()) {
|
|
24
|
+
const fleetRoot = resolveFleetRoot(deps);
|
|
25
|
+
const stateDir = resolveHiveStateDir(deps);
|
|
26
|
+
if (!isPathWithinRoot(stateDir, fleetRoot)) {
|
|
27
|
+
throw new Error(`Refusing to remove hive state dir outside the fleet root: ${stateDir}`);
|
|
28
|
+
}
|
|
29
|
+
if (!fs.exists(stateDir))
|
|
30
|
+
return false;
|
|
31
|
+
if (fs.lstat(stateDir).isSymbolicLink()) {
|
|
32
|
+
throw new Error(`Refusing to remove hive state dir because it is a symlink: ${stateDir}`);
|
|
33
|
+
}
|
|
34
|
+
fs.removeDir(stateDir);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
export function hiveStateDirExists(deps = {}, fs = createNodeStateDirFs()) {
|
|
38
|
+
return fs.exists(resolveHiveStateDir(deps));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=state-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-dir.js","sourceRoot":"","sources":["../../src/install/state-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAsB,MAAM,0BAA0B,CAAC;AAQrG,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,MAAM,CAAC,IAAY;YACjB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,IAAY;YAChB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,SAAS,CAAC,IAAY;YACpB,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB,EAAE,QAAgB;IAC5D,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IACnD,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAsB,EAAE,EAAE,KAAiB,oBAAoB,EAAE;IAClG,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,6DAA6D,QAAQ,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,8DAA8D,QAAQ,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAsB,EAAE,EAAE,KAAiB,oBAAoB,EAAE;IAClG,OAAO,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -6,6 +6,7 @@ export interface ServiceCommand {
|
|
|
6
6
|
export declare function launchdDomainTarget(uid: number): string;
|
|
7
7
|
export declare function launchdServiceTarget(plan: ServicePlan, uid: number): string;
|
|
8
8
|
export declare function installCommands(plan: ServicePlan, uid: number): readonly ServiceCommand[];
|
|
9
|
+
export declare function stopCommands(plan: ServicePlan, uid: number): readonly ServiceCommand[];
|
|
9
10
|
export declare function uninstallCommands(plan: ServicePlan, uid: number): readonly ServiceCommand[];
|
|
10
11
|
/**
|
|
11
12
|
* The argv to deregister the PRE-decision-#32 unit names (`thehive` / `thehive.service`).
|
package/dist/service/commands.js
CHANGED
|
@@ -21,6 +21,16 @@ export function installCommands(plan, uid) {
|
|
|
21
21
|
];
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
export function stopCommands(plan, uid) {
|
|
25
|
+
switch (plan.manager) {
|
|
26
|
+
case "launchd":
|
|
27
|
+
return [{ command: "launchctl", args: ["bootout", launchdServiceTarget(plan, uid)] }];
|
|
28
|
+
case "systemd":
|
|
29
|
+
return [{ command: "systemctl", args: ["--user", "stop", SYSTEMD_UNIT_NAME] }];
|
|
30
|
+
case "schtasks":
|
|
31
|
+
return [{ command: "schtasks", args: ["/End", "/TN", WINDOWS_TASK_NAME] }];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
24
34
|
export function uninstallCommands(plan, uid) {
|
|
25
35
|
switch (plan.manager) {
|
|
26
36
|
case "launchd":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/service/commands.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/service/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/service/index.d.ts
CHANGED
|
@@ -15,14 +15,38 @@ export interface ServiceFs {
|
|
|
15
15
|
mkdirp(path: string): void;
|
|
16
16
|
writeFile(path: string, content: string): void;
|
|
17
17
|
removeFile(path: string): void;
|
|
18
|
+
fileExists(path: string): boolean;
|
|
18
19
|
}
|
|
19
20
|
export interface ServiceResult {
|
|
20
21
|
readonly ok: boolean;
|
|
21
22
|
readonly message: string;
|
|
22
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* The outcome of {@link ServiceModule.uninstall}, additionally classified so a
|
|
26
|
+
* caller can tell a genuine removal failure from the current unit simply
|
|
27
|
+
* having been absent already (M-2 / PRD-003b AC-9, b-AC-6): on macOS the
|
|
28
|
+
* `uninstall` verb runs `stop` (launchd `bootout`) before `service.uninstall()`
|
|
29
|
+
* issues its own `bootout` of the same unit, so the second call always finds
|
|
30
|
+
* "No such process" after a fully successful stop. A boot-resurrecting unit
|
|
31
|
+
* left behind by a swallowed "it was probably already gone" error is exactly
|
|
32
|
+
* the failure mode this classification exists to catch, so `alreadyAbsent`
|
|
33
|
+
* stays `false` for anything that does not match a known not-found signal.
|
|
34
|
+
*/
|
|
35
|
+
export interface ServiceUninstallResult extends ServiceResult {
|
|
36
|
+
/**
|
|
37
|
+
* True when the manager reported the current unit was not registered/found
|
|
38
|
+
* rather than a real error (permission denied, manager unreachable, etc.).
|
|
39
|
+
* A true `alreadyAbsent` is a friendly no-op; `ok` stays false either way
|
|
40
|
+
* since nothing was actually removed by THIS call - callers should treat
|
|
41
|
+
* `alreadyAbsent === true` the same as `ok === true` for exit-code purposes.
|
|
42
|
+
*/
|
|
43
|
+
readonly alreadyAbsent: boolean;
|
|
44
|
+
}
|
|
23
45
|
export interface ServiceModule {
|
|
24
46
|
install(): Promise<ServiceResult>;
|
|
25
|
-
|
|
47
|
+
stop(): Promise<ServiceResult>;
|
|
48
|
+
uninstall(): Promise<ServiceUninstallResult>;
|
|
49
|
+
isRegistered(): Promise<boolean>;
|
|
26
50
|
}
|
|
27
51
|
export interface ServiceModuleDeps {
|
|
28
52
|
readonly execPath: string;
|
package/dist/service/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
|
-
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { dirname } from "node:path";
|
|
4
4
|
import { resolveStagedWindowsTaskPath } from "../shared/apiary-root.js";
|
|
5
5
|
import { migrateHiveState } from "../shared/state-migration.js";
|
|
6
|
-
import { installCommands, legacyUninstallCommands, uninstallCommands } from "./commands.js";
|
|
7
|
-
import { legacyUnitPath, resolveServiceContext, resolveServicePlan } from "./platform.js";
|
|
6
|
+
import { installCommands, legacyUninstallCommands, stopCommands, uninstallCommands } from "./commands.js";
|
|
7
|
+
import { legacyUnitPath, LEGACY_WINDOWS_TASK_NAME, resolveServiceContext, resolveServicePlan, WINDOWS_TASK_NAME } from "./platform.js";
|
|
8
8
|
import { renderUnit } from "./templates.js";
|
|
9
9
|
const SERVICE_COMMAND_TIMEOUT_MS = 15_000;
|
|
10
10
|
export function createExecFileRunner() {
|
|
@@ -40,6 +40,9 @@ export function createNodeServiceFs() {
|
|
|
40
40
|
},
|
|
41
41
|
removeFile(path) {
|
|
42
42
|
rmSync(path, { force: true });
|
|
43
|
+
},
|
|
44
|
+
fileExists(path) {
|
|
45
|
+
return existsSync(path);
|
|
43
46
|
}
|
|
44
47
|
};
|
|
45
48
|
}
|
|
@@ -67,13 +70,69 @@ function scopePhrase(plan) {
|
|
|
67
70
|
}
|
|
68
71
|
async function runAll(runner, commands) {
|
|
69
72
|
let firstFailure = null;
|
|
73
|
+
let firstFailureResult = null;
|
|
70
74
|
for (const command of commands) {
|
|
71
75
|
const result = await runner.run(command.command, command.args, { timeoutMs: SERVICE_COMMAND_TIMEOUT_MS });
|
|
72
76
|
if (!result.ok && firstFailure === null) {
|
|
73
77
|
firstFailure = command;
|
|
78
|
+
firstFailureResult = result;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return { allOk: firstFailure === null, firstFailure, firstFailureResult };
|
|
82
|
+
}
|
|
83
|
+
/** Cap how much of a command's own output is ever echoed back in a result message. */
|
|
84
|
+
const MAX_FAILURE_DETAIL_CHARS = 200;
|
|
85
|
+
function lastNonEmptyLine(text) {
|
|
86
|
+
const lines = text
|
|
87
|
+
.split(/\r?\n/)
|
|
88
|
+
.map((line) => line.trim())
|
|
89
|
+
.filter((line) => line !== "");
|
|
90
|
+
return lines.length > 0 ? (lines[lines.length - 1] ?? null) : null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Reduce a failed {@link CommandResult} to one short, secret-free line worth
|
|
94
|
+
* surfacing to the operator (e.g. "No such process", "Access is denied.").
|
|
95
|
+
* Prefers the runner's own `detail` (a spawn-error message); otherwise falls
|
|
96
|
+
* back to the last non-empty line of stderr, then stdout, since launchctl/
|
|
97
|
+
* systemctl/schtasks all print their real error there. A genuine failure must
|
|
98
|
+
* surface the underlying error rather than a generic "something failed" -
|
|
99
|
+
* that is what lets an operator tell a real problem from a no-op.
|
|
100
|
+
*/
|
|
101
|
+
function describeFailure(result) {
|
|
102
|
+
if (result === null)
|
|
103
|
+
return "unknown error";
|
|
104
|
+
const candidate = result.detail ?? lastNonEmptyLine(result.stderr) ?? lastNonEmptyLine(result.stdout) ?? "unknown error";
|
|
105
|
+
return candidate.length > MAX_FAILURE_DETAIL_CHARS
|
|
106
|
+
? `${candidate.slice(0, MAX_FAILURE_DETAIL_CHARS)}...`
|
|
107
|
+
: candidate;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* True when a failed stop/uninstall command's result indicates the unit was
|
|
111
|
+
* already absent (not currently registered/running) rather than a genuine
|
|
112
|
+
* failure. Each service manager reports "not found" differently; launchd's
|
|
113
|
+
* `ESRCH`-derived exit code (3) is locale-independent so it is checked
|
|
114
|
+
* directly. Every manager additionally falls back to a broad, case-insensitive
|
|
115
|
+
* text match over stdout/stderr/detail. Anything that does not match is
|
|
116
|
+
* conservatively treated as a GENUINE failure (never silently swallowed) -
|
|
117
|
+
* this is the classification M-2 / AC-9 / b-AC-6 depend on.
|
|
118
|
+
*/
|
|
119
|
+
function isAlreadyAbsentFailure(manager, result) {
|
|
120
|
+
if (result === null)
|
|
121
|
+
return false;
|
|
122
|
+
const text = `${result.detail ?? ""} ${result.stderr} ${result.stdout}`.toLowerCase();
|
|
123
|
+
const genericAbsent = /does not exist|cannot find|no such process|not[- ]loaded|could not find|not found/;
|
|
124
|
+
switch (manager) {
|
|
125
|
+
case "launchd":
|
|
126
|
+
return result.code === 3 || genericAbsent.test(text);
|
|
127
|
+
case "systemd":
|
|
128
|
+
return genericAbsent.test(text);
|
|
129
|
+
case "schtasks":
|
|
130
|
+
return genericAbsent.test(text);
|
|
131
|
+
default: {
|
|
132
|
+
const unreachable = manager;
|
|
133
|
+
return unreachable;
|
|
74
134
|
}
|
|
75
135
|
}
|
|
76
|
-
return { allOk: firstFailure === null, firstFailure };
|
|
77
136
|
}
|
|
78
137
|
function withResolvedUnitPath(plan) {
|
|
79
138
|
if (plan.manager !== "schtasks" || plan.unitPath !== "")
|
|
@@ -95,7 +154,32 @@ export function createServiceModule(deps) {
|
|
|
95
154
|
function plan() {
|
|
96
155
|
return resolveServicePlan(environment);
|
|
97
156
|
}
|
|
157
|
+
async function isRegisteredForPlan(resolvedPlan) {
|
|
158
|
+
if (resolvedPlan.manager === "schtasks") {
|
|
159
|
+
const current = await runner.run("schtasks", ["/Query", "/TN", WINDOWS_TASK_NAME], {
|
|
160
|
+
timeoutMs: SERVICE_COMMAND_TIMEOUT_MS
|
|
161
|
+
});
|
|
162
|
+
if (current.ok)
|
|
163
|
+
return true;
|
|
164
|
+
const legacy = await runner.run("schtasks", ["/Query", "/TN", LEGACY_WINDOWS_TASK_NAME], {
|
|
165
|
+
timeoutMs: SERVICE_COMMAND_TIMEOUT_MS
|
|
166
|
+
});
|
|
167
|
+
return legacy.ok;
|
|
168
|
+
}
|
|
169
|
+
if (resolvedPlan.unitPath !== "" && fs.fileExists(resolvedPlan.unitPath))
|
|
170
|
+
return true;
|
|
171
|
+
const legacyPath = legacyUnitPath(resolvedPlan);
|
|
172
|
+
return legacyPath !== "" && fs.fileExists(legacyPath);
|
|
173
|
+
}
|
|
98
174
|
return {
|
|
175
|
+
async isRegistered() {
|
|
176
|
+
try {
|
|
177
|
+
return await isRegisteredForPlan(withResolvedUnitPath(plan()));
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
},
|
|
99
183
|
async install() {
|
|
100
184
|
let resolvedPlan;
|
|
101
185
|
try {
|
|
@@ -146,6 +230,39 @@ export function createServiceModule(deps) {
|
|
|
146
230
|
message: `hive registered as a ${scopePhrase(resolvedPlan)} service and started. It will restart on crash and start on boot/login.`
|
|
147
231
|
};
|
|
148
232
|
},
|
|
233
|
+
async stop() {
|
|
234
|
+
let resolvedPlan;
|
|
235
|
+
try {
|
|
236
|
+
resolvedPlan = withResolvedUnitPath(plan());
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
return {
|
|
240
|
+
ok: false,
|
|
241
|
+
message: `Could not stop hive service: ${error instanceof Error ? error.message : "unknown error"}.`
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
const { allOk, firstFailure, firstFailureResult } = await runAll(runner, stopCommands(resolvedPlan, uid));
|
|
245
|
+
if (!allOk) {
|
|
246
|
+
// M-2 posture applied to stop too: a manager reporting "already not running/
|
|
247
|
+
// loaded" (e.g. a repeat `hive stop`, or launchd having nothing left to boot
|
|
248
|
+
// out) is a friendly no-op, not a failure - there is nothing left to stop
|
|
249
|
+
// either way. A genuine failure still fails honestly with the real detail.
|
|
250
|
+
if (isAlreadyAbsentFailure(resolvedPlan.manager, firstFailureResult)) {
|
|
251
|
+
return {
|
|
252
|
+
ok: true,
|
|
253
|
+
message: `hive service was already stopped (${scopePhrase(resolvedPlan)}).`
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
ok: false,
|
|
258
|
+
message: `A service-manager stop command (${firstFailure?.command ?? "unknown"}) reported an error: ${describeFailure(firstFailureResult)}.`
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
ok: true,
|
|
263
|
+
message: `hive service stopped (${scopePhrase(resolvedPlan)}).`
|
|
264
|
+
};
|
|
265
|
+
},
|
|
149
266
|
async uninstall() {
|
|
150
267
|
let resolvedPlan;
|
|
151
268
|
try {
|
|
@@ -154,25 +271,48 @@ export function createServiceModule(deps) {
|
|
|
154
271
|
catch (error) {
|
|
155
272
|
return {
|
|
156
273
|
ok: false,
|
|
274
|
+
alreadyAbsent: false,
|
|
157
275
|
message: `Could not unregister hive service: ${error instanceof Error ? error.message : "unknown error"}.`
|
|
158
276
|
};
|
|
159
277
|
}
|
|
160
|
-
|
|
278
|
+
// Legacy deregister is best-effort (same posture as install()): it is EXPECTED to fail
|
|
279
|
+
// when no pre-decision-#32 unit exists, so it must never fail the uninstall verdict.
|
|
280
|
+
// Only a current-unit deregister failure may flip `ok` to false.
|
|
281
|
+
await runAll(runner, legacyUninstallCommands(resolvedPlan, uid));
|
|
282
|
+
const { allOk, firstFailure, firstFailureResult } = await runAll(runner, uninstallCommands(resolvedPlan, uid));
|
|
161
283
|
try {
|
|
162
284
|
if (resolvedPlan.unitPath !== "")
|
|
163
285
|
fs.removeFile(resolvedPlan.unitPath);
|
|
286
|
+
const legacyPath = legacyUnitPath(resolvedPlan);
|
|
287
|
+
if (legacyPath !== "")
|
|
288
|
+
fs.removeFile(legacyPath);
|
|
164
289
|
}
|
|
165
290
|
catch {
|
|
166
291
|
// A stale unit file should not block uninstall feedback.
|
|
167
292
|
}
|
|
168
293
|
if (!allOk) {
|
|
294
|
+
// M-2: on macOS, `uninstall` runs stop (launchd `bootout`) before this current-unit
|
|
295
|
+
// `bootout`, so the unit is routinely already gone by the time this call runs - that
|
|
296
|
+
// is a friendly no-op (b-AC-6), not a failure, and must be classified as such rather
|
|
297
|
+
// than flipping the whole verb to exit 1 despite complete success (AC-9). A GENUINE
|
|
298
|
+
// failure (permission denied, manager unreachable, etc.) still fails honestly with
|
|
299
|
+
// the underlying error surfaced.
|
|
300
|
+
if (isAlreadyAbsentFailure(resolvedPlan.manager, firstFailureResult)) {
|
|
301
|
+
return {
|
|
302
|
+
ok: false,
|
|
303
|
+
alreadyAbsent: true,
|
|
304
|
+
message: `hive ${resolvedPlan.manager} unit was already absent (nothing to remove).`
|
|
305
|
+
};
|
|
306
|
+
}
|
|
169
307
|
return {
|
|
170
308
|
ok: false,
|
|
171
|
-
|
|
309
|
+
alreadyAbsent: false,
|
|
310
|
+
message: `Removed hive unit file; a deregister command (${firstFailure?.command ?? "unknown"}) reported an error: ${describeFailure(firstFailureResult)}.`
|
|
172
311
|
};
|
|
173
312
|
}
|
|
174
313
|
return {
|
|
175
314
|
ok: true,
|
|
315
|
+
alreadyAbsent: false,
|
|
176
316
|
message: `hive service unregistered (${scopePhrase(resolvedPlan)}). It will not start on next boot/login.`
|
|
177
317
|
};
|
|
178
318
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"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"}
|