iobroker.js-controller 7.0.2 → 7.0.3
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/build/cjs/compactgroupController.js.map +1 -1
- package/build/cjs/lib/adapter.js +0 -2
- package/build/cjs/lib/adapterAutoUpgradeManager.js +33 -0
- package/build/cjs/lib/adapterAutoUpgradeManager.js.map +1 -1
- package/build/cjs/lib/adapterUpgradeManager.d.ts +0 -2
- package/build/cjs/lib/adapterUpgradeManager.js +86 -0
- package/build/cjs/lib/adapterUpgradeManager.js.map +1 -1
- package/build/cjs/lib/blocklistManager.js +22 -0
- package/build/cjs/lib/blocklistManager.js.map +1 -1
- package/build/cjs/lib/exitCodes.js +0 -2
- package/build/cjs/lib/multihostServer.js +7 -3
- package/build/cjs/lib/multihostServer.js.map +1 -1
- package/build/cjs/lib/objects/objectsInMemClient.js +0 -2
- package/build/cjs/lib/objects/objectsInMemServer.js +0 -2
- package/build/cjs/lib/objects.d.ts +0 -1
- package/build/cjs/lib/objects.js +4 -0
- package/build/cjs/lib/objects.js.map +1 -1
- package/build/cjs/lib/password.js +0 -2
- package/build/cjs/lib/password.js.map +1 -1
- package/build/cjs/lib/preinstallCheck.js +4 -0
- package/build/cjs/lib/preinstallCheck.js.map +1 -1
- package/build/cjs/lib/restart.js +6 -4
- package/build/cjs/lib/restart.js.map +3 -3
- package/build/cjs/lib/states/statesInMemClient.js +0 -2
- package/build/cjs/lib/states/statesInMemServer.js +0 -2
- package/build/cjs/lib/tools.js +0 -2
- package/build/cjs/lib/upgradeManager.js +90 -2
- package/build/cjs/lib/upgradeManager.js.map +3 -3
- package/build/cjs/lib/utils.d.ts +0 -1
- package/build/cjs/lib/utils.js.map +1 -1
- package/build/cjs/lib/vis/states.js.map +1 -1
- package/build/cjs/lib/vis/visUtils.js +1 -0
- package/build/cjs/lib/vis/visUtils.js.map +1 -1
- package/build/cjs/main.d.ts +0 -10
- package/build/cjs/main.js +61 -17
- package/build/cjs/main.js.map +3 -3
- package/build/esm/lib/adapterUpgradeManager.d.ts +0 -2
- package/build/esm/lib/adapterUpgradeManager.d.ts.map +1 -1
- package/build/esm/lib/objects.d.ts +0 -1
- package/build/esm/lib/objects.d.ts.map +1 -1
- package/build/esm/lib/utils.d.ts +0 -1
- package/build/esm/lib/utils.d.ts.map +1 -1
- package/build/esm/main.d.ts +0 -10
- package/build/esm/main.d.ts.map +1 -1
- package/build/esm/main.js +1 -10
- package/build/esm/main.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/io-package.json +2 -2
- package/package.json +12 -12
package/build/cjs/lib/objects.js
CHANGED
|
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
return to;
|
|
19
19
|
};
|
|
20
20
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
25
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
26
|
mod
|
|
23
27
|
));
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/objects.ts"],
|
|
4
4
|
"sourcesContent": ["import fs from 'fs-extra';\nimport { DEFAULT_DISK_WARNING_LEVEL } from '@/lib/utils.js';\nimport { tools } from '@iobroker/js-controller-common-db';\n\ninterface GetHostOptions {\n /** The host base id */\n id: string;\n /** The host name */\n hostname: string;\n /** If these are the objects for a compact group controller */\n isCompactGroupController: boolean;\n /** The ioBroker config */\n config: ioBroker.IoBrokerJson;\n}\n\nexport type TaskObject = ioBroker.SettableObject & {\n state?: ioBroker.SettableState;\n};\n\n/**\n * Get all ioBroker objects which should be created in the `system.host.<hostname>` scope\n *\n * @param options information about hostname, compact controller, the base ID and the config\n */\nexport function getHostObjects(options: GetHostOptions): TaskObject[] {\n const { id, hostname, isCompactGroupController, config } = options;\n\n const objs: TaskObject[] = [];\n\n if (!isCompactGroupController) {\n objs.push({\n _id: `${id}.compactModeEnabled`,\n type: 'state',\n common: {\n name: 'Controller - compact mode enabled',\n type: 'boolean',\n read: true,\n write: false,\n role: 'indicator',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.compactgroupProcesses`,\n type: 'state',\n common: {\n name: 'Controller - number of compact group controllers',\n type: 'number',\n read: true,\n write: false,\n min: 0,\n role: 'value',\n unit: 'processes',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.nodeVersion`,\n type: 'state',\n common: {\n name: 'Controller - Node.js version',\n type: 'string',\n read: true,\n write: false,\n desc: 'Node.js version of the host process.',\n role: 'state',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.osPackageUpdates`,\n type: 'state',\n common: {\n name: 'Available OS package updates',\n type: 'array',\n read: true,\n write: false,\n desc: 'The output of the \"update\" command from the package manager like apt or yum',\n role: 'state',\n },\n native: {},\n });\n }\n\n objs.push({\n _id: `${id}.instancesAsProcess`,\n type: 'state',\n common: {\n name: 'Controller - number of instance processes',\n type: 'number',\n read: true,\n write: false,\n min: 0,\n role: 'value',\n unit: 'processes',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.instancesAsCompact`,\n type: 'state',\n common: {\n name: 'Controller - number of instances started in this host process',\n type: 'number',\n read: true,\n write: false,\n min: 0,\n role: 'value',\n unit: 'instances',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.cpu`,\n type: 'state',\n common: {\n name: 'Controller - cpu usage in % of one core',\n type: 'number',\n read: true,\n write: false,\n min: 0,\n role: 'value',\n unit: '% of one core',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.cputime`,\n type: 'state',\n common: {\n name: 'Controller - accumulated cputime in seconds',\n type: 'number',\n read: true,\n write: false,\n min: 0,\n role: 'value',\n unit: 'seconds',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.mem`,\n type: 'state',\n common: {\n type: 'number',\n role: 'value',\n name: `${hostname} - memory usage in %`,\n unit: '%',\n read: true,\n write: false,\n min: 0,\n max: 100,\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.memHeapUsed`,\n type: 'state',\n common: {\n type: 'number',\n role: 'value',\n name: 'Controller - heap memory used in MB',\n read: true,\n write: false,\n min: 0,\n unit: 'MB',\n },\n native: {},\n });\n\n if (fs.existsSync('/proc/meminfo')) {\n objs.push({\n _id: `${id}.memAvailable`,\n type: 'state',\n common: {\n type: 'number',\n role: 'value',\n name: `${hostname} - available memory from /proc/meminfo in MB`,\n read: true,\n write: false,\n min: 0,\n unit: 'MB',\n },\n native: {},\n });\n }\n\n objs.push({\n _id: `${id}.memHeapTotal`,\n type: 'state',\n common: {\n type: 'number',\n role: 'value',\n name: 'Controller - heap memory reserved in MB',\n read: true,\n write: false,\n min: 0,\n unit: 'MB',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.memRss`,\n type: 'state',\n common: {\n type: 'number',\n role: 'value',\n name: 'Controller - resident set size memory in MB',\n desc: \"RSS is the resident set size, the portion of the process's memory held in RAM\",\n read: true,\n write: false,\n min: 0,\n unit: 'MB',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.uptime`,\n type: 'state',\n common: {\n type: 'number',\n role: 'value',\n name: 'Controller - uptime in seconds',\n read: true,\n write: false,\n min: 0,\n unit: 'seconds',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.load`,\n type: 'state',\n common: {\n unit: '',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n name: `${hostname} - load average 1min`,\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.alive`,\n type: 'state',\n common: {\n name: `${hostname} - alive status`,\n read: true,\n write: false,\n type: 'boolean',\n role: 'indicator',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.freemem`,\n type: 'state',\n common: {\n name: `${hostname} - available RAM in MB`,\n unit: 'MB',\n read: true,\n write: false,\n type: 'number',\n role: 'value',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.inputCount`,\n type: 'state',\n common: {\n name: 'Controller - input level in events/15 seconds',\n desc: \"State's inputs in 15 seconds\",\n type: 'number',\n read: true,\n write: false,\n role: 'value',\n unit: 'events/15 seconds',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.outputCount`,\n type: 'state',\n common: {\n name: 'Controller - output level in events/15 seconds',\n desc: \"State's outputs in 15 seconds\",\n type: 'number',\n read: true,\n write: false,\n role: 'value',\n unit: 'events/15 seconds',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.eventLoopLag`,\n type: 'state',\n common: {\n name: 'Controller - The Node.js event loop lag in ms, averaged over 15 seconds',\n desc: 'Average Node.js event loop lag in ms',\n type: 'number',\n read: true,\n write: false,\n role: 'value',\n unit: 'ms',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.logLevel`,\n type: 'state',\n common: {\n name: 'Controller - Loglevel',\n type: 'string',\n read: true,\n write: true,\n desc: 'Loglevel of the host process. Will be set on start with defined value but can be overridden during runtime',\n role: 'state',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.pid`,\n type: 'state',\n common: {\n name: 'Controller - Process ID',\n type: 'number',\n read: true,\n write: false,\n role: 'value',\n },\n native: {},\n state: {\n val: process.pid,\n ack: true,\n },\n });\n\n if (config.system.checkDiskInterval) {\n objs.push({\n _id: `${id}.diskSize`,\n type: 'state',\n common: {\n name: `${hostname} - disk total size`,\n desc: 'Disk size of logical volume where the server is installed in MiB',\n type: 'number',\n read: true,\n write: false,\n role: 'value',\n unit: 'MiB',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.diskFree`,\n type: 'state',\n common: {\n name: `${hostname} - disk free size`,\n desc: 'Free disk size of the logical volume where the server is installed in MiB',\n type: 'number',\n read: true,\n write: false,\n role: 'value',\n unit: 'MiB',\n },\n native: {},\n });\n\n objs.push({\n _id: `${id}.diskWarning`,\n type: 'state',\n common: {\n name: `${hostname} - disk warning level`,\n desc: 'Generate a warning if the free disk space is below this value',\n type: 'number',\n read: true,\n write: true,\n def: DEFAULT_DISK_WARNING_LEVEL,\n role: 'level',\n unit: '%',\n },\n native: {},\n });\n }\n\n if (tools.getDockerInformation().isOfficial) {\n objs.push({\n _id: `${id}.availableDockerBuild`,\n type: 'state',\n common: {\n name: 'Last update of the Docker Image',\n desc: 'The timestamp of the last update of the Docker Image',\n type: 'string',\n read: true,\n write: false,\n role: 'date',\n },\n native: {},\n });\n }\n\n return objs;\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["fs"]
|
|
7
7
|
}
|
|
@@ -23,6 +23,4 @@ __export(password_exports, {
|
|
|
23
23
|
module.exports = __toCommonJS(password_exports);
|
|
24
24
|
var import_js_controller_common = require("@iobroker/js-controller-common");
|
|
25
25
|
var password_default = import_js_controller_common.password;
|
|
26
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
27
|
-
0 && (module.exports = {});
|
|
28
26
|
//# sourceMappingURL=password.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/password.ts"],
|
|
4
4
|
"sourcesContent": ["import { password } from '@iobroker/js-controller-common';\n\nexport default password;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;kCAAyB;AAEzB,IAAA,mBAAe;",
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,kCAAyB;AAEzB,IAAA,mBAAe;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -14,6 +14,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
14
14
|
return to;
|
|
15
15
|
};
|
|
16
16
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
17
21
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
18
22
|
mod
|
|
19
23
|
));
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/preinstallCheck.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * we cannot use semver and other dependencies here, because dependencies are\n * not installed yet, so the version checks get a bit messy\n */\n\nimport path from 'node:path';\nimport child_process from 'node:child_process';\n\nconst RECOMMENDED_NPM_VERSION = 8;\n/** Time to wait for npm version determination */\nconst EXEC_TIMEOUT = 10_000;\n/** Duplicated from exitCodes */\nconst EXIT_CODE_CANNOT_INSTALL_NPM_PACKET = 25;\nconst VERSION_COMMAND = 'npm -v';\n\ntype VersionString = `${number}.${number}.${number}`;\ntype VersionObject = { major: number; minor: number; build: number };\ntype Range = { start: VersionString; end: VersionString };\n/** start already unsupported, end is ok again */\nconst UNSUPPORTED_NPM_VERSION_RANGES: Range[] = [{ start: '5.0.0', end: '5.7.1' }];\n\nfunction checkNpmVersion(): Promise<string> {\n return new Promise((resolve, reject) => {\n // Get npm version\n try {\n // remove local node_modules\\.bin dir from path\n // or we potentially get a wrong npm version\n const newEnv = { ...process.env };\n newEnv.PATH = (newEnv.PATH || newEnv.Path || newEnv.path)!\n .split(path.delimiter)\n .filter(dir => {\n dir = dir.toLowerCase();\n return !(dir.includes('iobroker') && dir.includes(path.join('node_modules', '.bin')));\n })\n .join(path.delimiter);\n\n let timer: NodeJS.Timeout | null = setTimeout(() => {\n timer = null;\n reject(new Error('Timeout'));\n }, EXEC_TIMEOUT);\n\n child_process.exec(\n VERSION_COMMAND,\n { encoding: 'utf8', env: newEnv, windowsHide: true },\n (error, stdout, _stderr) => {\n if (timer) {\n const npmVersion = stdout.trim();\n clearTimeout(timer);\n timer = null;\n\n if (!npmVersion) {\n reject(new Error(`Could not determine npm version via \"${VERSION_COMMAND}\"`));\n }\n\n console.log(`NPM version: ${npmVersion}`);\n\n for (const unsupportedVersion of UNSUPPORTED_NPM_VERSION_RANGES) {\n if (gte(npmVersion, unsupportedVersion.start) && lt(npmVersion, unsupportedVersion.end)) {\n console.warn(\n '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!',\n );\n console.warn('WARNING:');\n console.warn('You are using an unsupported npm version!');\n console.warn('This can lead to problems when installing further packages');\n console.warn();\n console.warn(\n `Please use \"npm install -g npm@${RECOMMENDED_NPM_VERSION}\" to upgrade npm to ${RECOMMENDED_NPM_VERSION}.x or `,\n );\n console.warn('use \"npm install -g npm@latest\" to install a supported version of npm!');\n console.warn(\n 'You need to make sure to repeat this step after installing an update to NodeJS and/or npm.',\n );\n console.warn(\n '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!',\n );\n process.exit(EXIT_CODE_CANNOT_INSTALL_NPM_PACKET);\n }\n }\n resolve(npmVersion);\n }\n },\n );\n } catch (e) {\n reject(e as Error);\n }\n });\n}\n\ncheckNpmVersion()\n .catch(err => {\n console.error(`Could not check npm version: ${err.message}`);\n console.error('Assuming that correct version is installed.');\n })\n .then(() => {\n process.exit(0);\n });\n\n// ======================================\n// all the functions to replace `semver`:\n\n/**\n * Parses a version string\n *\n * @param version The version string to parse\n */\nfunction parseVersion(version: string): VersionObject {\n const versionRegExp = /^v?(\\d+)\\.(\\d+)\\.(\\d+).*?/;\n const parsed = versionRegExp.exec(version);\n if (!parsed) {\n throw new Error(`Could not parse version \"${version}\"`);\n }\n\n return {\n major: parseInt(parsed[1]),\n minor: parseInt(parsed[2]),\n build: parseInt(parsed[3]),\n };\n}\n\n/**\n * Checks if v1 > v2\n *\n * @param v1\n * @param v2\n */\nfunction gt(v1: VersionObject | string, v2: VersionObject | string): boolean {\n if (typeof v1 === 'string') {\n v1 = parseVersion(v1);\n }\n if (typeof v2 === 'string') {\n v2 = parseVersion(v2);\n }\n\n if (v1.major > v2.major) {\n return true;\n } else if (v1.major < v2.major) {\n return false;\n }\n\n if (v1.minor > v2.minor) {\n return true;\n } else if (v1.minor < v2.minor) {\n return false;\n }\n\n return v1.build > v2.build;\n}\n\n/**\n * Checks if v1 < v2\n *\n * @param v1\n * @param v2\n */\nfunction lt(v1: VersionObject | string, v2: VersionObject | string): boolean {\n if (typeof v1 === 'string') {\n v1 = parseVersion(v1);\n }\n if (typeof v2 === 'string') {\n v2 = parseVersion(v2);\n }\n\n if (v1.major < v2.major) {\n return true;\n } else if (v1.major > v2.major) {\n return false;\n }\n\n if (v1.minor < v2.minor) {\n return true;\n } else if (v1.minor > v2.minor) {\n return false;\n }\n\n return v1.build < v2.build;\n}\n\n/**\n * Checks if v1 == v2\n *\n * @param v1\n * @param v2\n */\nfunction eq(v1: VersionObject | string, v2: VersionObject | string): boolean {\n if (typeof v1 === 'string') {\n v1 = parseVersion(v1);\n }\n if (typeof v2 === 'string') {\n v2 = parseVersion(v2);\n }\n\n if (v1.major !== v2.major) {\n return false;\n }\n if (v1.minor !== v2.minor) {\n return false;\n }\n return v1.build === v2.build;\n}\n\n/**\n * Checks if v1 >= v2\n *\n * @param v1\n * @param v2\n */\nfunction gte(v1: VersionObject | string, v2: VersionObject | string): boolean {\n return gt(v1, v2) || eq(v1, v2);\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAKA,uBAAiB;AACjB,gCAA0B;AAE1B,MAAM,0BAA0B;AAEhC,MAAM,eAAe;AAErB,MAAM,sCAAsC;AAC5C,MAAM,kBAAkB;AAMxB,MAAM,iCAA0C,CAAC,EAAE,OAAO,SAAS,KAAK,QAAO,CAAE;AAEjF,SAAS,kBAAe;AACpB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAU;AAEnC,QAAI;AAGA,YAAM,SAAS,EAAE,GAAG,QAAQ,IAAG;AAC/B,aAAO,QAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO,MAC/C,MAAM,iBAAAA,QAAK,SAAS,EACpB,OAAO,SAAM;AACV,cAAM,IAAI,YAAW;AACrB,eAAO,EAAE,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,iBAAAA,QAAK,KAAK,gBAAgB,MAAM,CAAC;MACvF,CAAC,EACA,KAAK,iBAAAA,QAAK,SAAS;AAExB,UAAI,QAA+B,WAAW,MAAK;AAC/C,gBAAQ;AACR,eAAO,IAAI,MAAM,SAAS,CAAC;MAC/B,GAAG,YAAY;AAEf,gCAAAC,QAAc,KACV,iBACA,EAAE,UAAU,QAAQ,KAAK,QAAQ,aAAa,KAAI,GAClD,CAAC,OAAO,QAAQ,YAAW;AACvB,YAAI,OAAO;AACP,gBAAM,aAAa,OAAO,KAAI;AAC9B,uBAAa,KAAK;AAClB,kBAAQ;AAER,cAAI,CAAC,YAAY;AACb,mBAAO,IAAI,MAAM,wCAAwC,eAAe,GAAG,CAAC;UAChF;AAEA,kBAAQ,IAAI,gBAAgB,UAAU,EAAE;AAExC,qBAAW,sBAAsB,gCAAgC;AAC7D,gBAAI,IAAI,YAAY,mBAAmB,KAAK,KAAK,GAAG,YAAY,mBAAmB,GAAG,GAAG;AACrF,sBAAQ,KACJ,2EAA2E;AAE/E,sBAAQ,KAAK,UAAU;AACvB,sBAAQ,KAAK,2CAA2C;AACxD,sBAAQ,KAAK,4DAA4D;AACzE,sBAAQ,KAAI;AACZ,sBAAQ,KACJ,kCAAkC,uBAAuB,uBAAuB,uBAAuB,QAAQ;AAEnH,sBAAQ,KAAK,wEAAwE;AACrF,sBAAQ,KACJ,4FAA4F;AAEhG,sBAAQ,KACJ,2EAA2E;AAE/E,sBAAQ,KAAK,mCAAmC;YACpD;UACJ;AACA,kBAAQ,UAAU;QACtB;MACJ,CAAC;IAET,SAAS,GAAG;AACR,aAAO,CAAU;IACrB;EACJ,CAAC;AACL;AAEA,gBAAe,EACV,MAAM,SAAM;AACT,UAAQ,MAAM,gCAAgC,IAAI,OAAO,EAAE;AAC3D,UAAQ,MAAM,6CAA6C;AAC/D,CAAC,EACA,KAAK,MAAK;AACP,UAAQ,KAAK,CAAC;AAClB,CAAC;AAUL,SAAS,aAAa,SAAe;AACjC,QAAM,gBAAgB;AACtB,QAAM,SAAS,cAAc,KAAK,OAAO;AACzC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,MAAM,4BAA4B,OAAO,GAAG;EAC1D;AAEA,SAAO;IACH,OAAO,SAAS,OAAO,CAAC,CAAC;IACzB,OAAO,SAAS,OAAO,CAAC,CAAC;IACzB,OAAO,SAAS,OAAO,CAAC,CAAC;;AAEjC;AAQA,SAAS,GAAG,IAA4B,IAA0B;AAC9D,MAAI,OAAO,OAAO,UAAU;AACxB,SAAK,aAAa,EAAE;EACxB;AACA,MAAI,OAAO,OAAO,UAAU;AACxB,SAAK,aAAa,EAAE;EACxB;AAEA,MAAI,GAAG,QAAQ,GAAG,OAAO;AACrB,WAAO;EACX,WAAW,GAAG,QAAQ,GAAG,OAAO;AAC5B,WAAO;EACX;AAEA,MAAI,GAAG,QAAQ,GAAG,OAAO;AACrB,WAAO;EACX,WAAW,GAAG,QAAQ,GAAG,OAAO;AAC5B,WAAO;EACX;AAEA,SAAO,GAAG,QAAQ,GAAG;AACzB;AAQA,SAAS,GAAG,IAA4B,IAA0B;AAC9D,MAAI,OAAO,OAAO,UAAU;AACxB,SAAK,aAAa,EAAE;EACxB;AACA,MAAI,OAAO,OAAO,UAAU;AACxB,SAAK,aAAa,EAAE;EACxB;AAEA,MAAI,GAAG,QAAQ,GAAG,OAAO;AACrB,WAAO;EACX,WAAW,GAAG,QAAQ,GAAG,OAAO;AAC5B,WAAO;EACX;AAEA,MAAI,GAAG,QAAQ,GAAG,OAAO;AACrB,WAAO;EACX,WAAW,GAAG,QAAQ,GAAG,OAAO;AAC5B,WAAO;EACX;AAEA,SAAO,GAAG,QAAQ,GAAG;AACzB;AAQA,SAAS,GAAG,IAA4B,IAA0B;AAC9D,MAAI,OAAO,OAAO,UAAU;AACxB,SAAK,aAAa,EAAE;EACxB;AACA,MAAI,OAAO,OAAO,UAAU;AACxB,SAAK,aAAa,EAAE;EACxB;AAEA,MAAI,GAAG,UAAU,GAAG,OAAO;AACvB,WAAO;EACX;AACA,MAAI,GAAG,UAAU,GAAG,OAAO;AACvB,WAAO;EACX;AACA,SAAO,GAAG,UAAU,GAAG;AAC3B;AAQA,SAAS,IAAI,IAA4B,IAA0B;AAC/D,SAAO,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE;AAClC;",
|
|
6
6
|
"names": ["path", "child_process"]
|
|
7
7
|
}
|
package/build/cjs/lib/restart.js
CHANGED
|
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
return to;
|
|
19
19
|
};
|
|
20
20
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
25
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
26
|
mod
|
|
23
27
|
));
|
|
@@ -27,12 +31,12 @@ __export(restart_exports, {
|
|
|
27
31
|
default: () => restart
|
|
28
32
|
});
|
|
29
33
|
module.exports = __toCommonJS(restart_exports);
|
|
34
|
+
var __import_meta_url = typeof document === "undefined" ? new (require("url".replace("", ""))).URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
|
|
30
35
|
var import_node_child_process = require("node:child_process");
|
|
31
36
|
var import_node_os = __toESM(require("node:os"), 1);
|
|
32
37
|
var import_tools = require("@iobroker/js-controller-common-db/tools");
|
|
33
38
|
var import_node_path = __toESM(require("node:path"), 1);
|
|
34
39
|
var import_node_url = __toESM(require("node:url"), 1);
|
|
35
|
-
const import_meta = {};
|
|
36
40
|
async function restart(callback) {
|
|
37
41
|
let cmd;
|
|
38
42
|
let args;
|
|
@@ -71,10 +75,8 @@ async function restart(callback) {
|
|
|
71
75
|
setTimeout(() => process.exit(), 500);
|
|
72
76
|
}
|
|
73
77
|
}
|
|
74
|
-
const modulePath = import_node_url.default.fileURLToPath(
|
|
78
|
+
const modulePath = import_node_url.default.fileURLToPath(__import_meta_url || `file://${__filename}`);
|
|
75
79
|
if (process.argv[1] === modulePath) {
|
|
76
80
|
restart();
|
|
77
81
|
}
|
|
78
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
79
|
-
0 && (module.exports = {});
|
|
80
82
|
//# sourceMappingURL=restart.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/lib/restart.ts"],
|
|
4
|
-
"sourcesContent": ["import { spawn } from 'node:child_process';\nimport os from 'node:os';\nimport { execAsync, getRootDir } from '@iobroker/js-controller-common-db/tools';\nimport path from 'node:path';\nimport url from 'node:url';\n\n/**\n * Restarts the js-controller\n *\n * @param callback callback to execute after restart is triggered\n */\nexport default async function restart(callback?: () => void): Promise<void> {\n let cmd;\n let args;\n if (os.platform() === 'win32') {\n // On Windows, we use powershell to restart the service, because execution of bat files is no more possible\n const envPath = path.join(getRootDir(), '.env').replaceAll('\\\\', '\\\\\\\\');\n cmd = `powershell -Command \"$envPath = \\\\\"${envPath}\\\\\";\n $iobServiceName = \\\\\"ioBroker\\\\\";\n if (Test-Path $envPath) {\n foreach ($line in Get-Content $envPath) {\n $line = $line.Trim();\n if ($line -match \\\\\"^\\\\s*iobservicename\\\\s*=\\\\s*(.+)\\\\s*$\\\\\") {\n $iobServiceName = $matches[1].Trim(); break;\n }\n }\n }\n Write-Output \\\\\"Restarting service $iobServiceName.exe\\\\\";Restart-Service \\\\\"$iobServiceName.exe\\\\\" -Force\"`;\n\n // Remove line breaks, because the powershell command will fail otherwise\n cmd = cmd.replace(/[\\r\\n]+/gm, ' ');\n\n try {\n await execAsync(cmd);\n } catch (e) {\n console.error(`Restart failed: ${e.message}`);\n }\n } else {\n // Unix has a global ioBroker binary that delegates to the init system\n // We need to call that, so we don't have two instances of ioBroker running\n cmd = 'iobroker';\n args = ['restart'];\n\n const child = spawn(cmd, args, {\n detached: true,\n stdio: ['ignore', 'ignore', 'ignore'],\n windowsHide: true,\n });\n child.unref();\n }\n if (typeof callback === 'function') {\n setTimeout(() => callback(), 500);\n } else {\n setTimeout(() => process.exit(), 500);\n }\n}\n\n// eslint-disable-next-line unicorn/prefer-module\nconst modulePath = url.fileURLToPath(import.meta.url || `file://${__filename}`);\nif (process.argv[1] === modulePath) {\n restart();\n}\n"],
|
|
5
|
-
"mappings": "
|
|
3
|
+
"sources": ["../../../src/lib/restart.ts", "../../../../../node_modules/@alcalzone/esm2cjs/shims/import.meta.url/shim.js"],
|
|
4
|
+
"sourcesContent": ["import { spawn } from 'node:child_process';\nimport os from 'node:os';\nimport { execAsync, getRootDir } from '@iobroker/js-controller-common-db/tools';\nimport path from 'node:path';\nimport url from 'node:url';\n\n/**\n * Restarts the js-controller\n *\n * @param callback callback to execute after restart is triggered\n */\nexport default async function restart(callback?: () => void): Promise<void> {\n let cmd;\n let args;\n if (os.platform() === 'win32') {\n // On Windows, we use powershell to restart the service, because execution of bat files is no more possible\n const envPath = path.join(getRootDir(), '.env').replaceAll('\\\\', '\\\\\\\\');\n cmd = `powershell -Command \"$envPath = \\\\\"${envPath}\\\\\";\n $iobServiceName = \\\\\"ioBroker\\\\\";\n if (Test-Path $envPath) {\n foreach ($line in Get-Content $envPath) {\n $line = $line.Trim();\n if ($line -match \\\\\"^\\\\s*iobservicename\\\\s*=\\\\s*(.+)\\\\s*$\\\\\") {\n $iobServiceName = $matches[1].Trim(); break;\n }\n }\n }\n Write-Output \\\\\"Restarting service $iobServiceName.exe\\\\\";Restart-Service \\\\\"$iobServiceName.exe\\\\\" -Force\"`;\n\n // Remove line breaks, because the powershell command will fail otherwise\n cmd = cmd.replace(/[\\r\\n]+/gm, ' ');\n\n try {\n await execAsync(cmd);\n } catch (e) {\n console.error(`Restart failed: ${e.message}`);\n }\n } else {\n // Unix has a global ioBroker binary that delegates to the init system\n // We need to call that, so we don't have two instances of ioBroker running\n cmd = 'iobroker';\n args = ['restart'];\n\n const child = spawn(cmd, args, {\n detached: true,\n stdio: ['ignore', 'ignore', 'ignore'],\n windowsHide: true,\n });\n child.unref();\n }\n if (typeof callback === 'function') {\n setTimeout(() => callback(), 500);\n } else {\n setTimeout(() => process.exit(), 500);\n }\n}\n\n// eslint-disable-next-line unicorn/prefer-module\nconst modulePath = url.fileURLToPath(import.meta.url || `file://${__filename}`);\nif (process.argv[1] === modulePath) {\n restart();\n}\n", "export const __import_meta_url =\n typeof document === 'undefined' ? new (require('url'.replace('', '')).URL)('file:' + __filename).href :\n (document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;ACAO,IAAM,oBACX,OAAO,aAAa,cAAc,KAAK,QAAQ,MAAM,QAAQ,IAAI,EAAE,CAAC,GAAE,IAAK,UAAU,UAAU,EAAE,OAC9F,SAAS,iBAAiB,SAAS,cAAc,OAAO,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;ADFlG,gCAAsB;AACtB,qBAAe;AACf,mBAAsC;AACtC,uBAAiB;AACjB,sBAAgB;AAOhB,eAAO,QAA+B,UAAqB;AACvD,MAAI;AACJ,MAAI;AACJ,MAAI,eAAAA,QAAG,SAAQ,MAAO,SAAS;AAE3B,UAAM,UAAU,iBAAAC,QAAK,SAAK,yBAAU,GAAI,MAAM,EAAE,WAAW,MAAM,MAAM;AACvE,UAAM,sCAAsC,OAAO;;;;;;;;;;;AAanD,UAAM,IAAI,QAAQ,aAAa,GAAG;AAElC,QAAI;AACA,gBAAM,wBAAU,GAAG;IACvB,SAAS,GAAG;AACR,cAAQ,MAAM,mBAAmB,EAAE,OAAO,EAAE;IAChD;EACJ,OAAO;AAGH,UAAM;AACN,WAAO,CAAC,SAAS;AAEjB,UAAM,YAAQ,iCAAM,KAAK,MAAM;MAC3B,UAAU;MACV,OAAO,CAAC,UAAU,UAAU,QAAQ;MACpC,aAAa;KAChB;AACD,UAAM,MAAK;EACf;AACA,MAAI,OAAO,aAAa,YAAY;AAChC,eAAW,MAAM,SAAQ,GAAI,GAAG;EACpC,OAAO;AACH,eAAW,MAAM,QAAQ,KAAI,GAAI,GAAG;EACxC;AACJ;AAGA,MAAM,aAAa,gBAAAC,QAAI,cAAc,qBAAmB,UAAU,UAAU,EAAE;AAC9E,IAAI,QAAQ,KAAK,CAAC,MAAM,YAAY;AAChC,UAAO;AACX;",
|
|
6
6
|
"names": ["os", "path", "url"]
|
|
7
7
|
}
|
|
@@ -24,6 +24,4 @@ module.exports = __toCommonJS(statesInMemClient_exports);
|
|
|
24
24
|
var import_db_states_redis = require("@iobroker/db-states-redis");
|
|
25
25
|
console.warn('Deprecated! Please use require("@iobroker/db-states-redis").Client library in tests!');
|
|
26
26
|
var statesInMemClient_default = import_db_states_redis.Client;
|
|
27
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
-
0 && (module.exports = {});
|
|
29
27
|
//# sourceMappingURL=statesInMemClient.js.map
|
|
@@ -24,6 +24,4 @@ module.exports = __toCommonJS(statesInMemServer_exports);
|
|
|
24
24
|
var import_db_states_file = require("@iobroker/db-states-file");
|
|
25
25
|
console.warn('Deprecated! Please use require("@iobroker/db-states-file").Server in tests to start a server and then use require("@iobroker/db-states-file").Client to connect with a client against this server!');
|
|
26
26
|
var statesInMemServer_default = import_db_states_file.Server;
|
|
27
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
-
0 && (module.exports = {});
|
|
29
27
|
//# sourceMappingURL=statesInMemServer.js.map
|
package/build/cjs/lib/tools.js
CHANGED
|
@@ -23,6 +23,4 @@ __export(tools_exports, {
|
|
|
23
23
|
module.exports = __toCommonJS(tools_exports);
|
|
24
24
|
var import_js_controller_common = require("@iobroker/js-controller-common");
|
|
25
25
|
var tools_default = import_js_controller_common.tools;
|
|
26
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
27
|
-
0 && (module.exports = {});
|
|
28
26
|
//# sourceMappingURL=tools.js.map
|
|
@@ -14,9 +14,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
14
14
|
return to;
|
|
15
15
|
};
|
|
16
16
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
17
21
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
18
22
|
mod
|
|
19
23
|
));
|
|
24
|
+
var __import_meta_url = typeof document === "undefined" ? new (require("url".replace("", ""))).URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
|
|
20
25
|
var import_promisify_child_process = require("promisify-child-process");
|
|
21
26
|
var import_js_controller_common = require("@iobroker/js-controller-common");
|
|
22
27
|
var import_semver = require("semver");
|
|
@@ -27,23 +32,34 @@ var import_promises = require("node:timers/promises");
|
|
|
27
32
|
var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
28
33
|
var import_node_url = __toESM(require("node:url"), 1);
|
|
29
34
|
var import_node_process = __toESM(require("node:process"), 1);
|
|
30
|
-
const import_meta = {};
|
|
31
35
|
class UpgradeManager {
|
|
36
|
+
/** Wait ms until controller is stopped */
|
|
32
37
|
STOP_TIMEOUT_MS = 5e3;
|
|
38
|
+
/** Wait ms for delivery of final response */
|
|
33
39
|
SHUTDOWN_TIMEOUT = 1e4;
|
|
40
|
+
/** Instance of admin to get information from */
|
|
34
41
|
adminInstance;
|
|
42
|
+
/** Desired controller version */
|
|
35
43
|
version;
|
|
44
|
+
/** Group id the process should run as */
|
|
36
45
|
gid;
|
|
46
|
+
/** User id the process should run as */
|
|
37
47
|
uid;
|
|
48
|
+
/** Response send by webserver */
|
|
38
49
|
response = {
|
|
39
50
|
running: true,
|
|
40
51
|
stderr: [],
|
|
41
52
|
stdout: []
|
|
42
53
|
};
|
|
54
|
+
/** Used to stop the stop shutdown timeout */
|
|
43
55
|
shutdownAbortController;
|
|
56
|
+
/** Logger to log to file and other transports */
|
|
44
57
|
logger;
|
|
58
|
+
/** The server used for communicating upgrade status */
|
|
45
59
|
server;
|
|
60
|
+
/** All socket connections of the webserver */
|
|
46
61
|
sockets = /* @__PURE__ */ new Set();
|
|
62
|
+
/** Name of the host for logging purposes */
|
|
47
63
|
hostname = import_js_controller_common.tools.getHostName();
|
|
48
64
|
constructor(args) {
|
|
49
65
|
this.adminInstance = args.adminInstance;
|
|
@@ -53,6 +69,9 @@ class UpgradeManager {
|
|
|
53
69
|
this.uid = args.uid;
|
|
54
70
|
this.applyUser();
|
|
55
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* To prevent commands (including npm) running as root, we apply the passed in gid and uid
|
|
74
|
+
*/
|
|
56
75
|
applyUser() {
|
|
57
76
|
if (!import_node_process.default.setuid || !import_node_process.default.setgid) {
|
|
58
77
|
const errMessage = "Cannot ensure user and group ids on this system, because no POSIX platform";
|
|
@@ -68,10 +87,16 @@ class UpgradeManager {
|
|
|
68
87
|
throw new Error(errMessage);
|
|
69
88
|
}
|
|
70
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Set up the logger, to stream to file and other configured transports
|
|
92
|
+
*/
|
|
71
93
|
setupLogger() {
|
|
72
94
|
const config = import_fs_extra.default.readJSONSync(import_js_controller_common.tools.getConfigFileName());
|
|
73
95
|
return (0, import_js_controller_common.logger)({ ...config.log, noStdout: false });
|
|
74
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Parse the commands from the cli
|
|
99
|
+
*/
|
|
75
100
|
static parseCliCommands() {
|
|
76
101
|
const additionalArgs = import_node_process.default.argv.slice(2);
|
|
77
102
|
const version = additionalArgs[0];
|
|
@@ -97,6 +122,12 @@ class UpgradeManager {
|
|
|
97
122
|
}
|
|
98
123
|
return { version, adminInstance, uid, gid };
|
|
99
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Log via console and provide the logs for the server too
|
|
127
|
+
*
|
|
128
|
+
* @param message the message which will be logged
|
|
129
|
+
* @param error if it is an error
|
|
130
|
+
*/
|
|
100
131
|
log(message, error = false) {
|
|
101
132
|
if (error) {
|
|
102
133
|
this.logger.error(`host.${this.hostname} [CONTROLLER_AUTO_UPGRADE] ${message}`);
|
|
@@ -106,6 +137,9 @@ class UpgradeManager {
|
|
|
106
137
|
this.logger.info(`host.${this.hostname} [CONTROLLER_AUTO_UPGRADE] ${message}`);
|
|
107
138
|
this.response.stdout.push(message);
|
|
108
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Stops the js-controller via cli call
|
|
142
|
+
*/
|
|
109
143
|
async stopController() {
|
|
110
144
|
if (import_js_controller_common.tools.isDocker()) {
|
|
111
145
|
await (0, import_promisify_child_process.exec)("/opt/scripts/maintenance.sh on -kbn");
|
|
@@ -114,15 +148,24 @@ class UpgradeManager {
|
|
|
114
148
|
}
|
|
115
149
|
await (0, import_promises.setTimeout)(this.STOP_TIMEOUT_MS);
|
|
116
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Starts the js-controller via cli
|
|
153
|
+
*/
|
|
117
154
|
startController() {
|
|
118
155
|
if (import_js_controller_common.tools.isDocker()) {
|
|
119
156
|
return (0, import_promisify_child_process.exec)("/opt/scripts/maintenance.sh off -y");
|
|
120
157
|
}
|
|
121
158
|
return (0, import_promisify_child_process.exec)(`${import_js_controller_common.tools.appNameLowerCase} start`);
|
|
122
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Print how the module should be used
|
|
162
|
+
*/
|
|
123
163
|
static printUsage() {
|
|
124
164
|
console.info('Example usage: "node upgradeManager.js <version> <adminInstance> <uid> <gid>"');
|
|
125
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Install given version of js-controller
|
|
168
|
+
*/
|
|
126
169
|
async npmInstall() {
|
|
127
170
|
const res = await import_js_controller_common.tools.installNodeModule(`iobroker.js-controller@${this.version}`, {
|
|
128
171
|
cwd: "/opt/iobroker",
|
|
@@ -135,6 +178,11 @@ class UpgradeManager {
|
|
|
135
178
|
throw new Error(`Could not install js-controller@${this.version}`);
|
|
136
179
|
}
|
|
137
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Starts the web server for admin communication either secure or insecure
|
|
183
|
+
*
|
|
184
|
+
* @param params Web server configuration
|
|
185
|
+
*/
|
|
138
186
|
startWebServer(params) {
|
|
139
187
|
const { useHttps } = params;
|
|
140
188
|
if (useHttps) {
|
|
@@ -143,6 +191,9 @@ class UpgradeManager {
|
|
|
143
191
|
this.startInsecureWebServer(params);
|
|
144
192
|
}
|
|
145
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Shuts down the server, restarts the controller and exits the program
|
|
196
|
+
*/
|
|
146
197
|
shutdownApp() {
|
|
147
198
|
if (this.shutdownAbortController) {
|
|
148
199
|
this.shutdownAbortController.abort();
|
|
@@ -157,12 +208,20 @@ class UpgradeManager {
|
|
|
157
208
|
import_node_process.default.exit();
|
|
158
209
|
});
|
|
159
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* Destroy all sockets, to prevent requests from keeping server alive
|
|
213
|
+
*/
|
|
160
214
|
destroySockets() {
|
|
161
215
|
for (const socket of this.sockets) {
|
|
162
216
|
socket.destroy();
|
|
163
217
|
this.sockets.delete(socket);
|
|
164
218
|
}
|
|
165
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* This function is called when the webserver receives a message
|
|
222
|
+
*
|
|
223
|
+
* @param res server response
|
|
224
|
+
*/
|
|
166
225
|
webServerCallback(res) {
|
|
167
226
|
res.writeHead(200, {
|
|
168
227
|
"Access-Control-Allow-Origin": "*"
|
|
@@ -173,6 +232,11 @@ class UpgradeManager {
|
|
|
173
232
|
this.shutdownApp();
|
|
174
233
|
}
|
|
175
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Start an insecure web server for admin communication
|
|
237
|
+
*
|
|
238
|
+
* @param params Web server configuration
|
|
239
|
+
*/
|
|
176
240
|
startInsecureWebServer(params) {
|
|
177
241
|
const { port } = params;
|
|
178
242
|
this.server = import_node_http.default.createServer((_req, res) => {
|
|
@@ -183,6 +247,11 @@ class UpgradeManager {
|
|
|
183
247
|
this.log(`Server is running on http://localhost:${port}`);
|
|
184
248
|
});
|
|
185
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* Start a secure web server for admin communication
|
|
252
|
+
*
|
|
253
|
+
* @param params Web server configuration
|
|
254
|
+
*/
|
|
186
255
|
startSecureWebServer(params) {
|
|
187
256
|
const { port, certPublic, certPrivate } = params;
|
|
188
257
|
this.server = import_node_https.default.createServer({ key: certPrivate, cert: certPublic }, (_req, res) => {
|
|
@@ -193,6 +262,11 @@ class UpgradeManager {
|
|
|
193
262
|
this.log(`Server is running on https://localhost:${port}`);
|
|
194
263
|
});
|
|
195
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* Keep track of all existing sockets
|
|
267
|
+
*
|
|
268
|
+
* @param server the webserver
|
|
269
|
+
*/
|
|
196
270
|
monitorSockets(server) {
|
|
197
271
|
server.on("connection", (socket) => {
|
|
198
272
|
this.sockets.add(socket);
|
|
@@ -201,6 +275,11 @@ class UpgradeManager {
|
|
|
201
275
|
});
|
|
202
276
|
});
|
|
203
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* Get certificates from the DB
|
|
280
|
+
*
|
|
281
|
+
* @param params certificate information
|
|
282
|
+
*/
|
|
204
283
|
async getCertificates(params) {
|
|
205
284
|
const { objects, certPublicName, certPrivateName } = params;
|
|
206
285
|
const obj = await objects.getObjectAsync("system.certificates");
|
|
@@ -210,6 +289,9 @@ class UpgradeManager {
|
|
|
210
289
|
const certs = obj.native.certificates;
|
|
211
290
|
return { certPrivate: certs[certPrivateName], certPublic: certs[certPublicName] };
|
|
212
291
|
}
|
|
292
|
+
/**
|
|
293
|
+
* Collect parameters for webserver from admin instance
|
|
294
|
+
*/
|
|
213
295
|
async collectWebServerParameters() {
|
|
214
296
|
const { objects } = await (0, import_js_controller_cli.dbConnectAsync)(false);
|
|
215
297
|
const obj = await objects.getObjectAsync(`system.adapter.admin.${this.adminInstance}`);
|
|
@@ -236,10 +318,16 @@ class UpgradeManager {
|
|
|
236
318
|
port: obj.native.port
|
|
237
319
|
};
|
|
238
320
|
}
|
|
321
|
+
/**
|
|
322
|
+
* Tells the upgrade manager, that server can be shut down on next response or on timeout
|
|
323
|
+
*/
|
|
239
324
|
async setFinished() {
|
|
240
325
|
this.response.running = false;
|
|
241
326
|
await this.startShutdownTimeout();
|
|
242
327
|
}
|
|
328
|
+
/**
|
|
329
|
+
* Start a timeout which starts controller and shuts down the app if expired
|
|
330
|
+
*/
|
|
243
331
|
async startShutdownTimeout() {
|
|
244
332
|
this.shutdownAbortController = new AbortController();
|
|
245
333
|
try {
|
|
@@ -277,7 +365,7 @@ function registerErrorHandlers(upgradeManager) {
|
|
|
277
365
|
upgradeManager.log(`Unhandled rejection: ${rej instanceof Error ? rej.stack : JSON.stringify(rej)}`, true);
|
|
278
366
|
});
|
|
279
367
|
}
|
|
280
|
-
const modulePath = import_node_url.default.fileURLToPath(
|
|
368
|
+
const modulePath = import_node_url.default.fileURLToPath(__import_meta_url || `file://${__filename}`);
|
|
281
369
|
if (import_node_process.default.argv[1] === modulePath) {
|
|
282
370
|
main();
|
|
283
371
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/lib/upgradeManager.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ChildProcessPromise, exec as execAsync } from 'promisify-child-process';\nimport { tools, logger } from '@iobroker/js-controller-common';\nimport { valid } from 'semver';\nimport { dbConnectAsync } from '@iobroker/js-controller-cli';\nimport http from 'node:http';\nimport https from 'node:https';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport { setTimeout as wait } from 'node:timers/promises';\nimport type { Logger } from 'winston';\nimport fs from 'fs-extra';\nimport type { Socket } from 'node:net';\nimport type { Duplex } from 'node:stream';\nimport url from 'node:url';\nimport process from 'node:process';\n\n/** The upgrade arguments provided to the constructor of the UpgradeManager */\nexport interface UpgradeArguments {\n /** Version of controller to upgrade too */\n version: string;\n /** Admin instance which triggered the upgrade */\n adminInstance: number;\n /** User id the process should run as */\n uid: number;\n /** Group id the process should run as */\n gid: number;\n}\n\ninterface Certificates {\n /** Public certificate */\n certPublic: string;\n /** Private certificate */\n certPrivate: string;\n}\n\ninterface InsecureWebServerParameters {\n /** if https should be used for the webserver */\n useHttps: false;\n /** port of the web server */\n port: number;\n}\n\ntype SecureWebServerParameters = Omit<InsecureWebServerParameters, 'useHttps'> & { useHttps: true } & Certificates;\ntype WebServerParameters = InsecureWebServerParameters | SecureWebServerParameters;\n\ninterface GetCertificatesParams {\n /** The objects DB */\n objects: ObjectsClient;\n /** Name of the public certificate */\n certPublicName: string;\n /** Name of the private certificate */\n certPrivateName: string;\n}\n\ninterface ServerResponse {\n /** If the update is still running */\n running: boolean;\n stderr: string[];\n stdout: string[];\n /** if installation process succeeded */\n success?: boolean;\n}\n\nclass UpgradeManager {\n /** Wait ms until controller is stopped */\n private readonly STOP_TIMEOUT_MS = 5_000;\n /** Wait ms for delivery of final response */\n private readonly SHUTDOWN_TIMEOUT = 10_000;\n /** Instance of admin to get information from */\n private readonly adminInstance: number;\n /** Desired controller version */\n private readonly version: string;\n /** Group id the process should run as */\n private readonly gid: number;\n /** User id the process should run as */\n private readonly uid: number;\n /** Response send by webserver */\n private readonly response: ServerResponse = {\n running: true,\n stderr: [],\n stdout: [],\n };\n /** Used to stop the stop shutdown timeout */\n private shutdownAbortController?: AbortController;\n /** Logger to log to file and other transports */\n private readonly logger: Logger;\n\n /** The server used for communicating upgrade status */\n private server?: https.Server | http.Server;\n /** All socket connections of the webserver */\n private sockets = new Set<Socket | Duplex>();\n /** Name of the host for logging purposes */\n private readonly hostname = tools.getHostName();\n\n constructor(args: UpgradeArguments) {\n this.adminInstance = args.adminInstance;\n this.version = args.version;\n this.logger = this.setupLogger();\n this.gid = args.gid;\n this.uid = args.uid;\n\n this.applyUser();\n }\n\n /**\n * To prevent commands (including npm) running as root, we apply the passed in gid and uid\n */\n private applyUser(): void {\n if (!process.setuid || !process.setgid) {\n const errMessage = 'Cannot ensure user and group ids on this system, because no POSIX platform';\n this.log(errMessage, true);\n throw new Error(errMessage);\n }\n\n try {\n process.setgid(this.gid);\n process.setuid(this.uid);\n } catch (e) {\n const errMessage = `Could not ensure user and group ids on this system: ${e.message}`;\n this.log(errMessage, true);\n throw new Error(errMessage);\n }\n }\n\n /**\n * Set up the logger, to stream to file and other configured transports\n */\n private setupLogger(): Logger {\n const config = fs.readJSONSync(tools.getConfigFileName());\n return logger({ ...config.log, noStdout: false });\n }\n\n /**\n * Parse the commands from the cli\n */\n static parseCliCommands(): UpgradeArguments {\n const additionalArgs = process.argv.slice(2);\n\n const version = additionalArgs[0];\n const adminInstance = parseInt(additionalArgs[1]);\n const uid = parseInt(additionalArgs[2]);\n const gid = parseInt(additionalArgs[3]);\n\n const isValid = !!valid(version);\n\n if (!isValid) {\n UpgradeManager.printUsage();\n throw new Error('The provided version is not valid');\n }\n\n if (isNaN(adminInstance)) {\n UpgradeManager.printUsage();\n throw new Error('Please provide a valid admin instance');\n }\n\n if (isNaN(uid)) {\n UpgradeManager.printUsage();\n throw new Error('Please provide a valid uid');\n }\n\n if (isNaN(gid)) {\n UpgradeManager.printUsage();\n throw new Error('Please provide a valid gid');\n }\n\n return { version, adminInstance, uid, gid };\n }\n\n /**\n * Log via console and provide the logs for the server too\n *\n * @param message the message which will be logged\n * @param error if it is an error\n */\n log(message: string, error = false): void {\n if (error) {\n this.logger.error(`host.${this.hostname} [CONTROLLER_AUTO_UPGRADE] ${message}`);\n this.response.stderr.push(message);\n return;\n }\n\n this.logger.info(`host.${this.hostname} [CONTROLLER_AUTO_UPGRADE] ${message}`);\n this.response.stdout.push(message);\n }\n\n /**\n * Stops the js-controller via cli call\n */\n async stopController(): Promise<void> {\n if (tools.isDocker()) {\n await execAsync('/opt/scripts/maintenance.sh on -kbn');\n } else {\n await execAsync(`${tools.appNameLowerCase} stop`);\n }\n await wait(this.STOP_TIMEOUT_MS);\n }\n\n /**\n * Starts the js-controller via cli\n */\n startController(): ChildProcessPromise {\n if (tools.isDocker()) {\n return execAsync('/opt/scripts/maintenance.sh off -y');\n }\n\n return execAsync(`${tools.appNameLowerCase} start`);\n }\n\n /**\n * Print how the module should be used\n */\n static printUsage(): void {\n console.info('Example usage: \"node upgradeManager.js <version> <adminInstance> <uid> <gid>\"');\n }\n\n /**\n * Install given version of js-controller\n */\n async npmInstall(): Promise<void> {\n const res = await tools.installNodeModule(`iobroker.js-controller@${this.version}`, {\n cwd: '/opt/iobroker',\n debug: true,\n });\n\n this.response.stderr.push(...res.stderr.split('\\n'));\n this.response.stdout.push(...res.stdout.split('\\n'));\n\n this.response.success = res.success;\n\n if (!res.success) {\n throw new Error(`Could not install js-controller@${this.version}`);\n }\n }\n\n /**\n * Starts the web server for admin communication either secure or insecure\n *\n * @param params Web server configuration\n */\n startWebServer(params: WebServerParameters): void {\n const { useHttps } = params;\n if (useHttps) {\n this.startSecureWebServer(params);\n } else {\n this.startInsecureWebServer(params);\n }\n }\n\n /**\n * Shuts down the server, restarts the controller and exits the program\n */\n shutdownApp(): void {\n if (this.shutdownAbortController) {\n this.shutdownAbortController.abort();\n }\n\n if (!this.server) {\n process.exit();\n }\n\n this.destroySockets();\n\n this.server.close(async () => {\n await this.startController();\n this.log('Successfully started js-controller');\n\n process.exit();\n });\n }\n\n /**\n * Destroy all sockets, to prevent requests from keeping server alive\n */\n destroySockets(): void {\n for (const socket of this.sockets) {\n socket.destroy();\n this.sockets.delete(socket);\n }\n }\n\n /**\n * This function is called when the webserver receives a message\n *\n * @param res server response\n */\n webServerCallback(res: http.ServerResponse): void {\n res.writeHead(200, {\n 'Access-Control-Allow-Origin': '*',\n });\n\n res.end(JSON.stringify(this.response));\n\n if (!this.response.running) {\n this.log('Final information delivered');\n this.shutdownApp();\n }\n }\n\n /**\n * Start an insecure web server for admin communication\n *\n * @param params Web server configuration\n */\n startInsecureWebServer(params: InsecureWebServerParameters): void {\n const { port } = params;\n\n this.server = http.createServer((_req, res) => {\n this.webServerCallback(res);\n });\n\n this.monitorSockets(this.server);\n\n this.server.listen(port, () => {\n this.log(`Server is running on http://localhost:${port}`);\n });\n }\n\n /**\n * Start a secure web server for admin communication\n *\n * @param params Web server configuration\n */\n startSecureWebServer(params: SecureWebServerParameters): void {\n const { port, certPublic, certPrivate } = params;\n\n this.server = https.createServer({ key: certPrivate, cert: certPublic }, (_req, res) => {\n this.webServerCallback(res);\n });\n\n this.monitorSockets(this.server);\n\n this.server.listen(port, () => {\n this.log(`Server is running on https://localhost:${port}`);\n });\n }\n\n /**\n * Keep track of all existing sockets\n *\n * @param server the webserver\n */\n monitorSockets(server: http.Server | https.Server): void {\n server.on('connection', socket => {\n this.sockets.add(socket);\n\n server.once('close', () => {\n this.sockets.delete(socket);\n });\n });\n }\n\n /**\n * Get certificates from the DB\n *\n * @param params certificate information\n */\n async getCertificates(params: GetCertificatesParams): Promise<Certificates> {\n const { objects, certPublicName, certPrivateName } = params;\n\n const obj = await objects.getObjectAsync('system.certificates');\n\n if (!obj) {\n throw new Error('No certificates found');\n }\n\n const certs = obj.native.certificates;\n\n return { certPrivate: certs[certPrivateName], certPublic: certs[certPublicName] };\n }\n\n /**\n * Collect parameters for webserver from admin instance\n */\n async collectWebServerParameters(): Promise<WebServerParameters> {\n const { objects } = await dbConnectAsync(false);\n\n const obj = await objects.getObjectAsync(`system.adapter.admin.${this.adminInstance}`);\n\n if (!obj) {\n UpgradeManager.printUsage();\n throw new Error('Please provide a valid admin instance');\n }\n\n if (obj.native.secure) {\n const { certPublic: certPublicName, certPrivate: certPrivateName } = obj.native;\n const { certPublic, certPrivate } = await this.getCertificates({\n objects,\n certPublicName,\n certPrivateName,\n });\n\n return {\n useHttps: obj.native.secure,\n port: obj.native.port,\n certPublic,\n certPrivate,\n };\n }\n\n return {\n useHttps: false,\n port: obj.native.port,\n };\n }\n\n /**\n * Tells the upgrade manager, that server can be shut down on next response or on timeout\n */\n async setFinished(): Promise<void> {\n this.response.running = false;\n\n await this.startShutdownTimeout();\n }\n\n /**\n * Start a timeout which starts controller and shuts down the app if expired\n */\n async startShutdownTimeout(): Promise<void> {\n this.shutdownAbortController = new AbortController();\n try {\n await wait(this.SHUTDOWN_TIMEOUT, null, { signal: this.shutdownAbortController.signal });\n\n this.log('Timeout expired, initializing shutdown');\n this.shutdownApp();\n } catch (e) {\n if (e.code !== 'ABORT_ERR') {\n this.log(e.message, true);\n }\n }\n }\n}\n\n/**\n * Main logic\n */\nasync function main(): Promise<void> {\n const upgradeArguments = UpgradeManager.parseCliCommands();\n const upgradeManager = new UpgradeManager(upgradeArguments);\n registerErrorHandlers(upgradeManager);\n\n const webServerParameters = await upgradeManager.collectWebServerParameters();\n\n upgradeManager.log('Stopping controller');\n await upgradeManager.stopController();\n upgradeManager.log('Successfully stopped js-controller');\n\n upgradeManager.startWebServer(webServerParameters);\n\n try {\n await upgradeManager.npmInstall();\n } catch (e) {\n upgradeManager.log(e.message, true);\n }\n\n await upgradeManager.setFinished();\n}\n\n/**\n * Stream unhandled errors to the log files\n *\n * @param upgradeManager the instance of Upgrade Manager\n */\nfunction registerErrorHandlers(upgradeManager: UpgradeManager): void {\n process.on('uncaughtException', e => {\n upgradeManager.log(`Uncaught Exception: ${e.stack}`, true);\n });\n\n process.on('unhandledRejection', rej => {\n upgradeManager.log(`Unhandled rejection: ${rej instanceof Error ? rej.stack : JSON.stringify(rej)}`, true);\n });\n}\n\n/**\n * This file always needs to be executed in a process different from js-controller\n * else it will be canceled when the file itself stops the controller\n */\n// eslint-disable-next-line unicorn/prefer-module\nconst modulePath = url.fileURLToPath(import.meta.url || `file://${__filename}`);\nif (process.argv[1] === modulePath) {\n main();\n}\n"],
|
|
5
|
-
"mappings": "
|
|
3
|
+
"sources": ["../../../../../node_modules/@alcalzone/esm2cjs/shims/import.meta.url/shim.js", "../../../src/lib/upgradeManager.ts"],
|
|
4
|
+
"sourcesContent": ["export const __import_meta_url =\n typeof document === 'undefined' ? new (require('url'.replace('', '')).URL)('file:' + __filename).href :\n (document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href)\n", "import { type ChildProcessPromise, exec as execAsync } from 'promisify-child-process';\nimport { tools, logger } from '@iobroker/js-controller-common';\nimport { valid } from 'semver';\nimport { dbConnectAsync } from '@iobroker/js-controller-cli';\nimport http from 'node:http';\nimport https from 'node:https';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport { setTimeout as wait } from 'node:timers/promises';\nimport type { Logger } from 'winston';\nimport fs from 'fs-extra';\nimport type { Socket } from 'node:net';\nimport type { Duplex } from 'node:stream';\nimport url from 'node:url';\nimport process from 'node:process';\n\n/** The upgrade arguments provided to the constructor of the UpgradeManager */\nexport interface UpgradeArguments {\n /** Version of controller to upgrade too */\n version: string;\n /** Admin instance which triggered the upgrade */\n adminInstance: number;\n /** User id the process should run as */\n uid: number;\n /** Group id the process should run as */\n gid: number;\n}\n\ninterface Certificates {\n /** Public certificate */\n certPublic: string;\n /** Private certificate */\n certPrivate: string;\n}\n\ninterface InsecureWebServerParameters {\n /** if https should be used for the webserver */\n useHttps: false;\n /** port of the web server */\n port: number;\n}\n\ntype SecureWebServerParameters = Omit<InsecureWebServerParameters, 'useHttps'> & { useHttps: true } & Certificates;\ntype WebServerParameters = InsecureWebServerParameters | SecureWebServerParameters;\n\ninterface GetCertificatesParams {\n /** The objects DB */\n objects: ObjectsClient;\n /** Name of the public certificate */\n certPublicName: string;\n /** Name of the private certificate */\n certPrivateName: string;\n}\n\ninterface ServerResponse {\n /** If the update is still running */\n running: boolean;\n stderr: string[];\n stdout: string[];\n /** if installation process succeeded */\n success?: boolean;\n}\n\nclass UpgradeManager {\n /** Wait ms until controller is stopped */\n private readonly STOP_TIMEOUT_MS = 5_000;\n /** Wait ms for delivery of final response */\n private readonly SHUTDOWN_TIMEOUT = 10_000;\n /** Instance of admin to get information from */\n private readonly adminInstance: number;\n /** Desired controller version */\n private readonly version: string;\n /** Group id the process should run as */\n private readonly gid: number;\n /** User id the process should run as */\n private readonly uid: number;\n /** Response send by webserver */\n private readonly response: ServerResponse = {\n running: true,\n stderr: [],\n stdout: [],\n };\n /** Used to stop the stop shutdown timeout */\n private shutdownAbortController?: AbortController;\n /** Logger to log to file and other transports */\n private readonly logger: Logger;\n\n /** The server used for communicating upgrade status */\n private server?: https.Server | http.Server;\n /** All socket connections of the webserver */\n private sockets = new Set<Socket | Duplex>();\n /** Name of the host for logging purposes */\n private readonly hostname = tools.getHostName();\n\n constructor(args: UpgradeArguments) {\n this.adminInstance = args.adminInstance;\n this.version = args.version;\n this.logger = this.setupLogger();\n this.gid = args.gid;\n this.uid = args.uid;\n\n this.applyUser();\n }\n\n /**\n * To prevent commands (including npm) running as root, we apply the passed in gid and uid\n */\n private applyUser(): void {\n if (!process.setuid || !process.setgid) {\n const errMessage = 'Cannot ensure user and group ids on this system, because no POSIX platform';\n this.log(errMessage, true);\n throw new Error(errMessage);\n }\n\n try {\n process.setgid(this.gid);\n process.setuid(this.uid);\n } catch (e) {\n const errMessage = `Could not ensure user and group ids on this system: ${e.message}`;\n this.log(errMessage, true);\n throw new Error(errMessage);\n }\n }\n\n /**\n * Set up the logger, to stream to file and other configured transports\n */\n private setupLogger(): Logger {\n const config = fs.readJSONSync(tools.getConfigFileName());\n return logger({ ...config.log, noStdout: false });\n }\n\n /**\n * Parse the commands from the cli\n */\n static parseCliCommands(): UpgradeArguments {\n const additionalArgs = process.argv.slice(2);\n\n const version = additionalArgs[0];\n const adminInstance = parseInt(additionalArgs[1]);\n const uid = parseInt(additionalArgs[2]);\n const gid = parseInt(additionalArgs[3]);\n\n const isValid = !!valid(version);\n\n if (!isValid) {\n UpgradeManager.printUsage();\n throw new Error('The provided version is not valid');\n }\n\n if (isNaN(adminInstance)) {\n UpgradeManager.printUsage();\n throw new Error('Please provide a valid admin instance');\n }\n\n if (isNaN(uid)) {\n UpgradeManager.printUsage();\n throw new Error('Please provide a valid uid');\n }\n\n if (isNaN(gid)) {\n UpgradeManager.printUsage();\n throw new Error('Please provide a valid gid');\n }\n\n return { version, adminInstance, uid, gid };\n }\n\n /**\n * Log via console and provide the logs for the server too\n *\n * @param message the message which will be logged\n * @param error if it is an error\n */\n log(message: string, error = false): void {\n if (error) {\n this.logger.error(`host.${this.hostname} [CONTROLLER_AUTO_UPGRADE] ${message}`);\n this.response.stderr.push(message);\n return;\n }\n\n this.logger.info(`host.${this.hostname} [CONTROLLER_AUTO_UPGRADE] ${message}`);\n this.response.stdout.push(message);\n }\n\n /**\n * Stops the js-controller via cli call\n */\n async stopController(): Promise<void> {\n if (tools.isDocker()) {\n await execAsync('/opt/scripts/maintenance.sh on -kbn');\n } else {\n await execAsync(`${tools.appNameLowerCase} stop`);\n }\n await wait(this.STOP_TIMEOUT_MS);\n }\n\n /**\n * Starts the js-controller via cli\n */\n startController(): ChildProcessPromise {\n if (tools.isDocker()) {\n return execAsync('/opt/scripts/maintenance.sh off -y');\n }\n\n return execAsync(`${tools.appNameLowerCase} start`);\n }\n\n /**\n * Print how the module should be used\n */\n static printUsage(): void {\n console.info('Example usage: \"node upgradeManager.js <version> <adminInstance> <uid> <gid>\"');\n }\n\n /**\n * Install given version of js-controller\n */\n async npmInstall(): Promise<void> {\n const res = await tools.installNodeModule(`iobroker.js-controller@${this.version}`, {\n cwd: '/opt/iobroker',\n debug: true,\n });\n\n this.response.stderr.push(...res.stderr.split('\\n'));\n this.response.stdout.push(...res.stdout.split('\\n'));\n\n this.response.success = res.success;\n\n if (!res.success) {\n throw new Error(`Could not install js-controller@${this.version}`);\n }\n }\n\n /**\n * Starts the web server for admin communication either secure or insecure\n *\n * @param params Web server configuration\n */\n startWebServer(params: WebServerParameters): void {\n const { useHttps } = params;\n if (useHttps) {\n this.startSecureWebServer(params);\n } else {\n this.startInsecureWebServer(params);\n }\n }\n\n /**\n * Shuts down the server, restarts the controller and exits the program\n */\n shutdownApp(): void {\n if (this.shutdownAbortController) {\n this.shutdownAbortController.abort();\n }\n\n if (!this.server) {\n process.exit();\n }\n\n this.destroySockets();\n\n this.server.close(async () => {\n await this.startController();\n this.log('Successfully started js-controller');\n\n process.exit();\n });\n }\n\n /**\n * Destroy all sockets, to prevent requests from keeping server alive\n */\n destroySockets(): void {\n for (const socket of this.sockets) {\n socket.destroy();\n this.sockets.delete(socket);\n }\n }\n\n /**\n * This function is called when the webserver receives a message\n *\n * @param res server response\n */\n webServerCallback(res: http.ServerResponse): void {\n res.writeHead(200, {\n 'Access-Control-Allow-Origin': '*',\n });\n\n res.end(JSON.stringify(this.response));\n\n if (!this.response.running) {\n this.log('Final information delivered');\n this.shutdownApp();\n }\n }\n\n /**\n * Start an insecure web server for admin communication\n *\n * @param params Web server configuration\n */\n startInsecureWebServer(params: InsecureWebServerParameters): void {\n const { port } = params;\n\n this.server = http.createServer((_req, res) => {\n this.webServerCallback(res);\n });\n\n this.monitorSockets(this.server);\n\n this.server.listen(port, () => {\n this.log(`Server is running on http://localhost:${port}`);\n });\n }\n\n /**\n * Start a secure web server for admin communication\n *\n * @param params Web server configuration\n */\n startSecureWebServer(params: SecureWebServerParameters): void {\n const { port, certPublic, certPrivate } = params;\n\n this.server = https.createServer({ key: certPrivate, cert: certPublic }, (_req, res) => {\n this.webServerCallback(res);\n });\n\n this.monitorSockets(this.server);\n\n this.server.listen(port, () => {\n this.log(`Server is running on https://localhost:${port}`);\n });\n }\n\n /**\n * Keep track of all existing sockets\n *\n * @param server the webserver\n */\n monitorSockets(server: http.Server | https.Server): void {\n server.on('connection', socket => {\n this.sockets.add(socket);\n\n server.once('close', () => {\n this.sockets.delete(socket);\n });\n });\n }\n\n /**\n * Get certificates from the DB\n *\n * @param params certificate information\n */\n async getCertificates(params: GetCertificatesParams): Promise<Certificates> {\n const { objects, certPublicName, certPrivateName } = params;\n\n const obj = await objects.getObjectAsync('system.certificates');\n\n if (!obj) {\n throw new Error('No certificates found');\n }\n\n const certs = obj.native.certificates;\n\n return { certPrivate: certs[certPrivateName], certPublic: certs[certPublicName] };\n }\n\n /**\n * Collect parameters for webserver from admin instance\n */\n async collectWebServerParameters(): Promise<WebServerParameters> {\n const { objects } = await dbConnectAsync(false);\n\n const obj = await objects.getObjectAsync(`system.adapter.admin.${this.adminInstance}`);\n\n if (!obj) {\n UpgradeManager.printUsage();\n throw new Error('Please provide a valid admin instance');\n }\n\n if (obj.native.secure) {\n const { certPublic: certPublicName, certPrivate: certPrivateName } = obj.native;\n const { certPublic, certPrivate } = await this.getCertificates({\n objects,\n certPublicName,\n certPrivateName,\n });\n\n return {\n useHttps: obj.native.secure,\n port: obj.native.port,\n certPublic,\n certPrivate,\n };\n }\n\n return {\n useHttps: false,\n port: obj.native.port,\n };\n }\n\n /**\n * Tells the upgrade manager, that server can be shut down on next response or on timeout\n */\n async setFinished(): Promise<void> {\n this.response.running = false;\n\n await this.startShutdownTimeout();\n }\n\n /**\n * Start a timeout which starts controller and shuts down the app if expired\n */\n async startShutdownTimeout(): Promise<void> {\n this.shutdownAbortController = new AbortController();\n try {\n await wait(this.SHUTDOWN_TIMEOUT, null, { signal: this.shutdownAbortController.signal });\n\n this.log('Timeout expired, initializing shutdown');\n this.shutdownApp();\n } catch (e) {\n if (e.code !== 'ABORT_ERR') {\n this.log(e.message, true);\n }\n }\n }\n}\n\n/**\n * Main logic\n */\nasync function main(): Promise<void> {\n const upgradeArguments = UpgradeManager.parseCliCommands();\n const upgradeManager = new UpgradeManager(upgradeArguments);\n registerErrorHandlers(upgradeManager);\n\n const webServerParameters = await upgradeManager.collectWebServerParameters();\n\n upgradeManager.log('Stopping controller');\n await upgradeManager.stopController();\n upgradeManager.log('Successfully stopped js-controller');\n\n upgradeManager.startWebServer(webServerParameters);\n\n try {\n await upgradeManager.npmInstall();\n } catch (e) {\n upgradeManager.log(e.message, true);\n }\n\n await upgradeManager.setFinished();\n}\n\n/**\n * Stream unhandled errors to the log files\n *\n * @param upgradeManager the instance of Upgrade Manager\n */\nfunction registerErrorHandlers(upgradeManager: UpgradeManager): void {\n process.on('uncaughtException', e => {\n upgradeManager.log(`Uncaught Exception: ${e.stack}`, true);\n });\n\n process.on('unhandledRejection', rej => {\n upgradeManager.log(`Unhandled rejection: ${rej instanceof Error ? rej.stack : JSON.stringify(rej)}`, true);\n });\n}\n\n/**\n * This file always needs to be executed in a process different from js-controller\n * else it will be canceled when the file itself stops the controller\n */\n// eslint-disable-next-line unicorn/prefer-module\nconst modulePath = url.fileURLToPath(import.meta.url || `file://${__filename}`);\nif (process.argv[1] === modulePath) {\n main();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["process", "fs", "execAsync", "wait", "http", "https", "url"]
|
|
7
7
|
}
|
package/build/cjs/lib/utils.d.ts
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/utils.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Get disk warning level from state\n *\n * @param state disk warning state, normally with value of type number in %\n * @returns The new disk warning level in %\n */\nexport function getDiskWarningLevel(state: ioBroker.State): number {\n let warningLevel = 0;\n if (typeof state.val === 'number' && state.val <= 100 && state.val >= 0) {\n warningLevel = state.val;\n }\n\n return warningLevel;\n}\n\n/** Default value for disk warning level */\nexport const DEFAULT_DISK_WARNING_LEVEL = 5;\n\ninterface GetCronExpressionOptions {\n /** The cron expression in the schedule */\n cronExpression: string;\n /** The connection type of the instance */\n connectionType?: ioBroker.ConnectionType;\n}\n\n/** Max time in seconds to delay an instance start if no seconds specified, has to be below 60 */\nconst MAX_SCHEDULE_DELAY = 59;\n\n/**\n * Delay the instance start if the expression has no seconds, and it is a cloud connection\n *\n * @param options information about the cron expression and connection type\n */\nexport function getCronExpression(options: GetCronExpressionOptions): string {\n const { cronExpression, connectionType } = options;\n const cronHasSeconds = cronExpression.split(' ').length > 5;\n\n if (cronHasSeconds || connectionType !== 'cloud') {\n return cronExpression;\n }\n\n const randomSeconds = Math.round(Math.random() * MAX_SCHEDULE_DELAY);\n return `${randomSeconds} ${cronExpression}`;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;AAMM,SAAU,oBAAoB,OAAqB;AACrD,MAAI,eAAe;AACnB,MAAI,OAAO,MAAM,QAAQ,YAAY,MAAM,OAAO,OAAO,MAAM,OAAO,GAAG;AACrE,mBAAe,MAAM;EACzB;AAEA,SAAO;AACX;AAGO,MAAM,6BAA6B;AAU1C,MAAM,qBAAqB;AAOrB,SAAU,kBAAkB,SAAiC;AAC/D,QAAM,EAAE,gBAAgB,eAAc,IAAK;AAC3C,QAAM,iBAAiB,eAAe,MAAM,GAAG,EAAE,SAAS;AAE1D,MAAI,kBAAkB,mBAAmB,SAAS;AAC9C,WAAO;EACX;AAEA,QAAM,gBAAgB,KAAK,MAAM,KAAK,OAAM,IAAK,kBAAkB;AACnE,SAAO,GAAG,
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;AAMM,SAAU,oBAAoB,OAAqB;AACrD,MAAI,eAAe;AACnB,MAAI,OAAO,MAAM,QAAQ,YAAY,MAAM,OAAO,OAAO,MAAM,OAAO,GAAG;AACrE,mBAAe,MAAM;EACzB;AAEA,SAAO;AACX;AAGO,MAAM,6BAA6B;AAU1C,MAAM,qBAAqB;AAOrB,SAAU,kBAAkB,SAAiC;AAC/D,QAAM,EAAE,gBAAgB,eAAc,IAAK;AAC3C,QAAM,iBAAiB,eAAe,MAAM,GAAG,EAAE,SAAS;AAE1D,MAAI,kBAAkB,mBAAmB,SAAS;AAC9C,WAAO;EACX;AAEA,QAAM,gBAAgB,KAAK,MAAM,KAAK,OAAM,IAAK,kBAAkB;AACnE,SAAO,GAAG,aAAa,IAAI,cAAc;AAC7C;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/vis/states.ts"],
|
|
4
4
|
"sourcesContent": ["import { getUsedObjectIDs } from './visUtils.js';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\n\ninterface CalculatedProject {\n id: string;\n val: number;\n}\n\ninterface CalculateProjectsOptions {\n /** The objects db instance */\n objects: ObjectsClient;\n /** Vis instance */\n instance: number;\n /** Vis adapter name */\n visAdapter: 'vis' | 'vis-2';\n}\n\ninterface CalculateProjectOptions extends CalculateProjectsOptions {\n /** The read project directories */\n projects: ioBroker.ReadDirResult[];\n}\n\n/**\n * Calculate the number of data points for each project of given instance\n *\n * @param options - database and project information\n */\nasync function calcProject(options: CalculateProjectOptions): Promise<CalculatedProject[]> {\n const { visAdapter, instance, objects, projects } = options;\n const result: CalculatedProject[] = [];\n\n if (!projects?.length) {\n return result;\n }\n\n for (const project of projects) {\n if (!project?.isDir) {\n continue;\n }\n\n if (!(await objects.fileExists(`${visAdapter}.${instance}`, `/${project.file}/vis-views.json`))) {\n continue;\n }\n\n // calculate data points in one project\n const data = await objects.readFile(`${visAdapter}.${instance}`, `/${project.file}/vis-views.json`);\n let json;\n try {\n json = JSON.parse(data.file as string);\n } catch {\n console.error(`Cannot parse \"/${project.file}/vis-views.json`);\n continue;\n }\n\n const dps = getUsedObjectIDs(json, false);\n if (dps?.IDs) {\n result.push({\n id: `${visAdapter}.${instance}.datapoints.${project.file.replace(/[.\\\\s]/g, '_')}`,\n val: dps.IDs.length,\n });\n }\n }\n\n return result;\n}\n\n/**\n * Calculate the number of data points for all vis projects of given instance\n *\n * @param options - db and vis options\n */\nexport async function calcProjects(options: CalculateProjectsOptions): Promise<CalculatedProject[]> {\n const { visAdapter, instance, objects } = options;\n const projects = await objects.readDirAsync(`${visAdapter}.${instance}`, '/');\n\n if (!projects?.length) {\n return [{ id: `${visAdapter}.${instance}.datapoints.total`, val: 0 }];\n }\n\n const result = await calcProject({ objects, projects, instance, visAdapter });\n if (result?.length) {\n let total = 0;\n for (const entry of result) {\n total += entry.val;\n }\n result.push({ id: `${visAdapter}.${instance}.datapoints.total`, val: total });\n }\n\n return result;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;sBAAiC;AA2BjC,eAAe,YAAY,SAAgC;AACvD,QAAM,EAAE,YAAY,UAAU,SAAS,SAAQ,IAAK;AACpD,QAAM,SAA8B,CAAA;AAEpC,MAAI,CAAC,UAAU,QAAQ;AACnB,WAAO;EACX;AAEA,aAAW,WAAW,UAAU;AAC5B,QAAI,CAAC,SAAS,OAAO;AACjB;IACJ;AAEA,QAAI,CAAE,MAAM,QAAQ,WAAW,GAAG,
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,sBAAiC;AA2BjC,eAAe,YAAY,SAAgC;AACvD,QAAM,EAAE,YAAY,UAAU,SAAS,SAAQ,IAAK;AACpD,QAAM,SAA8B,CAAA;AAEpC,MAAI,CAAC,UAAU,QAAQ;AACnB,WAAO;EACX;AAEA,aAAW,WAAW,UAAU;AAC5B,QAAI,CAAC,SAAS,OAAO;AACjB;IACJ;AAEA,QAAI,CAAE,MAAM,QAAQ,WAAW,GAAG,UAAU,IAAI,QAAQ,IAAI,IAAI,QAAQ,IAAI,iBAAiB,GAAI;AAC7F;IACJ;AAGA,UAAM,OAAO,MAAM,QAAQ,SAAS,GAAG,UAAU,IAAI,QAAQ,IAAI,IAAI,QAAQ,IAAI,iBAAiB;AAClG,QAAI;AACJ,QAAI;AACA,aAAO,KAAK,MAAM,KAAK,IAAc;IACzC,QAAQ;AACJ,cAAQ,MAAM,kBAAkB,QAAQ,IAAI,iBAAiB;AAC7D;IACJ;AAEA,UAAM,UAAM,kCAAiB,MAAM,KAAK;AACxC,QAAI,KAAK,KAAK;AACV,aAAO,KAAK;QACR,IAAI,GAAG,UAAU,IAAI,QAAQ,eAAe,QAAQ,KAAK,QAAQ,WAAW,GAAG,CAAC;QAChF,KAAK,IAAI,IAAI;OAChB;IACL;EACJ;AAEA,SAAO;AACX;AAOA,eAAsB,aAAa,SAAiC;AAChE,QAAM,EAAE,YAAY,UAAU,QAAO,IAAK;AAC1C,QAAM,WAAW,MAAM,QAAQ,aAAa,GAAG,UAAU,IAAI,QAAQ,IAAI,GAAG;AAE5E,MAAI,CAAC,UAAU,QAAQ;AACnB,WAAO,CAAC,EAAE,IAAI,GAAG,UAAU,IAAI,QAAQ,qBAAqB,KAAK,EAAC,CAAE;EACxE;AAEA,QAAM,SAAS,MAAM,YAAY,EAAE,SAAS,UAAU,UAAU,WAAU,CAAE;AAC5E,MAAI,QAAQ,QAAQ;AAChB,QAAI,QAAQ;AACZ,eAAW,SAAS,QAAQ;AACxB,eAAS,MAAM;IACnB;AACA,WAAO,KAAK,EAAE,IAAI,GAAG,UAAU,IAAI,QAAQ,qBAAqB,KAAK,MAAK,CAAE;EAChF;AAEA,SAAO;AACX;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|