@djolex999/vir-cli 0.3.1 → 0.3.2
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/dist/daemon/index.js +14 -7
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/systemd.js +53 -12
- package/dist/daemon/systemd.js.map +1 -1
- package/package.json +1 -1
package/dist/daemon/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { realpathSync } from "node:fs";
|
|
|
2
2
|
import * as cron from "./cron.js";
|
|
3
3
|
import * as launchd from "./launchd.js";
|
|
4
4
|
import * as systemd from "./systemd.js";
|
|
5
|
-
import { SystemdNotAvailableError } from "./systemd.js";
|
|
5
|
+
import { SystemdNotAvailableError, SystemdUserBusUnavailableError, } from "./systemd.js";
|
|
6
6
|
const NONE = {
|
|
7
7
|
installed: false,
|
|
8
8
|
active: false,
|
|
@@ -35,23 +35,30 @@ export async function install(cfg) {
|
|
|
35
35
|
}
|
|
36
36
|
if (platform === "linux") {
|
|
37
37
|
const opts = { ...resolvePaths(), cadenceHours: cfg.cadenceHours };
|
|
38
|
-
// systemd preferred
|
|
39
|
-
//
|
|
38
|
+
// systemd preferred. Fall back to cron when systemctl is missing
|
|
39
|
+
// (SystemdNotAvailableError) OR present-but-no-user-bus
|
|
40
|
+
// (SystemdUserBusUnavailableError — common on WSL/containers). Any other
|
|
41
|
+
// error is a real misconfig and propagates.
|
|
40
42
|
try {
|
|
41
43
|
systemd.install(opts);
|
|
42
44
|
return;
|
|
43
45
|
}
|
|
44
46
|
catch (err) {
|
|
45
|
-
if (!(err instanceof SystemdNotAvailableError)
|
|
47
|
+
if (!(err instanceof SystemdNotAvailableError) &&
|
|
48
|
+
!(err instanceof SystemdUserBusUnavailableError)) {
|
|
46
49
|
throw err;
|
|
50
|
+
}
|
|
47
51
|
}
|
|
48
52
|
if (cron.isCronAvailable()) {
|
|
49
53
|
cron.install(opts);
|
|
50
54
|
return;
|
|
51
55
|
}
|
|
52
|
-
throw new Error("
|
|
53
|
-
"
|
|
54
|
-
"
|
|
56
|
+
throw new Error("No daemon backend available.\n" +
|
|
57
|
+
" - systemd user bus not reachable (common on WSL, containers)\n" +
|
|
58
|
+
" - cron command not found\n" +
|
|
59
|
+
" Install one to use vir schedule:\n" +
|
|
60
|
+
" Ubuntu/Debian/WSL: sudo apt install cron\n" +
|
|
61
|
+
" Arch: sudo pacman -S cronie");
|
|
55
62
|
}
|
|
56
63
|
throwUnsupported(platform);
|
|
57
64
|
}
|
package/dist/daemon/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,EACL,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,cAAc,CAAC;AActB,MAAM,IAAI,GAAiB;IACzB,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,MAAM;IACd,YAAY,EAAE,IAAI;IAClB,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,yDAAyD;AACzD,SAAS,YAAY;IACnB,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,mEAAmE,CACzF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;QAC7C,OAAO,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,GAAG,YAAY,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;QACnE,iEAAiE;QACjE,wDAAwD;QACxD,yEAAyE;QACzE,4CAA4C;QAC5C,IAAI,CAAC;YACH,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IACE,CAAC,CAAC,GAAG,YAAY,wBAAwB,CAAC;gBAC1C,CAAC,CAAC,GAAG,YAAY,8BAA8B,CAAC,EAChD,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,KAAK,CACb,gCAAgC;YAC9B,kEAAkE;YAClE,8BAA8B;YAC9B,sCAAsC;YACtC,gDAAgD;YAChD,iCAAiC,CACpC,CAAC;IACJ,CAAC;IACD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,cAAc,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,mEAAmE;QACnE,8DAA8D;QAC9D,IAAI,OAAO,CAAC,kBAAkB,EAAE;YAAE,OAAO,CAAC,SAAS,EAAE,CAAC;QACtD,IAAI,IAAI,CAAC,eAAe,EAAE;YAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,EAAE,CAAC,SAAS;SACzB,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,SAAS;gBAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACtD,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,SAAS;gBAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,yEAAyE;IACzE,qCAAqC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/daemon/systemd.js
CHANGED
|
@@ -10,6 +10,24 @@ export class SystemdNotAvailableError extends Error {
|
|
|
10
10
|
this.name = "SystemdNotAvailableError";
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
+
// Thrown when systemctl is on PATH but the user bus/manager is unreachable —
|
|
14
|
+
// the classic WSL/container case. Distinct from SystemdNotAvailableError so the
|
|
15
|
+
// router can fall back to cron for both. install() probes for this BEFORE
|
|
16
|
+
// writing any unit files.
|
|
17
|
+
export class SystemdUserBusUnavailableError extends Error {
|
|
18
|
+
constructor() {
|
|
19
|
+
super("systemd user bus not reachable");
|
|
20
|
+
this.name = "SystemdUserBusUnavailableError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Decides, from a `systemctl --user …` result, whether the failure is the user
|
|
24
|
+
// bus being unreachable. The definitive marker is systemctl's "Failed to
|
|
25
|
+
// connect to … bus" message (WSL, containers, no $XDG_RUNTIME_DIR). A non-zero
|
|
26
|
+
// exit *without* that marker (e.g. stdout "degraded") means the bus IS
|
|
27
|
+
// reachable, so we don't treat it as unavailable.
|
|
28
|
+
export function isUserBusUnavailable(probe) {
|
|
29
|
+
return /Failed to connect to .*bus/i.test(`${probe.stdout}\n${probe.stderr}`);
|
|
30
|
+
}
|
|
13
31
|
// User mode only — never touch /etc/systemd/system.
|
|
14
32
|
const SYSTEMD_USER_DIR = join(homedir(), ".config", "systemd", "user");
|
|
15
33
|
const SERVICE_PATH = join(SYSTEMD_USER_DIR, "vir.service");
|
|
@@ -55,31 +73,54 @@ export function parseTimerCadence(timer) {
|
|
|
55
73
|
const m = timer.match(/OnUnitActiveSec=(\d+)h/);
|
|
56
74
|
return m && m[1] ? Number(m[1]) : null;
|
|
57
75
|
}
|
|
76
|
+
// Turn a failed systemctl result into a typed error: a bus-connection failure
|
|
77
|
+
// becomes SystemdUserBusUnavailableError (so the router falls back to cron),
|
|
78
|
+
// anything else stays a generic Error (a real misconfig the user should see).
|
|
79
|
+
function classifySystemctlError(op, res) {
|
|
80
|
+
if (isUserBusUnavailable(res))
|
|
81
|
+
return new SystemdUserBusUnavailableError();
|
|
82
|
+
return new Error(`systemctl ${op} failed: ${res.stderr.trim()}`);
|
|
83
|
+
}
|
|
84
|
+
function removeUnitFiles() {
|
|
85
|
+
if (existsSync(SERVICE_PATH))
|
|
86
|
+
rmSync(SERVICE_PATH);
|
|
87
|
+
if (existsSync(TIMER_PATH))
|
|
88
|
+
rmSync(TIMER_PATH);
|
|
89
|
+
}
|
|
58
90
|
export function install(opts) {
|
|
59
91
|
if (!isSystemdAvailable())
|
|
60
92
|
throw new SystemdNotAvailableError();
|
|
93
|
+
// systemctl can be on PATH while the user bus is unreachable (WSL,
|
|
94
|
+
// containers). Probe before writing anything so we never leave stale unit
|
|
95
|
+
// files behind in that case.
|
|
96
|
+
const probe = systemctl(["--user", "is-system-running"]);
|
|
97
|
+
if (isUserBusUnavailable(probe))
|
|
98
|
+
throw new SystemdUserBusUnavailableError();
|
|
61
99
|
if (!existsSync(SYSTEMD_USER_DIR)) {
|
|
62
100
|
mkdirSync(SYSTEMD_USER_DIR, { recursive: true });
|
|
63
101
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
102
|
+
try {
|
|
103
|
+
writeFileSync(SERVICE_PATH, renderService({ nodePath: opts.nodePath, cliPath: opts.cliPath }));
|
|
104
|
+
writeFileSync(TIMER_PATH, renderTimer(opts.cadenceHours));
|
|
105
|
+
const reload = systemctl(["--user", "daemon-reload"]);
|
|
106
|
+
if (reload.code !== 0)
|
|
107
|
+
throw classifySystemctlError("daemon-reload", reload);
|
|
108
|
+
const enable = systemctl(["--user", "enable", "--now", TIMER_UNIT]);
|
|
109
|
+
if (enable.code !== 0)
|
|
110
|
+
throw classifySystemctlError("enable", enable);
|
|
69
111
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
throw
|
|
112
|
+
catch (err) {
|
|
113
|
+
// Partial install — remove the unit files we wrote so a retry (or the cron
|
|
114
|
+
// fallback) starts clean — then re-throw for the router to classify.
|
|
115
|
+
removeUnitFiles();
|
|
116
|
+
throw err;
|
|
73
117
|
}
|
|
74
118
|
}
|
|
75
119
|
export function uninstall() {
|
|
76
120
|
if (!isSystemdAvailable())
|
|
77
121
|
return;
|
|
78
122
|
systemctl(["--user", "disable", "--now", TIMER_UNIT]);
|
|
79
|
-
|
|
80
|
-
rmSync(SERVICE_PATH);
|
|
81
|
-
if (existsSync(TIMER_PATH))
|
|
82
|
-
rmSync(TIMER_PATH);
|
|
123
|
+
removeUnitFiles();
|
|
83
124
|
systemctl(["--user", "daemon-reload"]);
|
|
84
125
|
}
|
|
85
126
|
export function status() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../src/daemon/systemd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,sEAAsE;AACtE,2CAA2C;AAC3C,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD;QACE,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,oDAAoD;AACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACvE,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AACvD,MAAM,UAAU,GAAG,WAAW,CAAC;AAe/B,MAAM,UAAU,kBAAkB;IAChC,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAK/B,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;KACzB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,aAAa,CAAC,IAG7B;IACC,OAAO;;;;;YAKG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO;;;CAGxC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,YAAoB;IAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAChD,OAAO;4BACmB,CAAC;;;;kBAIX,CAAC;;;;CAIlB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAiB;IACvC,IAAI,CAAC,kBAAkB,EAAE;QAAE,MAAM,IAAI,wBAAwB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../src/daemon/systemd.ts"],"names":[],"mappings":"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"}
|