@iobroker/js-controller-cli 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/index.js +2 -1
- package/build/cjs/index.js.map +2 -2
- package/build/cjs/lib/_Types.d.ts +0 -1
- package/build/cjs/lib/cli/cliCert.js +17 -0
- package/build/cjs/lib/cli/cliCert.js.map +1 -1
- package/build/cjs/lib/cli/cliCommand.d.ts +0 -1
- package/build/cjs/lib/cli/cliCommand.js +6 -0
- package/build/cjs/lib/cli/cliCommand.js.map +1 -1
- package/build/cjs/lib/cli/cliCompact.js +30 -1
- package/build/cjs/lib/cli/cliCompact.js.map +1 -1
- package/build/cjs/lib/cli/cliDebug.js +16 -0
- package/build/cjs/lib/cli/cliDebug.js.map +1 -1
- package/build/cjs/lib/cli/cliHost.js +35 -0
- package/build/cjs/lib/cli/cliHost.js.map +1 -1
- package/build/cjs/lib/cli/cliLogs.js +33 -3
- package/build/cjs/lib/cli/cliLogs.js.map +3 -3
- package/build/cjs/lib/cli/cliMessage.js +10 -0
- package/build/cjs/lib/cli/cliMessage.js.map +1 -1
- package/build/cjs/lib/cli/cliObjects.d.ts +0 -1
- package/build/cjs/lib/cli/cliObjects.js +85 -0
- package/build/cjs/lib/cli/cliObjects.js.map +1 -1
- package/build/cjs/lib/cli/cliPlugin.js +23 -2
- package/build/cjs/lib/cli/cliPlugin.js.map +3 -3
- package/build/cjs/lib/cli/cliProcess.js +65 -2
- package/build/cjs/lib/cli/cliProcess.js.map +1 -1
- package/build/cjs/lib/cli/cliStates.d.ts +0 -1
- package/build/cjs/lib/cli/cliStates.js +38 -0
- package/build/cjs/lib/cli/cliStates.js.map +1 -1
- package/build/cjs/lib/cli/cliTools.js.map +1 -1
- package/build/cjs/lib/cli/messages.d.ts +27 -23
- package/build/cjs/lib/cli/messages.js.map +1 -1
- package/build/cjs/lib/setup/dbConnection.js +9 -0
- package/build/cjs/lib/setup/dbConnection.js.map +1 -1
- package/build/cjs/lib/setup/formatters.js.map +1 -1
- package/build/cjs/lib/setup/multihostClient.d.ts +0 -1
- package/build/cjs/lib/setup/multihostClient.js +36 -0
- package/build/cjs/lib/setup/multihostClient.js.map +1 -1
- package/build/cjs/lib/setup/setupBackup.js +112 -2
- package/build/cjs/lib/setup/setupBackup.js.map +1 -1
- package/build/cjs/lib/setup/setupInstall.d.ts +6 -6
- package/build/cjs/lib/setup/setupInstall.js +198 -57
- package/build/cjs/lib/setup/setupInstall.js.map +4 -4
- package/build/cjs/lib/setup/setupLicense.js +9 -0
- package/build/cjs/lib/setup/setupLicense.js.map +1 -1
- package/build/cjs/lib/setup/setupList.d.ts +0 -1
- package/build/cjs/lib/setup/setupList.js +4 -0
- package/build/cjs/lib/setup/setupList.js.map +1 -1
- package/build/cjs/lib/setup/setupMultihost.d.ts +2 -5
- package/build/cjs/lib/setup/setupMultihost.js +58 -33
- package/build/cjs/lib/setup/setupMultihost.js.map +3 -3
- package/build/cjs/lib/setup/setupPacketManager.js +41 -0
- package/build/cjs/lib/setup/setupPacketManager.js.map +1 -1
- package/build/cjs/lib/setup/setupRepo.js +60 -0
- package/build/cjs/lib/setup/setupRepo.js.map +1 -1
- package/build/cjs/lib/setup/setupSetup.d.ts +0 -1
- package/build/cjs/lib/setup/setupSetup.js +79 -5
- package/build/cjs/lib/setup/setupSetup.js.map +3 -3
- package/build/cjs/lib/setup/setupUpgrade.js +34 -0
- package/build/cjs/lib/setup/setupUpgrade.js.map +1 -1
- package/build/cjs/lib/setup/setupUpload.d.ts +0 -3
- package/build/cjs/lib/setup/setupUpload.js +43 -0
- package/build/cjs/lib/setup/setupUpload.js.map +1 -1
- package/build/cjs/lib/setup/setupUsers.d.ts +0 -1
- package/build/cjs/lib/setup/setupUsers.js +109 -0
- package/build/cjs/lib/setup/setupUsers.js.map +1 -1
- package/build/cjs/lib/setup/setupVendor.js +18 -1
- package/build/cjs/lib/setup/setupVendor.js.map +1 -1
- package/build/cjs/lib/setup/setupVisDebug.js +16 -0
- package/build/cjs/lib/setup/setupVisDebug.js.map +1 -1
- package/build/cjs/lib/setup/utils.d.ts +1 -1
- package/build/cjs/lib/setup/utils.js +8 -4
- package/build/cjs/lib/setup/utils.js.map +2 -2
- package/build/cjs/lib/setup.js +17 -6
- package/build/cjs/lib/setup.js.map +3 -3
- package/build/esm/index.d.ts.map +1 -1
- package/build/esm/index.js +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/lib/_Types.d.ts +0 -1
- package/build/esm/lib/_Types.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCommand.d.ts +0 -1
- package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
- package/build/esm/lib/cli/cliObjects.d.ts +0 -1
- package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
- package/build/esm/lib/cli/cliStates.d.ts +0 -1
- package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
- package/build/esm/lib/cli/messages.d.ts +27 -23
- package/build/esm/lib/cli/messages.d.ts.map +1 -1
- package/build/esm/lib/setup/multihostClient.d.ts +0 -1
- package/build/esm/lib/setup/multihostClient.d.ts.map +1 -1
- package/build/esm/lib/setup/setupInstall.d.ts +6 -6
- package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
- package/build/esm/lib/setup/setupInstall.js +37 -70
- package/build/esm/lib/setup/setupInstall.js.map +1 -1
- package/build/esm/lib/setup/setupList.d.ts +0 -1
- package/build/esm/lib/setup/setupList.d.ts.map +1 -1
- package/build/esm/lib/setup/setupMultihost.d.ts +2 -5
- package/build/esm/lib/setup/setupMultihost.d.ts.map +1 -1
- package/build/esm/lib/setup/setupMultihost.js +12 -37
- package/build/esm/lib/setup/setupMultihost.js.map +1 -1
- package/build/esm/lib/setup/setupSetup.d.ts +0 -1
- package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpload.d.ts +0 -3
- package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUsers.d.ts +0 -1
- package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
- package/build/esm/lib/setup/utils.d.ts +1 -1
- package/build/esm/lib/setup/utils.d.ts.map +1 -1
- package/build/esm/lib/setup/utils.js +3 -3
- package/build/esm/lib/setup/utils.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -4
package/build/cjs/index.js
CHANGED
package/build/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;mBAAwB;AACxB,0BAA+B;AAC/B,yBAAuB;AACvB,yBAAuB;AACvB,0BAAwB;AACxB,yBAA8B;AAC9B,gCAAkD;AAClD,wBAAc,
|
|
4
|
+
"sourcesContent": ["/// <reference types=\"@iobroker/types-dev\" />\nexport { execute } from '@/lib/setup.js';\nexport { dbConnectAsync } from '@/lib/setup/dbConnection.js';\nexport { Vendor } from '@/lib/setup/setupVendor.js';\nexport { Upload } from '@/lib/setup/setupUpload.js';\nexport { Upgrade } from '@/lib/setup/setupUpgrade.js';\nexport { BackupRestore } from '@/lib/setup/setupBackup.js';\nexport { PacketManager, type UpgradePacket } from '@/lib/setup/setupPacketManager.js';\nexport * from '@/lib/_Types.js';\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;AACA,mBAAwB;AACxB,0BAA+B;AAC/B,yBAAuB;AACvB,yBAAuB;AACvB,0BAAwB;AACxB,yBAA8B;AAC9B,gCAAkD;AAClD,wBAAc,4BARd;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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
|
));
|
|
@@ -35,6 +39,11 @@ class CLICert extends import_cliCommand.CLICommand {
|
|
|
35
39
|
constructor(options) {
|
|
36
40
|
super(options);
|
|
37
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Executes a command
|
|
44
|
+
*
|
|
45
|
+
* @param args
|
|
46
|
+
*/
|
|
38
47
|
execute(args) {
|
|
39
48
|
const { callback, showHelp } = this.options;
|
|
40
49
|
const command = args[0];
|
|
@@ -50,6 +59,9 @@ class CLICert extends import_cliCommand.CLICommand {
|
|
|
50
59
|
return void callback(3);
|
|
51
60
|
}
|
|
52
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Create new private certificate
|
|
64
|
+
*/
|
|
53
65
|
async create() {
|
|
54
66
|
const id = "system.certificates";
|
|
55
67
|
const certPropPath = "native.certificates";
|
|
@@ -67,6 +79,11 @@ class CLICert extends import_cliCommand.CLICommand {
|
|
|
67
79
|
}
|
|
68
80
|
this.options.callback(import_js_controller_common.EXIT_CODES.NO_ERROR);
|
|
69
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* View the certificates on CLI
|
|
84
|
+
*
|
|
85
|
+
* @param _args
|
|
86
|
+
*/
|
|
70
87
|
view(_args) {
|
|
71
88
|
let certName = _args[1];
|
|
72
89
|
if (certName === void 0) {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliCert.ts"],
|
|
4
4
|
"sourcesContent": ["import { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport { CLIObjects } from './cliObjects.js';\nimport * as messages from './messages.js';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\n\n/** Command ioBroker cert ... */\nexport class CLICert extends CLICommand {\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args\n */\n execute(args: any[]): void | Promise<void> {\n const { callback, showHelp } = this.options;\n const command = args[0];\n\n switch (command) {\n case 'renew':\n case 'create':\n return this.create();\n case 'view':\n return this.view(args);\n default:\n messages.error.unknownCommand('cert', command);\n showHelp();\n return void callback(3);\n }\n }\n\n /**\n * Create new private certificate\n */\n async create(): Promise<void> {\n const id = 'system.certificates';\n const certPropPath = 'native.certificates';\n\n const certificates = tools.generateDefaultCertificates();\n if (certificates) {\n console.log(JSON.stringify(certificates, null, 2));\n for (const [certName, cert] of Object.entries(certificates)) {\n // use the command `iobroker object set ...` to update the certificate\n console.log(`Update certificate ${certName}`);\n\n const objectsCommandArgs = ['set', id, `${certPropPath}.${certName}=${cert as string}`];\n await new Promise(resolve => {\n const objectsCommand = new CLIObjects({ ...this.options, callback: resolve });\n objectsCommand.execute(objectsCommandArgs);\n });\n }\n }\n\n this.options.callback(EXIT_CODES.NO_ERROR);\n }\n\n /**\n * View the certificates on CLI\n *\n * @param _args\n */\n view(_args: any[]): void {\n let certName = _args[1];\n if (certName === undefined) {\n certName = 'defaultPublic';\n }\n const { callback, dbConnect } = this.options;\n dbConnect(params => {\n const { objects } = params;\n\n objects.getObject('system.certificates', (err, certs) => {\n if (!err && certs?.native?.certificates?.[certName]) {\n const certInfo = tools.getCertificateInfo(certs.native.certificates[certName]);\n if (certInfo) {\n console.log(JSON.stringify(certInfo, null, 2));\n return void callback(EXIT_CODES.NO_ERROR);\n }\n messages.error.cert(certName);\n return void callback(3);\n }\n messages.error.cert(certName);\n return void callback(3);\n });\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,wBAAmD;AACnD,wBAA2B;AAC3B,eAA0B;AAC1B,kCAAkC;AAG5B,MAAO,gBAAgB,6BAAU;EACnC,YAAY,SAA0B;AAClC,UAAM,OAAO;EACjB;;;;;;EAOA,QAAQ,MAAW;AACf,UAAM,EAAE,UAAU,SAAQ,IAAK,KAAK;AACpC,UAAM,UAAU,KAAK,CAAC;AAEtB,YAAQ,SAAS;MACb,KAAK;MACL,KAAK;AACD,eAAO,KAAK,OAAM;MACtB,KAAK;AACD,eAAO,KAAK,KAAK,IAAI;MACzB;AACI,iBAAS,MAAM,eAAe,QAAQ,OAAO;AAC7C,iBAAQ;AACR,eAAO,KAAK,SAAS,CAAC;IAC9B;EACJ;;;;EAKA,MAAM,SAAM;AACR,UAAM,KAAK;AACX,UAAM,eAAe;AAErB,UAAM,eAAe,kCAAM,4BAA2B;AACtD,QAAI,cAAc;AACd,cAAQ,IAAI,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC;AACjD,iBAAW,CAAC,UAAU,IAAI,KAAK,OAAO,QAAQ,YAAY,GAAG;AAEzD,gBAAQ,IAAI,sBAAsB,QAAQ,EAAE;AAE5C,cAAM,qBAAqB,CAAC,OAAO,IAAI,GAAG,YAAY,IAAI,QAAQ,IAAI,IAAc,EAAE;AACtF,cAAM,IAAI,QAAQ,aAAU;AACxB,gBAAM,iBAAiB,IAAI,6BAAW,EAAE,GAAG,KAAK,SAAS,UAAU,QAAO,CAAE;AAC5E,yBAAe,QAAQ,kBAAkB;QAC7C,CAAC;MACL;IACJ;AAEA,SAAK,QAAQ,SAAS,uCAAW,QAAQ;EAC7C;;;;;;EAOA,KAAK,OAAY;AACb,QAAI,WAAW,MAAM,CAAC;AACtB,QAAI,aAAa,QAAW;AACxB,iBAAW;IACf;AACA,UAAM,EAAE,UAAU,UAAS,IAAK,KAAK;AACrC,cAAU,YAAS;AACf,YAAM,EAAE,QAAO,IAAK;AAEpB,cAAQ,UAAU,uBAAuB,CAAC,KAAK,UAAS;AACpD,YAAI,CAAC,OAAO,OAAO,QAAQ,eAAe,QAAQ,GAAG;AACjD,gBAAM,WAAW,kCAAM,mBAAmB,MAAM,OAAO,aAAa,QAAQ,CAAC;AAC7E,cAAI,UAAU;AACV,oBAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C,mBAAO,KAAK,SAAS,uCAAW,QAAQ;UAC5C;AACA,mBAAS,MAAM,KAAK,QAAQ;AAC5B,iBAAO,KAAK,SAAS,CAAC;QAC1B;AACA,iBAAS,MAAM,KAAK,QAAQ;AAC5B,eAAO,KAAK,SAAS,CAAC;MAC1B,CAAC;IACL,CAAC;EACL;;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -31,6 +31,12 @@ class CLICommand {
|
|
|
31
31
|
this.requireOption("callback");
|
|
32
32
|
this.requireOption("dbConnect");
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Ensures that an argument was passed in the options.
|
|
36
|
+
* Throws otherwise
|
|
37
|
+
*
|
|
38
|
+
* @param arg
|
|
39
|
+
*/
|
|
34
40
|
requireOption(arg) {
|
|
35
41
|
if (this.options[arg] === void 0) {
|
|
36
42
|
throw new Error(`Invalid arguments: ${arg} is missing`);
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliCommand.ts"],
|
|
4
4
|
"sourcesContent": ["import type { DbConnectCallback } from '../_Types.js';\n\nexport interface CLICommandContext {\n /** Invoke this before doing anything in the database */\n dbConnect: (callback: DbConnectCallback) => void;\n callback: (code?: number) => void;\n showHelp: (yargs?: any) => void;\n}\n\nexport interface CLICommandParams {\n encoding?: BufferEncoding;\n pretty?: boolean;\n force?: boolean;\n password?: any;\n ingroup?: any;\n v?: any;\n version?: any;\n timeout?: any;\n enabled?: any;\n disabled?: any;\n port?: any;\n ssl?: any;\n ip?: any;\n updatable?: any;\n host?: any;\n cert?: any;\n cwd?: string;\n path?: string;\n module?: string;\n wait?: boolean;\n yes?: boolean;\n f?: boolean;\n y?: boolean;\n all?: boolean;\n}\n\nexport type CLICommandOptions = CLICommandContext & CLICommandParams;\n\n/** The base class for any CLI command */\nexport class CLICommand<TCommandOptions extends CLICommandOptions = CLICommandOptions> {\n protected readonly options: TCommandOptions;\n\n constructor(options: TCommandOptions) {\n if (options === null || options === undefined) {\n throw new Error(`No options given`);\n }\n\n this.options = options;\n // Always require the callback and a wrapper for DB actions\n this.requireOption('callback');\n this.requireOption('dbConnect');\n }\n\n /**\n * Ensures that an argument was passed in the options.\n * Throws otherwise\n *\n * @param arg\n */\n requireOption(arg: keyof CLICommandOptions): void {\n if (this.options[arg] === undefined) {\n throw new Error(`Invalid arguments: ${arg} is missing`);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAsCA;;;;;AACM,MAAO,WAAU;EACA;EAEnB,YAAY,SAAwB;AAChC,QAAI,YAAY,QAAQ,YAAY,QAAW;AAC3C,YAAM,IAAI,MAAM,kBAAkB;IACtC;AAEA,SAAK,UAAU;AAEf,SAAK,cAAc,UAAU;AAC7B,SAAK,cAAc,WAAW;EAClC
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAsCA;;;;;AACM,MAAO,WAAU;EACA;EAEnB,YAAY,SAAwB;AAChC,QAAI,YAAY,QAAQ,YAAY,QAAW;AAC3C,YAAM,IAAI,MAAM,kBAAkB;IACtC;AAEA,SAAK,UAAU;AAEf,SAAK,cAAc,UAAU;AAC7B,SAAK,cAAc,WAAW;EAClC;;;;;;;EAQA,cAAc,KAA4B;AACtC,QAAI,KAAK,QAAQ,GAAG,MAAM,QAAW;AACjC,YAAM,IAAI,MAAM,sBAAsB,GAAG,aAAa;IAC1D;EACJ;;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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
|
));
|
|
@@ -36,6 +40,11 @@ class CLICompact extends import_cliCommand.CLICommand {
|
|
|
36
40
|
constructor(options) {
|
|
37
41
|
super(options);
|
|
38
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Executes a command
|
|
45
|
+
*
|
|
46
|
+
* @param args
|
|
47
|
+
*/
|
|
39
48
|
execute(args) {
|
|
40
49
|
const { callback, showHelp } = this.options;
|
|
41
50
|
const command = args[0];
|
|
@@ -70,12 +79,20 @@ class CLICompact extends import_cliCommand.CLICommand {
|
|
|
70
79
|
return void callback(3);
|
|
71
80
|
}
|
|
72
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Output status of compact mode for host
|
|
84
|
+
*/
|
|
73
85
|
statusCompactModeHost() {
|
|
74
86
|
const { callback } = this.options;
|
|
75
87
|
const compactMode = !!this.config?.system?.compact;
|
|
76
88
|
console.log(`Compact mode for this host is currently ${compactMode ? "enabled" : "disabled"}`);
|
|
77
89
|
return void callback();
|
|
78
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Set compact mode for this host
|
|
93
|
+
*
|
|
94
|
+
* @param targetState enable or disable compact mode for host
|
|
95
|
+
*/
|
|
79
96
|
setCompactModeHost(targetState) {
|
|
80
97
|
const { callback, dbConnect } = this.options;
|
|
81
98
|
dbConnect((params) => {
|
|
@@ -98,6 +115,11 @@ class CLICompact extends import_cliCommand.CLICommand {
|
|
|
98
115
|
return void callback();
|
|
99
116
|
});
|
|
100
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Output the compact mode status for a defined adapter instance
|
|
120
|
+
*
|
|
121
|
+
* @param instance instance to output status for
|
|
122
|
+
*/
|
|
101
123
|
statusCompactModeInstance(instance) {
|
|
102
124
|
const { callback, dbConnect } = this.options;
|
|
103
125
|
dbConnect((params) => {
|
|
@@ -123,6 +145,13 @@ class CLICompact extends import_cliCommand.CLICommand {
|
|
|
123
145
|
});
|
|
124
146
|
});
|
|
125
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Put given instance in compact mode group
|
|
150
|
+
*
|
|
151
|
+
* @param instance instance to put in group
|
|
152
|
+
* @param targetState if compact mode should be enabled for instance, if undefined `instance.common.runAsCompact` will not be updated
|
|
153
|
+
* @param groupId the compact group id, if not given, it will be put in controller group
|
|
154
|
+
*/
|
|
126
155
|
setCompactModeInstance(instance, targetState, groupId) {
|
|
127
156
|
const { callback, dbConnect } = this.options;
|
|
128
157
|
dbConnect(async (params) => {
|
|
@@ -171,7 +200,7 @@ class CLICompact extends import_cliCommand.CLICommand {
|
|
|
171
200
|
obj.common.runAsCompactMode = newRunAsCompactMode;
|
|
172
201
|
}
|
|
173
202
|
obj.from = `system.host.${import_js_controller_common.tools.getHostName()}.cli`;
|
|
174
|
-
obj.ts = new Date().getTime();
|
|
203
|
+
obj.ts = (/* @__PURE__ */ new Date()).getTime();
|
|
175
204
|
objects.setObject(`system.adapter.${instance}`, obj, (err) => {
|
|
176
205
|
if (err) {
|
|
177
206
|
console.log(err);
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliCompact.ts"],
|
|
4
4
|
"sourcesContent": ["import * as CLI from './messages.js';\nimport { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport { tools } from '@iobroker/js-controller-common';\nimport fs from 'fs-extra';\n\n/** Command ioBroker compact ... */\nexport class CLICompact extends CLICommand {\n private readonly config: ioBroker.IoBrokerJson = fs.readJSONSync(tools.getConfigFileName());\n\n constructor(options: CLICommandOptions) {\n super(options);\n }\n /**\n * Executes a command\n *\n * @param args\n */\n execute(args: any[]): void {\n const { callback, showHelp } = this.options;\n const command = args[0];\n switch (command) {\n case 'status':\n return this.statusCompactModeHost();\n case 'enable':\n case 'on':\n return this.setCompactModeHost(true);\n case 'disable':\n case 'off':\n return this.setCompactModeHost(false);\n default:\n if (command && command.includes('.')) {\n if (args[1]) {\n switch (args[1]) {\n case 'status':\n return this.statusCompactModeInstance(command);\n case 'enable':\n case 'on':\n return this.setCompactModeInstance(command, true, args[2]);\n case 'disable':\n case 'off':\n return this.setCompactModeInstance(command, false);\n case 'group':\n return this.setCompactModeInstance(command, undefined, args[2]);\n }\n }\n }\n\n CLI.error.unknownCommand('compact', command);\n showHelp();\n return void callback(3);\n }\n }\n\n /**\n * Output status of compact mode for host\n */\n statusCompactModeHost(): void {\n const { callback } = this.options;\n\n const compactMode = !!this.config?.system?.compact;\n console.log(`Compact mode for this host is currently ${compactMode ? 'enabled' : 'disabled'}`);\n\n return void callback();\n }\n\n /**\n * Set compact mode for this host\n *\n * @param targetState enable or disable compact mode for host\n */\n setCompactModeHost(targetState: boolean): void {\n const { callback, dbConnect } = this.options;\n\n dbConnect(params => {\n const { isOffline } = params;\n\n const currentState = !!this.config?.system?.compact;\n\n if (targetState === currentState) {\n console.log(`Compact mode for this host is already ${currentState ? 'enabled' : 'disabled'}`);\n return void callback();\n }\n\n this.config.system = this.config.system || {};\n this.config.system.compact = targetState;\n const configFileName = tools.getConfigFileName();\n fs.writeFileSync(configFileName, JSON.stringify(this.config, null, 4), 'utf8');\n\n console.log();\n console.log(`Compact mode for this host is now ${targetState ? 'enabled' : 'disabled'}`);\n\n if (!isOffline) {\n console.log();\n console.log('Please restart ioBroker for this change to take effect!');\n }\n return void callback();\n });\n }\n\n /**\n * Output the compact mode status for a defined adapter instance\n *\n * @param instance instance to output status for\n */\n statusCompactModeInstance(instance: `${string}.${number}`): void {\n const { callback, dbConnect } = this.options;\n\n dbConnect(params => {\n const { objects } = params;\n\n if (!this.config.system?.compact) {\n console.log('Compact mode is disabled for this host. All compact mode settings will have no effect!');\n console.log();\n }\n objects.getObject(`system.adapter.${instance}`, (err, obj) => {\n if (!err && obj) {\n if (!obj.common.compact) {\n console.log(\n 'This adapter does not support compact mode. The below settings will have no effect!',\n );\n console.log();\n } else {\n console.log(`Adapter supports compact mode: ${!!obj.common.compact}`);\n }\n console.log(`Compact mode enabled for instance: ${!!obj.common.runAsCompactMode}`);\n console.log(\n `Compact group: ${\n obj.common.compactGroup !== undefined ? obj.common.compactGroup : 1\n }`,\n );\n return void callback();\n }\n CLI.error.invalidInstance(instance);\n return void callback(24);\n });\n });\n }\n\n /**\n * Put given instance in compact mode group\n *\n * @param instance instance to put in group\n * @param targetState if compact mode should be enabled for instance, if undefined `instance.common.runAsCompact` will not be updated\n * @param groupId the compact group id, if not given, it will be put in controller group\n */\n setCompactModeInstance(instance: `${string}.${number}`, targetState?: boolean, groupId?: string | number): void {\n const { callback, dbConnect } = this.options;\n\n dbConnect(async params => {\n const { objects } = params;\n\n if (!this.config.system?.compact) {\n console.log('Compact mode is disabled on this host. This setting will have no effect!');\n console.log();\n }\n\n let obj: ioBroker.InstanceObject | undefined | null;\n try {\n obj = await objects.getObject(`system.adapter.${instance}`);\n } catch {\n // ignore\n }\n\n if (!obj) {\n CLI.error.invalidInstance(instance);\n return void callback(24);\n }\n\n if (!obj.common.compact) {\n console.log('This adapter does not support compact mode. The below settings will have no effect!');\n console.log();\n } else {\n console.log(`Adapter supports compact mode : ${!!obj.common.compact}`);\n }\n let newRunAsCompactMode;\n if (targetState !== undefined && targetState !== !!obj.common.runAsCompactMode) {\n newRunAsCompactMode = targetState;\n }\n let newCompactGroup;\n if (obj.common.compactGroup === undefined) {\n obj.common.compactGroup = 1;\n newCompactGroup = obj.common.compactGroup;\n }\n if (groupId !== undefined) {\n groupId = typeof groupId === 'string' ? parseInt(groupId, 10) : groupId;\n if (groupId !== obj.common.compactGroup) {\n newCompactGroup = groupId;\n }\n }\n console.log(\n `Compact mode enabled for instance: ${\n newRunAsCompactMode !== undefined ? `--> ${newRunAsCompactMode}` : !!obj.common.runAsCompactMode\n }`,\n );\n console.log(\n `Compact group: ${\n newCompactGroup !== undefined && obj.common.compactGroup !== newCompactGroup\n ? `--> ${newCompactGroup}`\n : obj.common.compactGroup\n }`,\n );\n if (newRunAsCompactMode !== undefined || newCompactGroup !== undefined) {\n if (newCompactGroup !== undefined) {\n obj.common.compactGroup = newCompactGroup;\n }\n if (newRunAsCompactMode !== undefined) {\n obj.common.runAsCompactMode = newRunAsCompactMode;\n }\n\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = new Date().getTime();\n objects.setObject(`system.adapter.${instance}`, obj, err => {\n if (err) {\n console.log(err);\n }\n console.log(`Instance settings for \"${instance}\" are changed.`);\n callback();\n });\n } else {\n console.log('No settings changed.');\n return void callback();\n }\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["fs"]
|
|
7
7
|
}
|
|
@@ -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
|
));
|
|
@@ -36,6 +40,12 @@ class CLIDebug extends import_cliCommand.CLICommand {
|
|
|
36
40
|
constructor(options) {
|
|
37
41
|
super(options);
|
|
38
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Checks if the adapter instance is running
|
|
45
|
+
*
|
|
46
|
+
* @param adapter adapter name
|
|
47
|
+
* @param instance instance id
|
|
48
|
+
*/
|
|
39
49
|
_isInstanceRunning(adapter, instance) {
|
|
40
50
|
const { dbConnect } = this.options;
|
|
41
51
|
return new Promise((resolve) => {
|
|
@@ -52,6 +62,11 @@ class CLIDebug extends import_cliCommand.CLICommand {
|
|
|
52
62
|
});
|
|
53
63
|
});
|
|
54
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Executes a command
|
|
67
|
+
*
|
|
68
|
+
* @param args
|
|
69
|
+
*/
|
|
55
70
|
async execute(args) {
|
|
56
71
|
const { callback, ...params } = this.options;
|
|
57
72
|
const adapter = args[0];
|
|
@@ -79,6 +94,7 @@ class CLIDebug extends import_cliCommand.CLICommand {
|
|
|
79
94
|
const adapterArgs = [instance || "0", "--debug"];
|
|
80
95
|
const nodeArgs = [
|
|
81
96
|
...import_js_controller_common.tools.getDefaultNodeArgs(mainFile),
|
|
97
|
+
// --inspect[-brk][=[ip]:[port]]
|
|
82
98
|
`--inspect${params.wait ? "-brk" : ""}${!!params.ip || !!params.port ? "=" : ""}${params.ip || ""}${!!params.ip && !!params.port ? ":" : ""}${params.port || ""}`
|
|
83
99
|
];
|
|
84
100
|
const cp = (0, import_node_child_process.fork)(mainFile, adapterArgs, {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliDebug.ts"],
|
|
4
4
|
"sourcesContent": ["import * as CLI from './messages.js';\nimport { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport * as CLITools from './cliTools.js';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport { fork } from 'node:child_process';\n\n/** Command ioBroker debug ... */\nexport class CLIDebug extends CLICommand {\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Checks if the adapter instance is running\n *\n * @param adapter adapter name\n * @param instance instance id\n */\n private _isInstanceRunning(adapter: string, instance: string): Promise<boolean> {\n const { dbConnect } = this.options;\n return new Promise(resolve => {\n dbConnect(async ({ states }) => {\n try {\n const state = await states.getStateAsync(`system.adapter.${adapter}.${instance}.alive`);\n if (state?.val) {\n resolve(true);\n return;\n }\n } catch {\n // ignore\n }\n resolve(false);\n });\n });\n }\n\n /**\n * Executes a command\n *\n * @param args\n */\n async execute(args: any[]): Promise<void> {\n const { callback, ...params } = this.options;\n const adapter = args[0];\n if (!adapter) {\n CLI.error.requiredArgumentMissing('adaptername', 'debug <adaptername>');\n return void callback(34);\n }\n\n const { name, instance } = CLITools.splitAdapterOrInstanceIdentifierWithVersion(adapter)!;\n\n if (await this._isInstanceRunning(name, instance || '0')) {\n CLI.error.instanceAlreadyRunning(`${name}.${instance || '0'}`);\n return void callback(EXIT_CODES.ADAPTER_ALREADY_RUNNING);\n }\n\n const adapterDir = tools.getAdapterDir(adapter);\n if (!adapterDir) {\n CLI.error.adapterDirNotFound(adapter);\n return void callback(34);\n }\n\n let mainFile;\n try {\n mainFile = await tools.resolveAdapterMainFile(adapter);\n } catch {\n CLI.error.mainFileNotFound(adapter);\n return callback(1);\n }\n\n // Start the adapter with force and console logs\n const adapterArgs = [instance || '0', '--debug'];\n // Tell node to attach a debugger\n const nodeArgs = [\n ...tools.getDefaultNodeArgs(mainFile),\n // --inspect[-brk][=[ip]:[port]]\n `--inspect${params.wait ? '-brk' : ''}${!!params.ip || !!params.port ? '=' : ''}${params.ip || ''}${\n !!params.ip && !!params.port ? ':' : ''\n }${params.port || ''}`,\n ];\n // And wait until the sub process has finished\n const cp = fork(mainFile, adapterArgs, {\n cwd: adapterDir,\n execArgv: nodeArgs,\n });\n cp.on('exit', code => callback(code || 0));\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,UAAqB;AACrB,wBAAmD;AACnD,eAA0B;AAC1B,kCAAkC;AAClC,gCAAqB;AAGf,MAAO,iBAAiB,6BAAU;EACpC,YAAY,SAA0B;AAClC,UAAM,OAAO;EACjB;;;;;;;EAQQ,mBAAmB,SAAiB,UAAgB;AACxD,UAAM,EAAE,UAAS,IAAK,KAAK;AAC3B,WAAO,IAAI,QAAQ,aAAU;AACzB,gBAAU,OAAO,EAAE,OAAM,MAAM;AAC3B,YAAI;AACA,gBAAM,QAAQ,MAAM,OAAO,cAAc,kBAAkB,OAAO,IAAI,QAAQ,QAAQ;AACtF,cAAI,OAAO,KAAK;AACZ,oBAAQ,IAAI;AACZ;UACJ;QACJ,QAAQ;QAER;AACA,gBAAQ,KAAK;MACjB,CAAC;IACL,CAAC;EACL;;;;;;EAOA,MAAM,QAAQ,MAAW;AACrB,UAAM,EAAE,UAAU,GAAG,OAAM,IAAK,KAAK;AACrC,UAAM,UAAU,KAAK,CAAC;AACtB,QAAI,CAAC,SAAS;AACV,UAAI,MAAM,wBAAwB,eAAe,qBAAqB;AACtE,aAAO,KAAK,SAAS,EAAE;IAC3B;AAEA,UAAM,EAAE,MAAM,SAAQ,IAAK,SAAS,4CAA4C,OAAO;AAEvF,QAAI,MAAM,KAAK,mBAAmB,MAAM,YAAY,GAAG,GAAG;AACtD,UAAI,MAAM,uBAAuB,GAAG,IAAI,IAAI,YAAY,GAAG,EAAE;AAC7D,aAAO,KAAK,SAAS,uCAAW,uBAAuB;IAC3D;AAEA,UAAM,aAAa,kCAAM,cAAc,OAAO;AAC9C,QAAI,CAAC,YAAY;AACb,UAAI,MAAM,mBAAmB,OAAO;AACpC,aAAO,KAAK,SAAS,EAAE;IAC3B;AAEA,QAAI;AACJ,QAAI;AACA,iBAAW,MAAM,kCAAM,uBAAuB,OAAO;IACzD,QAAQ;AACJ,UAAI,MAAM,iBAAiB,OAAO;AAClC,aAAO,SAAS,CAAC;IACrB;AAGA,UAAM,cAAc,CAAC,YAAY,KAAK,SAAS;AAE/C,UAAM,WAAW;MACb,GAAG,kCAAM,mBAAmB,QAAQ;;MAEpC,YAAY,OAAO,OAAO,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,OAAO,MAAM,EAAE,GAAG,OAAO,MAAM,EAAE,GAC7F,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,OAAO,MAAM,EACzC,GAAG,OAAO,QAAQ,EAAE;;AAGxB,UAAM,SAAK,gCAAK,UAAU,aAAa;MACnC,KAAK;MACL,UAAU;KACb;AACD,OAAG,GAAG,QAAQ,UAAQ,SAAS,QAAQ,CAAC,CAAC;EAC7C;;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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
|
));
|
|
@@ -37,6 +41,11 @@ class CLIHost extends import_cliCommand.CLICommand {
|
|
|
37
41
|
constructor(options) {
|
|
38
42
|
super(options);
|
|
39
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Executes a command
|
|
46
|
+
*
|
|
47
|
+
* @param args
|
|
48
|
+
*/
|
|
40
49
|
execute(args) {
|
|
41
50
|
const command = args[0];
|
|
42
51
|
switch (command) {
|
|
@@ -51,9 +60,19 @@ class CLIHost extends import_cliCommand.CLICommand {
|
|
|
51
60
|
return this.rename(args);
|
|
52
61
|
}
|
|
53
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* When in single-host mode, changes the hostname of the host and all instances to the current one
|
|
65
|
+
*
|
|
66
|
+
* @param _args
|
|
67
|
+
*/
|
|
54
68
|
self(_args) {
|
|
55
69
|
this.renameHost(void 0, import_node_os.default.hostname());
|
|
56
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Changes the current host's hostname to the given one
|
|
73
|
+
*
|
|
74
|
+
* @param args
|
|
75
|
+
*/
|
|
57
76
|
set(args) {
|
|
58
77
|
const { callback } = this.options;
|
|
59
78
|
const newHostname = args[1];
|
|
@@ -63,6 +82,11 @@ class CLIHost extends import_cliCommand.CLICommand {
|
|
|
63
82
|
}
|
|
64
83
|
this.renameHost(import_js_controller_common.tools.getHostName(), newHostname);
|
|
65
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Removes the host with the given name
|
|
87
|
+
*
|
|
88
|
+
* @param args
|
|
89
|
+
*/
|
|
66
90
|
remove(args) {
|
|
67
91
|
const { callback, dbConnect } = this.options;
|
|
68
92
|
const hostname = args[1];
|
|
@@ -116,6 +140,11 @@ class CLIHost extends import_cliCommand.CLICommand {
|
|
|
116
140
|
}
|
|
117
141
|
});
|
|
118
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Renames the host with the given name to the current one (opposite of `set()`)
|
|
145
|
+
*
|
|
146
|
+
* @param args
|
|
147
|
+
*/
|
|
119
148
|
rename(args) {
|
|
120
149
|
const { callback } = this.options;
|
|
121
150
|
const oldHostname = args[0];
|
|
@@ -125,6 +154,12 @@ class CLIHost extends import_cliCommand.CLICommand {
|
|
|
125
154
|
}
|
|
126
155
|
this.renameHost(oldHostname, import_node_os.default.hostname());
|
|
127
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Renames the host with the hostname `oldHostname` to the hostname `newHostname`
|
|
159
|
+
*
|
|
160
|
+
* @param oldHostname The hostname to rename from or `undefined` to rename all hosts (single-host mode only!)
|
|
161
|
+
* @param newHostname The hostname to rename to
|
|
162
|
+
*/
|
|
128
163
|
renameHost(oldHostname, newHostname) {
|
|
129
164
|
const { callback, dbConnect, showHelp } = this.options;
|
|
130
165
|
dbConnect(async (params) => {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliHost.ts"],
|
|
4
4
|
"sourcesContent": ["import * as CLI from './messages.js';\nimport { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport { enumHosts, enumObjects, getObjectFrom, enumInstances } from './cliTools.js';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport os from 'node:os';\nimport fs from 'fs-extra';\n\n/** Command iobroker host ... */\nexport class CLIHost extends CLICommand {\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args\n */\n execute(args: any[]): void {\n const command = args[0];\n\n switch (command) {\n case 'this':\n case 'self':\n return this.self(args);\n case 'set':\n return this.set(args);\n case 'remove':\n return this.remove(args);\n default:\n return this.rename(args);\n }\n }\n\n /**\n * When in single-host mode, changes the hostname of the host and all instances to the current one\n *\n * @param _args\n */\n self(_args: any[]): void {\n this.renameHost(undefined, os.hostname());\n }\n\n /**\n * Changes the current host's hostname to the given one\n *\n * @param args\n */\n set(args: any[]): void {\n const { callback } = this.options;\n\n const newHostname: string = args[1];\n if (!newHostname) {\n CLI.error.requiredArgumentMissing('newHostname', 'host set newHostname');\n return void callback(34);\n }\n\n this.renameHost(tools.getHostName(), newHostname);\n }\n\n /**\n * Removes the host with the given name\n *\n * @param args\n */\n remove(args: any[]): void {\n const { callback, dbConnect } = this.options;\n\n const hostname: string = args[1];\n if (!hostname) {\n CLI.error.requiredArgumentMissing('hostname', 'host remove hostname');\n return void callback(34);\n }\n\n const newHostname = tools.getHostName();\n\n if (hostname === newHostname) {\n // avoid object deletion when target host is same host\n CLI.error.dontRemoveCurrentHost(hostname);\n return void callback(35);\n }\n\n dbConnect(async params => {\n const { objects, isOffline } = params;\n\n try {\n if (!isOffline) {\n CLI.error.cannotChangeRunningSystem();\n return void callback(EXIT_CODES.CONTROLLER_RUNNING);\n }\n\n // Find the requested host object\n const hosts = await enumHosts(objects);\n const hostToDelete = hosts.find(host => host?.common.hostname === hostname);\n if (!hostToDelete) {\n CLI.error.hostDoesNotExist(hostname);\n return void callback(30);\n }\n\n // Delete it\n try {\n await objects.delObjectAsync(hostToDelete._id);\n } catch (err) {\n CLI.error.cannotDeleteObject(hostToDelete._id, err.message);\n return void callback(30);\n }\n\n // Also delete its states\n const hostStates = await enumObjects(objects, 'state', `system.host.${hostname}.`);\n for (const state of hostStates) {\n // Therefore delete the old one because we will recreate it under a new name\n try {\n await objects.delObjectAsync(state._id);\n CLI.success.stateDeleted(state._id);\n } catch (err) {\n CLI.error.cannotDeleteObject(state._id, err.message);\n }\n }\n\n // Move all instances from the deleted host to the current one\n const instances = await enumInstances(objects);\n const instancesToRename = instances.filter(i => i?.common.host === hostname);\n for (const instance of instancesToRename) {\n await changeInstanceHost(objects, instance, newHostname);\n }\n\n // Notify the user that we are done\n CLI.success.hostDeleted(hostname);\n return void callback(EXIT_CODES.NO_ERROR);\n } catch (err) {\n CLI.error.unknown(err.message);\n return void callback(1);\n }\n });\n }\n\n /**\n * Renames the host with the given name to the current one (opposite of `set()`)\n *\n * @param args\n */\n rename(args: any[]): void {\n const { callback } = this.options;\n\n const oldHostname: string = args[0];\n\n if (!oldHostname) {\n CLI.error.requiredArgumentMissing('oldHostname', 'host oldHostname');\n return void callback(34);\n }\n\n this.renameHost(oldHostname, os.hostname());\n }\n\n /**\n * Renames the host with the hostname `oldHostname` to the hostname `newHostname`\n *\n * @param oldHostname The hostname to rename from or `undefined` to rename all hosts (single-host mode only!)\n * @param newHostname The hostname to rename to\n */\n renameHost(oldHostname: string | undefined, newHostname: string): void {\n const { callback, dbConnect, showHelp } = this.options;\n dbConnect(async params => {\n const { isOffline, objects } = params;\n\n try {\n if (!isOffline) {\n CLI.error.cannotChangeRunningSystem();\n return void callback(EXIT_CODES.CONTROLLER_RUNNING);\n }\n\n const hosts = await enumHosts(objects);\n if (hosts.length > 1 && oldHostname === undefined) {\n // iobroker host this/self in multihost is not allowed\n CLI.error.noHostThisInMultihost();\n showHelp();\n return void callback(30);\n }\n\n // Does another host with the target name exist?\n const hostExists = !!hosts.find(obj => obj?.common.hostname === newHostname);\n if (hostExists) {\n // This prevents migration of instances if host already exists, but we need it to prevent\n // multiple hosts with same name. Thus we only allow if no instances are on the host\n // Note: this is only a heuristic, if problems occur we need a `force` flag\n const instances = await enumInstances(objects);\n const hasExistingInstances = !!instances.find(instance => instance?.common.host === newHostname);\n\n if (hasExistingInstances) {\n CLI.error.hostAlreadyExists(newHostname);\n return void callback(EXIT_CODES.INSTANCE_ALREADY_EXISTS);\n }\n }\n\n // Remember the new hostname in the system settings\n const configFileName = tools.getConfigFileName();\n const configData = fs.readJSONSync(configFileName);\n if (configData.system && configData.system.hostname !== newHostname) {\n configData.system.hostname = newHostname;\n fs.writeFileSync(configFileName, JSON.stringify(configData, null, 2), 'utf8');\n }\n\n // Rename the host(s)\n for (const host of hosts) {\n // Remember the current hostname of this object because we need it later\n const prevHostname = host.common.hostname;\n\n // Rename only the hostname we're supposed to rename!\n if (oldHostname && prevHostname !== oldHostname) {\n continue;\n }\n\n // Rename the host object\n // Therefore delete the old one because we will recreate it under a new name\n try {\n await objects.delObjectAsync(host._id);\n } catch (err) {\n CLI.error.cannotDeleteObject(host._id, err.message);\n continue;\n }\n\n // Now update the object\n Object.assign(host, {\n _id: `system.host.${newHostname}`,\n from: getObjectFrom(),\n ts: Date.now(),\n });\n Object.assign(host.common, {\n name: host._id,\n hostname: newHostname,\n address: [],\n cmd: '',\n native: { process: {}, os: {}, hardware: {} },\n });\n // And save it\n try {\n await objects.setObjectAsync(host._id, host);\n } catch (err) {\n CLI.error.cannotChangeObject(host._id, err.message);\n continue;\n }\n\n // Rename its states\n const hostStateObjects = await enumObjects(objects, 'state', `system.host.${prevHostname}.`);\n const hostFolders = await enumObjects(objects, 'folder', `system.host.${prevHostname}.`);\n for (const object of [...hostStateObjects, ...hostFolders]) {\n // Therefore delete the old one because we will recreate it under a new name\n try {\n await objects.delObjectAsync(object._id);\n } catch (err) {\n CLI.error.cannotDeleteObject(object._id, err.message);\n continue;\n }\n\n // Now update the object\n Object.assign(object, {\n _id: object._id.replace(`system.host.${prevHostname}`, `system.host.${newHostname}`),\n from: getObjectFrom(),\n ts: Date.now(),\n });\n\n // And save it\n try {\n await objects.setObjectAsync(object._id, object);\n } catch (err) {\n CLI.error.cannotChangeObject(object._id, err.message);\n }\n }\n\n CLI.success.hostRenamed(prevHostname, newHostname);\n }\n\n // Also rename all instances\n const instances = await enumInstances(objects);\n const instancesToRename =\n oldHostname === undefined ? instances : instances.filter(i => i.common.host === oldHostname);\n if (instancesToRename.length > 0) {\n for (const instance of instancesToRename) {\n // Update each instance object\n await changeInstanceHost(objects, instance, newHostname);\n }\n } else {\n CLI.warn.noInstancesFoundOnHost(oldHostname);\n }\n return void callback(EXIT_CODES.NO_ERROR);\n } catch (err) {\n CLI.error.unknown(err.message);\n return void callback(1);\n }\n });\n }\n}\n\n/**\n * Changes the host an instance is running on\n *\n * @param objects The objects DB to use\n * @param instance The instance object\n * @param newHostname The new hostname the instance should be running on\n */\nasync function changeInstanceHost(\n objects: ObjectsClient,\n instance: ioBroker.InstanceObject,\n newHostname: string,\n): Promise<void> {\n const oldInstanceHost = instance.common.host;\n instance.from = getObjectFrom();\n instance.ts = Date.now();\n instance.common.host = newHostname;\n // and save it\n try {\n await objects.setObjectAsync(instance._id, instance);\n CLI.success.instanceHostChanged(instance._id, oldInstanceHost, newHostname);\n } catch (e) {\n CLI.error.cannotChangeObject(instance._id, e.message);\n // resolve anyways, we don't want to cause errors\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,UAAqB;AACrB,wBAAmD;AACnD,sBAAqE;AACrE,kCAAkC;AAElC,qBAAe;AACf,sBAAe;AAGT,MAAO,gBAAgB,6BAAU;EACnC,YAAY,SAA0B;AAClC,UAAM,OAAO;EACjB;;;;;;EAOA,QAAQ,MAAW;AACf,UAAM,UAAU,KAAK,CAAC;AAEtB,YAAQ,SAAS;MACb,KAAK;MACL,KAAK;AACD,eAAO,KAAK,KAAK,IAAI;MACzB,KAAK;AACD,eAAO,KAAK,IAAI,IAAI;MACxB,KAAK;AACD,eAAO,KAAK,OAAO,IAAI;MAC3B;AACI,eAAO,KAAK,OAAO,IAAI;IAC/B;EACJ;;;;;;EAOA,KAAK,OAAY;AACb,SAAK,WAAW,QAAW,eAAAA,QAAG,SAAQ,CAAE;EAC5C;;;;;;EAOA,IAAI,MAAW;AACX,UAAM,EAAE,SAAQ,IAAK,KAAK;AAE1B,UAAM,cAAsB,KAAK,CAAC;AAClC,QAAI,CAAC,aAAa;AACd,UAAI,MAAM,wBAAwB,eAAe,sBAAsB;AACvE,aAAO,KAAK,SAAS,EAAE;IAC3B;AAEA,SAAK,WAAW,kCAAM,YAAW,GAAI,WAAW;EACpD;;;;;;EAOA,OAAO,MAAW;AACd,UAAM,EAAE,UAAU,UAAS,IAAK,KAAK;AAErC,UAAM,WAAmB,KAAK,CAAC;AAC/B,QAAI,CAAC,UAAU;AACX,UAAI,MAAM,wBAAwB,YAAY,sBAAsB;AACpE,aAAO,KAAK,SAAS,EAAE;IAC3B;AAEA,UAAM,cAAc,kCAAM,YAAW;AAErC,QAAI,aAAa,aAAa;AAE1B,UAAI,MAAM,sBAAsB,QAAQ;AACxC,aAAO,KAAK,SAAS,EAAE;IAC3B;AAEA,cAAU,OAAM,WAAS;AACrB,YAAM,EAAE,SAAS,UAAS,IAAK;AAE/B,UAAI;AACA,YAAI,CAAC,WAAW;AACZ,cAAI,MAAM,0BAAyB;AACnC,iBAAO,KAAK,SAAS,uCAAW,kBAAkB;QACtD;AAGA,cAAM,QAAQ,UAAM,2BAAU,OAAO;AACrC,cAAM,eAAe,MAAM,KAAK,UAAQ,MAAM,OAAO,aAAa,QAAQ;AAC1E,YAAI,CAAC,cAAc;AACf,cAAI,MAAM,iBAAiB,QAAQ;AACnC,iBAAO,KAAK,SAAS,EAAE;QAC3B;AAGA,YAAI;AACA,gBAAM,QAAQ,eAAe,aAAa,GAAG;QACjD,SAAS,KAAK;AACV,cAAI,MAAM,mBAAmB,aAAa,KAAK,IAAI,OAAO;AAC1D,iBAAO,KAAK,SAAS,EAAE;QAC3B;AAGA,cAAM,aAAa,UAAM,6BAAY,SAAS,SAAS,eAAe,QAAQ,GAAG;AACjF,mBAAW,SAAS,YAAY;AAE5B,cAAI;AACA,kBAAM,QAAQ,eAAe,MAAM,GAAG;AACtC,gBAAI,QAAQ,aAAa,MAAM,GAAG;UACtC,SAAS,KAAK;AACV,gBAAI,MAAM,mBAAmB,MAAM,KAAK,IAAI,OAAO;UACvD;QACJ;AAGA,cAAM,YAAY,UAAM,+BAAc,OAAO;AAC7C,cAAM,oBAAoB,UAAU,OAAO,OAAK,GAAG,OAAO,SAAS,QAAQ;AAC3E,mBAAW,YAAY,mBAAmB;AACtC,gBAAM,mBAAmB,SAAS,UAAU,WAAW;QAC3D;AAGA,YAAI,QAAQ,YAAY,QAAQ;AAChC,eAAO,KAAK,SAAS,uCAAW,QAAQ;MAC5C,SAAS,KAAK;AACV,YAAI,MAAM,QAAQ,IAAI,OAAO;AAC7B,eAAO,KAAK,SAAS,CAAC;MAC1B;IACJ,CAAC;EACL;;;;;;EAOA,OAAO,MAAW;AACd,UAAM,EAAE,SAAQ,IAAK,KAAK;AAE1B,UAAM,cAAsB,KAAK,CAAC;AAElC,QAAI,CAAC,aAAa;AACd,UAAI,MAAM,wBAAwB,eAAe,kBAAkB;AACnE,aAAO,KAAK,SAAS,EAAE;IAC3B;AAEA,SAAK,WAAW,aAAa,eAAAA,QAAG,SAAQ,CAAE;EAC9C;;;;;;;EAQA,WAAW,aAAiC,aAAmB;AAC3D,UAAM,EAAE,UAAU,WAAW,SAAQ,IAAK,KAAK;AAC/C,cAAU,OAAM,WAAS;AACrB,YAAM,EAAE,WAAW,QAAO,IAAK;AAE/B,UAAI;AACA,YAAI,CAAC,WAAW;AACZ,cAAI,MAAM,0BAAyB;AACnC,iBAAO,KAAK,SAAS,uCAAW,kBAAkB;QACtD;AAEA,cAAM,QAAQ,UAAM,2BAAU,OAAO;AACrC,YAAI,MAAM,SAAS,KAAK,gBAAgB,QAAW;AAE/C,cAAI,MAAM,sBAAqB;AAC/B,mBAAQ;AACR,iBAAO,KAAK,SAAS,EAAE;QAC3B;AAGA,cAAM,aAAa,CAAC,CAAC,MAAM,KAAK,SAAO,KAAK,OAAO,aAAa,WAAW;AAC3E,YAAI,YAAY;AAIZ,gBAAMC,aAAY,UAAM,+BAAc,OAAO;AAC7C,gBAAM,uBAAuB,CAAC,CAACA,WAAU,KAAK,cAAY,UAAU,OAAO,SAAS,WAAW;AAE/F,cAAI,sBAAsB;AACtB,gBAAI,MAAM,kBAAkB,WAAW;AACvC,mBAAO,KAAK,SAAS,uCAAW,uBAAuB;UAC3D;QACJ;AAGA,cAAM,iBAAiB,kCAAM,kBAAiB;AAC9C,cAAM,aAAa,gBAAAC,QAAG,aAAa,cAAc;AACjD,YAAI,WAAW,UAAU,WAAW,OAAO,aAAa,aAAa;AACjE,qBAAW,OAAO,WAAW;AAC7B,0BAAAA,QAAG,cAAc,gBAAgB,KAAK,UAAU,YAAY,MAAM,CAAC,GAAG,MAAM;QAChF;AAGA,mBAAW,QAAQ,OAAO;AAEtB,gBAAM,eAAe,KAAK,OAAO;AAGjC,cAAI,eAAe,iBAAiB,aAAa;AAC7C;UACJ;AAIA,cAAI;AACA,kBAAM,QAAQ,eAAe,KAAK,GAAG;UACzC,SAAS,KAAK;AACV,gBAAI,MAAM,mBAAmB,KAAK,KAAK,IAAI,OAAO;AAClD;UACJ;AAGA,iBAAO,OAAO,MAAM;YAChB,KAAK,eAAe,WAAW;YAC/B,UAAM,+BAAa;YACnB,IAAI,KAAK,IAAG;WACf;AACD,iBAAO,OAAO,KAAK,QAAQ;YACvB,MAAM,KAAK;YACX,UAAU;YACV,SAAS,CAAA;YACT,KAAK;YACL,QAAQ,EAAE,SAAS,CAAA,GAAI,IAAI,CAAA,GAAI,UAAU,CAAA,EAAE;WAC9C;AAED,cAAI;AACA,kBAAM,QAAQ,eAAe,KAAK,KAAK,IAAI;UAC/C,SAAS,KAAK;AACV,gBAAI,MAAM,mBAAmB,KAAK,KAAK,IAAI,OAAO;AAClD;UACJ;AAGA,gBAAM,mBAAmB,UAAM,6BAAY,SAAS,SAAS,eAAe,YAAY,GAAG;AAC3F,gBAAM,cAAc,UAAM,6BAAY,SAAS,UAAU,eAAe,YAAY,GAAG;AACvF,qBAAW,UAAU,CAAC,GAAG,kBAAkB,GAAG,WAAW,GAAG;AAExD,gBAAI;AACA,oBAAM,QAAQ,eAAe,OAAO,GAAG;YAC3C,SAAS,KAAK;AACV,kBAAI,MAAM,mBAAmB,OAAO,KAAK,IAAI,OAAO;AACpD;YACJ;AAGA,mBAAO,OAAO,QAAQ;cAClB,KAAK,OAAO,IAAI,QAAQ,eAAe,YAAY,IAAI,eAAe,WAAW,EAAE;cACnF,UAAM,+BAAa;cACnB,IAAI,KAAK,IAAG;aACf;AAGD,gBAAI;AACA,oBAAM,QAAQ,eAAe,OAAO,KAAK,MAAM;YACnD,SAAS,KAAK;AACV,kBAAI,MAAM,mBAAmB,OAAO,KAAK,IAAI,OAAO;YACxD;UACJ;AAEA,cAAI,QAAQ,YAAY,cAAc,WAAW;QACrD;AAGA,cAAM,YAAY,UAAM,+BAAc,OAAO;AAC7C,cAAM,oBACF,gBAAgB,SAAY,YAAY,UAAU,OAAO,OAAK,EAAE,OAAO,SAAS,WAAW;AAC/F,YAAI,kBAAkB,SAAS,GAAG;AAC9B,qBAAW,YAAY,mBAAmB;AAEtC,kBAAM,mBAAmB,SAAS,UAAU,WAAW;UAC3D;QACJ,OAAO;AACH,cAAI,KAAK,uBAAuB,WAAW;QAC/C;AACA,eAAO,KAAK,SAAS,uCAAW,QAAQ;MAC5C,SAAS,KAAK;AACV,YAAI,MAAM,QAAQ,IAAI,OAAO;AAC7B,eAAO,KAAK,SAAS,CAAC;MAC1B;IACJ,CAAC;EACL;;AAUJ,eAAe,mBACX,SACA,UACA,aAAmB;AAEnB,QAAM,kBAAkB,SAAS,OAAO;AACxC,WAAS,WAAO,+BAAa;AAC7B,WAAS,KAAK,KAAK,IAAG;AACtB,WAAS,OAAO,OAAO;AAEvB,MAAI;AACA,UAAM,QAAQ,eAAe,SAAS,KAAK,QAAQ;AACnD,QAAI,QAAQ,oBAAoB,SAAS,KAAK,iBAAiB,WAAW;EAC9E,SAAS,GAAG;AACR,QAAI,MAAM,mBAAmB,SAAS,KAAK,EAAE,OAAO;EAExD;AACJ;",
|
|
6
6
|
"names": ["os", "instances", "fs"]
|
|
7
7
|
}
|
|
@@ -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,6 +31,7 @@ __export(cliLogs_exports, {
|
|
|
27
31
|
CLILogs: () => CLILogs
|
|
28
32
|
});
|
|
29
33
|
module.exports = __toCommonJS(cliLogs_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_cliCommand = require("./cliCommand.js");
|
|
31
36
|
var import_js_controller_common = require("@iobroker/js-controller-common");
|
|
32
37
|
var import_chokidar = __toESM(require("chokidar"), 1);
|
|
@@ -34,8 +39,7 @@ var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
|
34
39
|
var import_node_os = __toESM(require("node:os"), 1);
|
|
35
40
|
var import_event_stream = __toESM(require("event-stream"), 1);
|
|
36
41
|
var import_node_module = require("node:module");
|
|
37
|
-
const
|
|
38
|
-
const require2 = (0, import_node_module.createRequire)(import_meta.url || `file://${__filename}`);
|
|
42
|
+
const require2 = (0, import_node_module.createRequire)(__import_meta_url || `file://${__filename}`);
|
|
39
43
|
const { getConfigFileName } = import_js_controller_common.tools;
|
|
40
44
|
class CLILogs extends import_cliCommand.CLICommand {
|
|
41
45
|
fileSizes = /* @__PURE__ */ new Map();
|
|
@@ -43,6 +47,12 @@ class CLILogs extends import_cliCommand.CLICommand {
|
|
|
43
47
|
constructor(options) {
|
|
44
48
|
super(options);
|
|
45
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Executes a command
|
|
52
|
+
*
|
|
53
|
+
* @param args
|
|
54
|
+
* @param params additional parsed CLI parameters
|
|
55
|
+
*/
|
|
46
56
|
execute(args, params) {
|
|
47
57
|
const adapterName = args[0];
|
|
48
58
|
const watch = params.watch || params.w;
|
|
@@ -83,6 +93,14 @@ class CLILogs extends import_cliCommand.CLICommand {
|
|
|
83
93
|
console.log("No log file found");
|
|
84
94
|
}
|
|
85
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Called by chokidar when watched files change
|
|
98
|
+
*
|
|
99
|
+
* @param options some options
|
|
100
|
+
* @param event The type of change
|
|
101
|
+
* @param path Which path has changed
|
|
102
|
+
* @param stats Information about the file
|
|
103
|
+
*/
|
|
86
104
|
watchHandler(options, event, path, stats) {
|
|
87
105
|
if (event === "add" || !this.fileSizes.has(path)) {
|
|
88
106
|
this.fileSizes.set(path, stats.size);
|
|
@@ -99,10 +117,22 @@ class CLILogs extends import_cliCommand.CLICommand {
|
|
|
99
117
|
this.fileSizes.delete(path);
|
|
100
118
|
}
|
|
101
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* If the log file belongs to today
|
|
122
|
+
*
|
|
123
|
+
* @param path The log file path
|
|
124
|
+
*/
|
|
102
125
|
isTodaysLogfile(path) {
|
|
103
|
-
const YYYYMMDDDate = new Date().toJSON().slice(0, 10);
|
|
126
|
+
const YYYYMMDDDate = (/* @__PURE__ */ new Date()).toJSON().slice(0, 10);
|
|
104
127
|
return path.includes(YYYYMMDDDate);
|
|
105
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Streams a portion of a file to the console
|
|
131
|
+
*
|
|
132
|
+
* @param path The file to stream
|
|
133
|
+
* @param start The offset in bytes where to start
|
|
134
|
+
* @param options some options
|
|
135
|
+
*/
|
|
106
136
|
streamChange(path, start, options) {
|
|
107
137
|
const input = import_fs_extra.default.createReadStream(path, {
|
|
108
138
|
encoding: "utf8",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/lib/cli/cliLogs.ts"],
|
|
4
|
-
"sourcesContent": ["import { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport { tools, logger as toolsLogger } from '@iobroker/js-controller-common';\nimport chokidar from 'chokidar';\nimport fs from 'fs-extra';\nimport os from 'node:os';\nimport es from 'event-stream';\nimport { createRequire } from 'node:module';\n// eslint-disable-next-line unicorn/prefer-module\nconst require = createRequire(import.meta.url || `file://${__filename}`);\n\nconst { getConfigFileName } = tools;\n\ninterface CLILogsOptions {\n /** Whether to show today's full log */\n complete?: boolean;\n /** An optional RegExp to filter by */\n regex?: RegExp;\n}\n\n/** Command ioBroker state ... */\nexport class CLILogs extends CLICommand {\n private readonly fileSizes = new Map<string, number>();\n private isReady = false;\n\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args\n * @param params additional parsed CLI parameters\n */\n execute(args: any[], params: Record<string, any>): void {\n const adapterName = args[0];\n const watch = params.watch || params.w;\n const count = params.lines || 1_000;\n\n const options: CLILogsOptions = {\n complete: this.options.all,\n };\n\n const config = fs.readJSONSync(require.resolve(getConfigFileName()));\n const logger = toolsLogger(config.log);\n /** @ts-expect-error todo adjust logger type */\n let fileName = logger.getFileName();\n if (fileName) {\n let lines = fs.readFileSync(fileName).toString('utf-8').split('\\n');\n lines = lines.filter(line => line);\n if (lines.length > count) {\n lines.splice(0, lines.length - count);\n }\n let regex: RegExp;\n if (adapterName) {\n //2019-03-02 13:26:54.698 - debug: iot.0 [ALEXA] Created ALEXA device: Bad.Hauptlicht.Aktor.STATE [\"turnOn\",\"turnOff\"]\n regex = new RegExp(`: ${adapterName}\\\\.`);\n options.regex = regex;\n }\n lines.forEach(line => {\n if (regex && !regex.test(line)) {\n return;\n }\n console.log(line);\n });\n\n if (watch) {\n fileName = fileName.replace(/\\\\/g, '/');\n const parts = fileName.split('/');\n parts.pop();\n chokidar\n .watch(`${parts.join('/')}/iobroker*`, {\n awaitWriteFinish: { stabilityThreshold: 500 },\n followSymlinks: false,\n })\n .on('all', this.watchHandler.bind(this, options))\n .on('ready', () => (this.isReady = true));\n }\n } else {\n console.log('No log file found');\n }\n }\n\n /**\n * Called by chokidar when watched files change\n *\n * @param options some options\n * @param event The type of change\n * @param path Which path has changed\n * @param stats Information about the file\n */\n watchHandler(options: CLILogsOptions, event: string, path: string, stats: Record<string, any>): void {\n if (event === 'add' || !this.fileSizes.has(path)) {\n this.fileSizes.set(path, stats.size);\n if (stats.size > 0 && (this.isReady || (options.complete && this.isTodaysLogfile(path)))) {\n this.streamChange(path, 0, options);\n }\n } else if (event === 'change') {\n const oldFileSize = this.fileSizes.get(path)!;\n this.fileSizes.set(path, stats.size);\n if (this.isReady && stats.size > oldFileSize) {\n this.streamChange(path, oldFileSize, options);\n }\n } else if (event === 'unlink') {\n this.fileSizes.delete(path);\n }\n }\n\n /**\n * If the log file belongs to today\n *\n * @param path The log file path\n */\n isTodaysLogfile(path: string): boolean {\n const YYYYMMDDDate = new Date().toJSON().slice(0, 10);\n return path.includes(YYYYMMDDDate);\n }\n\n /**\n * Streams a portion of a file to the console\n *\n * @param path The file to stream\n * @param start The offset in bytes where to start\n * @param options some options\n */\n streamChange(path: string, start: number, options: CLILogsOptions): void {\n const input = fs.createReadStream(path, {\n encoding: 'utf8',\n start,\n autoClose: true,\n });\n if (options.regex) {\n // Read the input line by line and only include the lines matching the filter\n input\n .pipe(es.split())\n .pipe(es.filterSync(line => options.regex!.test(line)))\n .pipe(es.mapSync((line: string) => line + os.EOL))\n .pipe(process.stdout);\n } else {\n // just pipe the input through\n tools.pipeLinewise(input, process.stdout);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
3
|
+
"sources": ["../../../../src/lib/cli/cliLogs.ts", "../../../../../../node_modules/@alcalzone/esm2cjs/shims/import.meta.url/shim.js"],
|
|
4
|
+
"sourcesContent": ["import { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport { tools, logger as toolsLogger } from '@iobroker/js-controller-common';\nimport chokidar from 'chokidar';\nimport fs from 'fs-extra';\nimport os from 'node:os';\nimport es from 'event-stream';\nimport { createRequire } from 'node:module';\n// eslint-disable-next-line unicorn/prefer-module\nconst require = createRequire(import.meta.url || `file://${__filename}`);\n\nconst { getConfigFileName } = tools;\n\ninterface CLILogsOptions {\n /** Whether to show today's full log */\n complete?: boolean;\n /** An optional RegExp to filter by */\n regex?: RegExp;\n}\n\n/** Command ioBroker state ... */\nexport class CLILogs extends CLICommand {\n private readonly fileSizes = new Map<string, number>();\n private isReady = false;\n\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args\n * @param params additional parsed CLI parameters\n */\n execute(args: any[], params: Record<string, any>): void {\n const adapterName = args[0];\n const watch = params.watch || params.w;\n const count = params.lines || 1_000;\n\n const options: CLILogsOptions = {\n complete: this.options.all,\n };\n\n const config = fs.readJSONSync(require.resolve(getConfigFileName()));\n const logger = toolsLogger(config.log);\n /** @ts-expect-error todo adjust logger type */\n let fileName = logger.getFileName();\n if (fileName) {\n let lines = fs.readFileSync(fileName).toString('utf-8').split('\\n');\n lines = lines.filter(line => line);\n if (lines.length > count) {\n lines.splice(0, lines.length - count);\n }\n let regex: RegExp;\n if (adapterName) {\n //2019-03-02 13:26:54.698 - debug: iot.0 [ALEXA] Created ALEXA device: Bad.Hauptlicht.Aktor.STATE [\"turnOn\",\"turnOff\"]\n regex = new RegExp(`: ${adapterName}\\\\.`);\n options.regex = regex;\n }\n lines.forEach(line => {\n if (regex && !regex.test(line)) {\n return;\n }\n console.log(line);\n });\n\n if (watch) {\n fileName = fileName.replace(/\\\\/g, '/');\n const parts = fileName.split('/');\n parts.pop();\n chokidar\n .watch(`${parts.join('/')}/iobroker*`, {\n awaitWriteFinish: { stabilityThreshold: 500 },\n followSymlinks: false,\n })\n .on('all', this.watchHandler.bind(this, options))\n .on('ready', () => (this.isReady = true));\n }\n } else {\n console.log('No log file found');\n }\n }\n\n /**\n * Called by chokidar when watched files change\n *\n * @param options some options\n * @param event The type of change\n * @param path Which path has changed\n * @param stats Information about the file\n */\n watchHandler(options: CLILogsOptions, event: string, path: string, stats: Record<string, any>): void {\n if (event === 'add' || !this.fileSizes.has(path)) {\n this.fileSizes.set(path, stats.size);\n if (stats.size > 0 && (this.isReady || (options.complete && this.isTodaysLogfile(path)))) {\n this.streamChange(path, 0, options);\n }\n } else if (event === 'change') {\n const oldFileSize = this.fileSizes.get(path)!;\n this.fileSizes.set(path, stats.size);\n if (this.isReady && stats.size > oldFileSize) {\n this.streamChange(path, oldFileSize, options);\n }\n } else if (event === 'unlink') {\n this.fileSizes.delete(path);\n }\n }\n\n /**\n * If the log file belongs to today\n *\n * @param path The log file path\n */\n isTodaysLogfile(path: string): boolean {\n const YYYYMMDDDate = new Date().toJSON().slice(0, 10);\n return path.includes(YYYYMMDDDate);\n }\n\n /**\n * Streams a portion of a file to the console\n *\n * @param path The file to stream\n * @param start The offset in bytes where to start\n * @param options some options\n */\n streamChange(path: string, start: number, options: CLILogsOptions): void {\n const input = fs.createReadStream(path, {\n encoding: 'utf8',\n start,\n autoClose: true,\n });\n if (options.regex) {\n // Read the input line by line and only include the lines matching the filter\n input\n .pipe(es.split())\n .pipe(es.filterSync(line => options.regex!.test(line)))\n .pipe(es.mapSync((line: string) => line + os.EOL))\n .pipe(process.stdout);\n } else {\n // just pipe the input through\n tools.pipeLinewise(input, process.stdout);\n }\n }\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": "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",
|
|
6
6
|
"names": ["require", "fs", "toolsLogger", "chokidar", "es", "os"]
|
|
7
7
|
}
|
|
@@ -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
|
));
|
|
@@ -31,9 +35,15 @@ var CLI = __toESM(require("./messages.js"), 1);
|
|
|
31
35
|
var import_cliCommand = require("./cliCommand.js");
|
|
32
36
|
var import_cliTools = require("./cliTools.js");
|
|
33
37
|
class CLIMessage extends import_cliCommand.CLICommand {
|
|
38
|
+
/** @param options The CLI Message options */
|
|
34
39
|
constructor(options) {
|
|
35
40
|
super(options);
|
|
36
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Executes a command
|
|
44
|
+
*
|
|
45
|
+
* @param args parsed arguments
|
|
46
|
+
*/
|
|
37
47
|
execute(args) {
|
|
38
48
|
const { callback, dbConnect, showHelp } = this.options;
|
|
39
49
|
let [adapter, command, message] = args;
|