iobroker.bee 0.2.3 → 0.2.4

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 CHANGED
@@ -13,9 +13,25 @@ Fleet agent for ioBroker. It connects a delivered ioBroker system (in a house, a
13
13
  3. **Desired state instead of commands.** The server publishes the desired profile as a retained message. A system that was offline for months reads the current profile, not a backlog of orders.
14
14
  4. **Reconciliation.** The agent compares the profile with the installed versions and plans install, upgrade, downgrade (and removal only when the server asks for it on return to managed mode). It never touches adapters that are not in the profile.
15
15
  5. **Preflight.** Emergency stop, dependencies of the target versions (`io-package.json` of the target version, `engines.node`), free space, maintenance window and configurable conditions on ioBroker states (installation not in use, battery charged, no roaming, vehicle standing, …). Conditions that change by themselves mean *waiting*, everything that needs a human means *blocked*.
16
- 6. **Execution.** A detached runner process performs backup (`iobroker backup`) and the steps (`iobroker add/upgrade/del`) one by one. It survives restarts of the adapter, including the update of the agent itself, which always comes last.
16
+ 6. **Execution.** A detached runner process performs backup (`iobroker backup`) and the steps (`iobroker add/upgrade/del`) one by one. It survives restarts of the adapter, including the update of the agent itself, which always comes last. A new major line of Node.js comes right after the backup, see below.
17
17
  7. **Verification.** Versions must match, all enabled daemon instances of the changed adapters must be alive, and no new errors may appear in their log during the observation time. Otherwise the agent rolls back the changed adapters to their previous versions and reports *blocked*. A blocked job is not repeated until the fleet manager releases a new attempt.
18
18
 
19
+ ### Node.js
20
+
21
+ The profile names the major line of Node.js (e.g. `22`). If this system runs an older one, the plan starts with a step `node`. Never downwards: a newer Node.js than in the profile stays. Within a major line Node.js is updated with the OS updates.
22
+
23
+ The update stops ioBroker, so the agent cannot do it itself. It starts `scripts/node-update.sh` as root in a systemd unit of its own (`sudo -n systemd-run`, allowed by the installer of ioBroker), so stopping ioBroker does not end it. The script
24
+
25
+ 1. stops the ioBroker service, points the NodeSource source (`/etc/apt/sources.list.d/nodesource.sources` or `.list`) to the new line and installs the newest `nodejs` of it, with the capabilities the old binary had (ports below 1024, raw sockets),
26
+ 2. starts ioBroker and waits for the verdict of the agent: under the new Node.js the agent checks that every instance that ran before runs again (at least 10 minutes, or the start timeout if longer) and then writes `node-verdict.json`,
27
+ 3. without a positive verdict in time it stops ioBroker, puts the source back, installs the old package again and starts ioBroker.
28
+
29
+ Afterwards the runner continues with the adapters. A failed adapter later rolls back the adapters, Node.js stays. If the old version came back, the job is *blocked* with the reason. Adapters with native modules are rebuilt by js-controller when they start.
30
+
31
+ Preflight blocks with a reason unless all of this holds: Linux, ioBroker runs as a systemd service, sudo without password for `systemd-run` (not with `--hardened`), Node.js is `/usr/bin/node` of the package `nodejs` from NodeSource, architecture amd64 or arm64, `nodejs` not on hold, an off-device backup target (BackItUp), and no installed package (js-controller, adapters that the job does not change) excludes the new line in `engines.node`.
32
+
33
+ Limits: a power loss while the script works leaves the system as far as the script got; the agent then reports *blocked* and `node-update.log` tells where it stopped.
34
+
19
35
  ### Behaviour without server
20
36
 
21
37
  - **Unknown means self-stop.** If the server explicitly rejects the device (unknown token, revoked certificate), the agent writes the reason to `bee.0.info.status`, raises a notification and terminates. It does not keep knocking.
@@ -72,13 +88,13 @@ From the asset detail a technician (permission `operate`) can start, stop and re
72
88
  | `job.state`, `job.detail`, `job.steps` | current or last job |
73
89
  | `control.halted` | emergency stop of the fleet is active |
74
90
  | `control.refresh`, `control.check` | buttons: send inventory, check desired state now |
75
- | `info.remoteAccess`, `info.remoteAccessBy` | remote access running now, and by whom with which purpose |
91
+ | `info.remoteAccess`, `info.remoteAccessBy` | remote access running now, and by whom with which purpose (`keiner` if none; scripts should use `info.remoteAccess`) |
76
92
 
77
- Files in `iobroker-data/bee.0/`: `device.json` (certificate and key, mode 0600), `desired.json`, `job.json`, `runner.json`, `runner.log` (complete CLI output of all jobs), `tunnels.json` (running remote access sessions, resumed after a restart).
93
+ Files in `iobroker-data/bee.0/`: `device.json` (certificate and key, mode 0600), `desired.json`, `job.json`, `runner.json`, `runner.log` (complete CLI output of all jobs), `tunnels.json` (running remote access sessions, resumed after a restart), and for an update of Node.js `node-update.sh` (copy of the script), `node-status.json`, `node-verdict.json` and `node-update.log` (complete output of the script).
78
94
 
79
95
  ## Not in this version
80
96
 
81
- Platform updates of js-controller and Node.js (with a systemd watchdog outside ioBroker), vis-2 project distribution, recording of console sessions, signed artifacts. See the concept of the beekeeper project.
97
+ Updates of js-controller through the fleet (with a watchdog outside ioBroker), vis-2 project distribution, recording of console sessions, signed artifacts. See the concept of the beekeeper project.
82
98
 
83
99
  ## Development
84
100
 
@@ -92,6 +108,13 @@ npm test # unit tests of planner, preflight and diff
92
108
 
93
109
  ## Changelog
94
110
 
111
+ ### 0.2.4 (2026-11-10)
112
+
113
+ - Settings, tab *Remote access*: "Remote access in progress" instead of "Access right now", and `info.remoteAccessBy` says `keiner` when nobody accesses the system
114
+ - Settings, tab *Enrollment*: the connection to the fleet management in green or red, the status (now naming the server) next to it
115
+ - Instances without a process (mode `none` or `extension`) refuse start, stop and restart
116
+ - Updates Node.js to the major line of the profile, as the first step of a job: a script as root in a systemd unit of its own, back to the old version if the instances do not run again under the new one (see *Node.js*)
117
+
95
118
  ### 0.2.3 (2026-11-10)
96
119
 
97
120
  - Instances that run as a web extension inside a web instance (`common.webExtension` and `native.webInstance`, e.g. mcp) have no process of their own; they count as running when their web instance runs, as in admin. Before, the fleet management showed them as not running, and the check after an update of such an adapter would have rolled it back.
@@ -53,16 +53,34 @@
53
53
  "lg": 12,
54
54
  "xl": 12
55
55
  },
56
+ "_connection": {
57
+ "type": "state",
58
+ "oid": "info.connection",
59
+ "label": { "en": "Fleet management", "de": "Flottenverwaltung" },
60
+ "trueText": { "en": "connected", "de": "verbunden" },
61
+ "falseText": { "en": "not connected", "de": "nicht verbunden" },
62
+ "trueTextStyle": { "color": "#4caf50", "fontWeight": "bold" },
63
+ "falseTextStyle": { "color": "#f44336", "fontWeight": "bold" },
64
+ "narrow": true,
65
+ "addColon": true,
66
+ "newLine": true,
67
+ "xs": 12,
68
+ "sm": 12,
69
+ "md": 4,
70
+ "lg": 3,
71
+ "xl": 3
72
+ },
56
73
  "_status": {
57
74
  "type": "state",
58
75
  "oid": "info.status",
59
76
  "label": { "en": "Status", "de": "Status" },
60
- "newLine": true,
77
+ "narrow": true,
78
+ "addColon": true,
61
79
  "xs": 12,
62
80
  "sm": 12,
63
- "md": 12,
64
- "lg": 12,
65
- "xl": 12
81
+ "md": 8,
82
+ "lg": 9,
83
+ "xl": 9
66
84
  }
67
85
  }
68
86
  },
@@ -126,7 +144,7 @@
126
144
  "_remoteAccessBy": {
127
145
  "type": "state",
128
146
  "oid": "info.remoteAccessBy",
129
- "label": { "en": "Access right now", "de": "Zugriff gerade" },
147
+ "label": { "en": "Remote access in progress", "de": "Laufender Fernzugriff" },
130
148
  "newLine": true,
131
149
  "xs": 12,
132
150
  "sm": 12,
@@ -76,6 +76,9 @@ function instanceRefusal(id, action, own, obj, host) {
76
76
  if ((0, instances_1.onlyWww)(obj)) {
77
77
  return `${id} hat keinen eigenen Prozess (nur Dateien für web)`;
78
78
  }
79
+ if (obj.common.mode === 'none' || obj.common.mode === 'extension') {
80
+ return `${id} hat keinen eigenen Prozess (Modus ${obj.common.mode})`;
81
+ }
79
82
  if (id === own && action === 'stop') {
80
83
  return 'bee stoppen trennt die Anlage von der Flottenverwaltung; das geht nur am Gerät';
81
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/lib/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/lib/commands.ts"],"names":[],"mappings":"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"}
package/build/lib/jobs.js CHANGED
@@ -1,10 +1,15 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.JobManager = void 0;
4
7
  const node_child_process_1 = require("node:child_process");
5
8
  const node_fs_1 = require("node:fs");
6
9
  const promises_1 = require("node:fs/promises");
7
10
  const node_path_1 = require("node:path");
11
+ const semver_1 = __importDefault(require("semver"));
12
+ const node_1 = require("./node");
8
13
  const planner_1 = require("./planner");
9
14
  const util_1 = require("./util");
10
15
  function pidAlive(pid) {
@@ -104,12 +109,13 @@ class JobManager {
104
109
  profileName: profile.name,
105
110
  profileHash: profile.hash,
106
111
  retry: desired.retry,
107
- targets: Object.fromEntries(steps.map(s => [s.adapter, s.to ?? null])),
112
+ targets: Object.fromEntries(steps.filter(s => s.adapter).map(s => [s.adapter, s.to ?? null])),
108
113
  state: 'preflight',
109
114
  detail: '',
110
115
  steps: all,
111
116
  phase: 'apply',
112
117
  createdAt: Date.now(),
118
+ ...(Object.keys(files).length ? { files } : {}),
113
119
  };
114
120
  await this.save();
115
121
  await this.spawnRunner('apply', all, files);
@@ -125,6 +131,9 @@ class JobManager {
125
131
  if (this.job.phase === 'apply' || this.job.phase === 'rollback') {
126
132
  await this.pollRunner();
127
133
  }
134
+ else if (this.job.phase === 'node') {
135
+ await this.pollNode();
136
+ }
128
137
  else if (this.job.phase === 'verify') {
129
138
  await this.verify();
130
139
  }
@@ -142,7 +151,10 @@ class JobManager {
142
151
  if (!runner) {
143
152
  return;
144
153
  }
145
- const finished = runner.phase === 'done' || runner.phase === 'failed' || runner.phase === 'halted';
154
+ const finished = runner.phase === 'done' ||
155
+ runner.phase === 'failed' ||
156
+ runner.phase === 'halted' ||
157
+ runner.phase === 'node';
146
158
  if (!finished && runner.phase === 'running' && !pidAlive(runner.pid)) {
147
159
  // runner died (power loss, reboot)
148
160
  runner.phase = 'failed';
@@ -163,7 +175,10 @@ class JobManager {
163
175
  }
164
176
  if (job.phase === 'apply') {
165
177
  job.steps = runner.steps;
166
- if (runner.phase === 'done') {
178
+ if (runner.phase === 'node') {
179
+ await this.startNode();
180
+ }
181
+ else if (runner.phase === 'done') {
167
182
  job.phase = 'verify';
168
183
  job.verifyStartedAt = Date.now();
169
184
  await this.setState('verify', 'Instanzen und Log werden geprüft');
@@ -185,6 +200,110 @@ class JobManager {
185
200
  }
186
201
  await this.finish(job.halted && ok ? 'waiting' : 'blocked', detail);
187
202
  }
203
+ /** Time the agent gives the instances under the new Node.js; the script waits 15 minutes longer */
204
+ get nodeWaitSeconds() {
205
+ return Math.max(this.deps.startTimeoutSeconds, 600);
206
+ }
207
+ async startNode() {
208
+ const job = this.job;
209
+ const step = job.steps.find(s => s.action === 'node' && s.status === 'pending');
210
+ step.status = 'running';
211
+ step.ts = Date.now();
212
+ job.phase = 'node';
213
+ job.node = { unit: (0, node_1.nodeUnit)(), startedAt: Date.now(), instances: await this.deps.running() };
214
+ // saved before: the script stops ioBroker and with it this process
215
+ await this.setState('rollout', `Node.js ${step.to} wird installiert, ioBroker startet dafür neu`);
216
+ try {
217
+ await this.deps.launchNode(step.to, job.node.unit, this.nodeWaitSeconds + 900);
218
+ }
219
+ catch (e) {
220
+ await this.nodeFailed(`Node.js ${step.to} nicht gestartet: ${e.message}`);
221
+ }
222
+ }
223
+ /** The script for Node.js runs, or ran while this process was gone */
224
+ async pollNode() {
225
+ const job = this.job;
226
+ const step = job.steps.find(s => s.action === 'node');
227
+ const node = job.node;
228
+ const dir = this.deps.dataDir;
229
+ const status = await (0, node_1.readNodeStatus)(dir);
230
+ if (status?.state === 'restored') {
231
+ await this.nodeFailed(`Node.js ${step.to}: ${status.detail}; Node.js ${step.from} wiederhergestellt`);
232
+ return;
233
+ }
234
+ if (status?.state === 'failed') {
235
+ await this.nodeFailed(`Node.js ${step.to}: ${status.detail}`);
236
+ return;
237
+ }
238
+ const verdict = await (0, node_1.readVerdict)(dir);
239
+ if (status?.state === 'ok' || verdict?.ok) {
240
+ await this.nodeDone();
241
+ return;
242
+ }
243
+ const interrupted = `Node.js ${step.to}: Skript wurde unterbrochen, jetzt läuft Node.js ${process.version}; siehe node-update.log`;
244
+ if (status?.state !== 'waiting') {
245
+ // running: the script works (this process normally does not live that long)
246
+ if (Date.now() - node.startedAt > 60_000 && !(await this.deps.unitActive(node.unit))) {
247
+ await this.nodeFailed(interrupted);
248
+ }
249
+ return;
250
+ }
251
+ if (verdict) {
252
+ // negative: the script goes back to the old version and restarts ioBroker
253
+ return;
254
+ }
255
+ if (!(await this.deps.unitActive(node.unit))) {
256
+ await this.nodeFailed(interrupted);
257
+ return;
258
+ }
259
+ if (String(semver_1.default.major(process.version)) !== step.to) {
260
+ await (0, node_1.writeVerdict)(dir, false, `Der Agent läuft weiter unter Node.js ${process.version}`);
261
+ return;
262
+ }
263
+ const running = new Set(await this.deps.running());
264
+ const down = node.instances.filter(id => !running.has(id));
265
+ if (!down.length) {
266
+ await (0, node_1.writeVerdict)(dir, true);
267
+ await this.nodeDone();
268
+ }
269
+ else if (Date.now() - status.ts > this.nodeWaitSeconds * 1000) {
270
+ await (0, node_1.writeVerdict)(dir, false, `Unter Node.js ${process.version} laufen nicht: ${down.join(', ')}`);
271
+ await this.setState('rollout', `Instanzen starten nicht, zurück zu Node.js ${step.from}`);
272
+ }
273
+ else {
274
+ await this.setState('rollout', `Node.js ${process.version}: warte auf ${down.join(', ')}`);
275
+ }
276
+ }
277
+ /** Node.js is new: the rest of the steps, or the verification */
278
+ async nodeDone() {
279
+ const job = this.job;
280
+ const step = job.steps.find(s => s.action === 'node');
281
+ step.status = 'ok';
282
+ step.detail = `${step.from} → ${process.version}`;
283
+ this.deps.log.info(`Node.js updated: ${step.detail}`);
284
+ if (job.steps.some(s => s.status === 'pending')) {
285
+ job.phase = 'apply';
286
+ await this.save();
287
+ await this.spawnRunner('apply', job.steps, job.files);
288
+ await this.setState('rollout', `Node.js ${process.version}, weiter mit den Adaptern`);
289
+ }
290
+ else {
291
+ job.phase = 'verify';
292
+ job.verifyStartedAt = Date.now();
293
+ await this.setState('verify', 'Instanzen und Log werden geprüft');
294
+ }
295
+ }
296
+ /** Nothing after the backup has changed (the script went back to the old version, if it got so far) */
297
+ async nodeFailed(reason) {
298
+ const job = this.job;
299
+ const step = job.steps.find(s => s.action === 'node');
300
+ step.status = 'error';
301
+ step.detail = reason;
302
+ job.steps.filter(s => s.status === 'pending').forEach(s => (s.status = 'skipped'));
303
+ job.failure = reason;
304
+ this.deps.log.warn(reason);
305
+ await this.finish('blocked', reason);
306
+ }
188
307
  async startRollback(reason, halted = false) {
189
308
  const job = this.job;
190
309
  job.failure = reason;
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/lib/jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/lib/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.NODE_VERDICT = exports.NODE_STATUS = void 0;
7
+ exports.majorOf = majorOf;
8
+ exports.nodeStep = nodeStep;
9
+ exports.serviceOf = serviceOf;
10
+ exports.nodeBlockers = nodeBlockers;
11
+ exports.engineConflicts = engineConflicts;
12
+ exports.readEngines = readEngines;
13
+ exports.nodeFacts = nodeFacts;
14
+ exports.nodeUnit = nodeUnit;
15
+ exports.launchNodeUpdate = launchNodeUpdate;
16
+ exports.unitActive = unitActive;
17
+ exports.readNodeStatus = readNodeStatus;
18
+ exports.readVerdict = readVerdict;
19
+ exports.writeVerdict = writeVerdict;
20
+ const node_child_process_1 = require("node:child_process");
21
+ const node_fs_1 = require("node:fs");
22
+ const promises_1 = require("node:fs/promises");
23
+ const node_path_1 = require("node:path");
24
+ const semver_1 = __importDefault(require("semver"));
25
+ const util_1 = require("./util");
26
+ /**
27
+ * Update of Node.js to the major line of the profile (DesiredProfile.node), only upwards.
28
+ *
29
+ * Node.js comes from the package nodejs of NodeSource, as the installer of ioBroker sets it up. The update
30
+ * stops ioBroker, so the agent cannot do it itself: it starts scripts/node-update.sh as root in a systemd
31
+ * unit of its own (sudo systemd-run, which the installer allows the user iobroker). After the restart the
32
+ * agent checks under the new Node.js that the instances that ran before run again and writes its verdict;
33
+ * without a positive verdict the script installs the old package again. Files in the data directory:
34
+ * node-status.json (script), node-verdict.json (agent), node-update.log.
35
+ */
36
+ exports.NODE_STATUS = 'node-status.json';
37
+ exports.NODE_VERDICT = 'node-verdict.json';
38
+ const NODE_SCRIPT = 'node-update.sh';
39
+ /** Major line of a version, e.g. 22 for "v22.11.0", "22" or "22.x" */
40
+ function majorOf(version) {
41
+ return semver_1.default.coerce(version ?? '')?.major || null;
42
+ }
43
+ /**
44
+ * The step that brings Node.js to the major line of the profile; null if it runs that line already, or a
45
+ * newer one (no downgrades)
46
+ *
47
+ * @param target DesiredProfile.node, e.g. "22"
48
+ * @param current process.version
49
+ */
50
+ function nodeStep(target, current) {
51
+ const want = majorOf(target);
52
+ const have = majorOf(current);
53
+ if (!want || !have || want <= have) {
54
+ return null;
55
+ }
56
+ return { action: 'node', from: current, to: String(want), status: 'pending' };
57
+ }
58
+ /**
59
+ * The systemd service ioBroker runs in, from /proc/self/cgroup, e.g. "iobroker.service"
60
+ *
61
+ * @param cgroup content of /proc/self/cgroup
62
+ */
63
+ function serviceOf(cgroup) {
64
+ return /\/system\.slice\/([^/\s]+\.service)/.exec(cgroup)?.[1] ?? null;
65
+ }
66
+ /** Reasons that block the update of Node.js; empty if it can run */
67
+ function nodeBlockers(f) {
68
+ if (f.platform !== 'linux') {
69
+ return ['nur unter Linux möglich'];
70
+ }
71
+ const errors = [];
72
+ if (!f.service) {
73
+ errors.push('ioBroker läuft nicht als systemd-Dienst');
74
+ }
75
+ if (!f.sudo) {
76
+ errors.push('kein sudo ohne Passwort für systemd-run (Installation mit --hardened?)');
77
+ }
78
+ if (!f.packaged || !f.source) {
79
+ errors.push('Node.js stammt nicht aus dem Paket nodejs von NodeSource');
80
+ }
81
+ else if (f.arch !== 'amd64' && f.arch !== 'arm64') {
82
+ errors.push(`NodeSource bietet für ${f.arch || 'diese Architektur'} kein Node.js an (nur amd64 und arm64)`);
83
+ }
84
+ if (f.held) {
85
+ errors.push('das Paket nodejs ist auf hold gesetzt');
86
+ }
87
+ if (!f.offDeviceBackup) {
88
+ errors.push('keine Sicherung außerhalb des Geräts (BackItUp)');
89
+ }
90
+ return errors;
91
+ }
92
+ /**
93
+ * Installed packages whose engines.node excludes the major line
94
+ *
95
+ * @param target major line, e.g. 22
96
+ * @param engines per package its version and engines.node
97
+ */
98
+ function engineConflicts(target, engines) {
99
+ const line = `^${target}.0.0`;
100
+ return Object.entries(engines)
101
+ .filter(([, e]) => !!e.node && !!semver_1.default.validRange(e.node) && !semver_1.default.intersects(e.node, line))
102
+ .map(([name, e]) => `${name}@${e.version} verlangt Node ${e.node}`);
103
+ }
104
+ /**
105
+ * Version and engines.node of installed packages iobroker.<name>
106
+ *
107
+ * @param cwd directory of ioBroker, e.g. /opt/iobroker
108
+ * @param names adapters, "js-controller" for the controller
109
+ */
110
+ function readEngines(cwd, names) {
111
+ const result = {};
112
+ for (const name of names) {
113
+ try {
114
+ const pkg = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(cwd, 'node_modules', `iobroker.${name}`, 'package.json'), 'utf8'));
115
+ const node = pkg.engines?.node;
116
+ result[name] = { version: String(pkg.version), ...(typeof node === 'string' ? { node } : {}) };
117
+ }
118
+ catch {
119
+ // not installed as a package of its own
120
+ }
121
+ }
122
+ return result;
123
+ }
124
+ function run(cmd, args, timeout = 15_000) {
125
+ return new Promise(resolve => {
126
+ (0, node_child_process_1.execFile)(cmd, args, { timeout, windowsHide: true }, (error, stdout, stderr) => resolve({ ok: !error, out: String(stdout).trim(), err: String(stderr).trim() || error?.message || '' }));
127
+ });
128
+ }
129
+ const isRoot = () => process.getuid?.() === 0;
130
+ /** Root runs systemd-run itself, everybody else with sudo -n */
131
+ function asRoot(args) {
132
+ return isRoot() ? [args[0], args.slice(1)] : ['sudo', ['-n', ...args]];
133
+ }
134
+ function realpath(path) {
135
+ try {
136
+ return (0, node_fs_1.realpathSync)(path);
137
+ }
138
+ catch {
139
+ return null;
140
+ }
141
+ }
142
+ const SOURCES = ['/etc/apt/sources.list.d/nodesource.sources', '/etc/apt/sources.list.d/nodesource.list'];
143
+ /**
144
+ * Looks at this system
145
+ *
146
+ * @param offDeviceBackup Inventory.backup.offDevice
147
+ */
148
+ async function nodeFacts(offDeviceBackup) {
149
+ const facts = {
150
+ platform: process.platform,
151
+ service: null,
152
+ sudo: false,
153
+ arch: null,
154
+ packaged: false,
155
+ source: false,
156
+ held: false,
157
+ offDeviceBackup,
158
+ };
159
+ if (process.platform !== 'linux') {
160
+ return facts;
161
+ }
162
+ const binary = realpath(process.execPath);
163
+ const [cgroup, sudo, arch, owner, held] = await Promise.all([
164
+ (0, promises_1.readFile)('/proc/self/cgroup', 'utf8').catch(() => ''),
165
+ run(...asRoot(['systemd-run', '--version'])),
166
+ run('dpkg', ['--print-architecture']),
167
+ binary ? run('dpkg', ['-S', binary]) : Promise.resolve({ ok: false, out: '', err: '' }),
168
+ run('apt-mark', ['showhold', 'nodejs']),
169
+ ]);
170
+ facts.service = serviceOf(cgroup);
171
+ facts.sudo = sudo.ok;
172
+ facts.arch = arch.ok ? arch.out : null;
173
+ facts.packaged = !!binary && binary === realpath('/usr/bin/node') && owner.ok && owner.out.startsWith('nodejs:');
174
+ facts.source = SOURCES.some(f => (0, node_fs_1.existsSync)(f) && /deb\.nodesource\.com\/node_\d+\.x/.test((0, node_fs_1.readFileSync)(f, 'utf8')));
175
+ facts.held = held.ok && held.out.split('\n').some(l => l.trim() === 'nodejs');
176
+ return facts;
177
+ }
178
+ /** Name of the systemd unit for an update of Node.js */
179
+ function nodeUnit(now = Date.now()) {
180
+ return `bee-node-${now}`;
181
+ }
182
+ /**
183
+ * Starts scripts/node-update.sh as root in a unit of its own. It stops ioBroker, so this process ends soon.
184
+ *
185
+ * @param o what to start
186
+ * @param o.dir data directory of the agent
187
+ * @param o.target major line
188
+ * @param o.service systemd service of ioBroker
189
+ * @param o.unit name of the unit, see nodeUnit
190
+ * @param o.waitSeconds how long the script waits for the verdict of the agent
191
+ */
192
+ async function launchNodeUpdate(o) {
193
+ await (0, promises_1.rm)((0, node_path_1.join)(o.dir, exports.NODE_STATUS), { force: true });
194
+ await (0, promises_1.rm)((0, node_path_1.join)(o.dir, exports.NODE_VERDICT), { force: true });
195
+ // a copy: the package of the agent may change while the script runs
196
+ const script = (0, node_path_1.join)(o.dir, NODE_SCRIPT);
197
+ await (0, promises_1.copyFile)((0, node_path_1.join)(__dirname, '..', '..', 'scripts', NODE_SCRIPT), script);
198
+ const r = await run(...asRoot([
199
+ 'systemd-run',
200
+ `--unit=${o.unit}`,
201
+ '--collect',
202
+ '--quiet',
203
+ `--description=ioBroker.bee: Node.js ${o.target}`,
204
+ '/bin/bash',
205
+ script,
206
+ o.dir,
207
+ o.target,
208
+ o.service,
209
+ String(o.waitSeconds),
210
+ ]));
211
+ if (!r.ok) {
212
+ throw new Error(`systemd-run: ${r.err || r.out || 'fehlgeschlagen'}`);
213
+ }
214
+ }
215
+ /** Whether the unit of the script is still there (it is removed when the script ends) */
216
+ async function unitActive(unit) {
217
+ return (await run('systemctl', ['is-active', '--quiet', unit])).ok;
218
+ }
219
+ function readNodeStatus(dir) {
220
+ return (0, util_1.readJson)((0, node_path_1.join)(dir, exports.NODE_STATUS));
221
+ }
222
+ /** Whether the agent already gave its verdict to the script, and which */
223
+ async function readVerdict(dir) {
224
+ return (0, util_1.readJson)((0, node_path_1.join)(dir, exports.NODE_VERDICT));
225
+ }
226
+ /**
227
+ * The verdict of the agent under the new Node.js. On one line: the script reads it with grep and sed.
228
+ *
229
+ * @param dir data directory of the agent
230
+ * @param ok the instances run, the script keeps the new Node.js
231
+ * @param reason otherwise why, the script goes back to the old one
232
+ */
233
+ async function writeVerdict(dir, ok, reason = '') {
234
+ const file = (0, node_path_1.join)(dir, exports.NODE_VERDICT);
235
+ const data = ok ? { ok: true } : { ok: false, reason: reason.replace(/["\\\r\n]/g, ' ').slice(0, 400) };
236
+ await (0, promises_1.writeFile)(`${file}.tmp`, `${JSON.stringify(data)}\n`);
237
+ await (0, promises_1.rename)(`${file}.tmp`, file);
238
+ }
239
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/lib/node.ts"],"names":[],"mappings":"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"}