@iobroker/js-controller-cli 7.2.3 → 8.0.0-alpha.2-20260923-99da17fcc
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 +3 -3
- package/build/cjs/lib/_Types.d.ts +8 -1
- package/build/cjs/lib/cli/cliCert.d.ts +7 -4
- package/build/cjs/lib/cli/cliCert.js +10 -6
- package/build/cjs/lib/cli/cliCert.js.map +2 -2
- package/build/cjs/lib/cli/cliCommand.d.ts +63 -15
- package/build/cjs/lib/cli/cliCommand.js +8 -1
- package/build/cjs/lib/cli/cliCommand.js.map +2 -2
- package/build/cjs/lib/cli/cliCompact.d.ts +5 -2
- package/build/cjs/lib/cli/cliCompact.js +9 -2
- package/build/cjs/lib/cli/cliCompact.js.map +2 -2
- package/build/cjs/lib/cli/cliDebug.d.ts +5 -2
- package/build/cjs/lib/cli/cliDebug.js +8 -1
- package/build/cjs/lib/cli/cliDebug.js.map +2 -2
- package/build/cjs/lib/cli/cliHost.d.ts +13 -10
- package/build/cjs/lib/cli/cliHost.js +13 -5
- package/build/cjs/lib/cli/cliHost.js.map +2 -2
- package/build/cjs/lib/cli/cliLogs.d.ts +9 -3
- package/build/cjs/lib/cli/cliLogs.js +12 -1
- package/build/cjs/lib/cli/cliLogs.js.map +2 -2
- package/build/cjs/lib/cli/cliMessage.d.ts +2 -1
- package/build/cjs/lib/cli/cliMessage.js +5 -0
- package/build/cjs/lib/cli/cliMessage.js.map +2 -2
- package/build/cjs/lib/cli/cliObjects.d.ts +21 -18
- package/build/cjs/lib/cli/cliObjects.js +51 -33
- package/build/cjs/lib/cli/cliObjects.js.map +2 -2
- package/build/cjs/lib/cli/cliPlugin.d.ts +3 -3
- package/build/cjs/lib/cli/cliPlugin.js +6 -0
- package/build/cjs/lib/cli/cliPlugin.js.map +2 -2
- package/build/cjs/lib/cli/cliProcess.d.ts +17 -7
- package/build/cjs/lib/cli/cliProcess.js +77 -24
- package/build/cjs/lib/cli/cliProcess.js.map +3 -3
- package/build/cjs/lib/cli/cliStates.d.ts +7 -4
- package/build/cjs/lib/cli/cliStates.js +14 -6
- package/build/cjs/lib/cli/cliStates.js.map +2 -2
- package/build/cjs/lib/cli/cliTools.js +11 -0
- package/build/cjs/lib/cli/cliTools.js.map +1 -1
- package/build/cjs/lib/cli/messages.js +47 -46
- package/build/cjs/lib/cli/messages.js.map +1 -1
- package/build/cjs/lib/progressBar.d.ts +59 -0
- package/build/cjs/lib/progressBar.js +115 -0
- package/build/cjs/lib/progressBar.js.map +7 -0
- package/build/cjs/lib/setup/customError.d.ts +4 -0
- package/build/cjs/lib/setup/customError.js +7 -0
- package/build/cjs/lib/setup/customError.js.map +2 -2
- package/build/cjs/lib/setup/dbConnection.js +69 -64
- package/build/cjs/lib/setup/dbConnection.js.map +3 -3
- package/build/cjs/lib/setup/formatters.d.ts +4 -4
- package/build/cjs/lib/setup/formatters.js +5 -0
- package/build/cjs/lib/setup/formatters.js.map +2 -2
- package/build/cjs/lib/setup/multihostClient.js +6 -2
- package/build/cjs/lib/setup/multihostClient.js.map +1 -1
- package/build/cjs/lib/setup/pluginInfos.d.ts +5 -0
- package/build/cjs/lib/setup/pluginInfos.js +2 -0
- package/build/cjs/lib/setup/pluginInfos.js.map +2 -2
- package/build/cjs/lib/setup/setupBackup.d.ts +53 -0
- package/build/cjs/lib/setup/setupBackup.js +125 -14
- package/build/cjs/lib/setup/setupBackup.js.map +3 -3
- package/build/cjs/lib/setup/setupInstall.d.ts +66 -15
- package/build/cjs/lib/setup/setupInstall.js +282 -28
- package/build/cjs/lib/setup/setupInstall.js.map +2 -2
- package/build/cjs/lib/setup/setupLicense.d.ts +13 -0
- package/build/cjs/lib/setup/setupLicense.js +33 -2
- package/build/cjs/lib/setup/setupLicense.js.map +2 -2
- package/build/cjs/lib/setup/setupList.d.ts +55 -1
- package/build/cjs/lib/setup/setupList.js +78 -24
- package/build/cjs/lib/setup/setupList.js.map +3 -3
- package/build/cjs/lib/setup/setupMultihost.d.ts +7 -0
- package/build/cjs/lib/setup/setupMultihost.js +78 -11
- package/build/cjs/lib/setup/setupMultihost.js.map +3 -3
- package/build/cjs/lib/setup/setupPacketManager.d.ts +10 -0
- package/build/cjs/lib/setup/setupPacketManager.js +16 -6
- package/build/cjs/lib/setup/setupPacketManager.js.map +2 -2
- package/build/cjs/lib/setup/setupRepo.d.ts +19 -0
- package/build/cjs/lib/setup/setupRepo.js +141 -13
- package/build/cjs/lib/setup/setupRepo.js.map +2 -2
- package/build/cjs/lib/setup/setupSetup.d.ts +34 -0
- package/build/cjs/lib/setup/setupSetup.js +209 -35
- package/build/cjs/lib/setup/setupSetup.js.map +3 -3
- package/build/cjs/lib/setup/setupUpgrade.d.ts +13 -2
- package/build/cjs/lib/setup/setupUpgrade.js +72 -12
- package/build/cjs/lib/setup/setupUpgrade.js.map +2 -2
- package/build/cjs/lib/setup/setupUpload.d.ts +77 -1
- package/build/cjs/lib/setup/setupUpload.js +152 -9
- package/build/cjs/lib/setup/setupUpload.js.map +2 -2
- package/build/cjs/lib/setup/setupUsers.d.ts +44 -14
- package/build/cjs/lib/setup/setupUsers.js +330 -17
- package/build/cjs/lib/setup/setupUsers.js.map +2 -2
- package/build/cjs/lib/setup/setupVendor.d.ts +14 -1
- package/build/cjs/lib/setup/setupVendor.js +40 -8
- package/build/cjs/lib/setup/setupVendor.js.map +2 -2
- package/build/cjs/lib/setup/setupVisDebug.d.ts +16 -2
- package/build/cjs/lib/setup/setupVisDebug.js +41 -17
- package/build/cjs/lib/setup/setupVisDebug.js.map +3 -3
- package/build/cjs/lib/setup/utils.d.ts +1 -1
- package/build/cjs/lib/setup/utils.js +13 -9
- package/build/cjs/lib/setup/utils.js.map +3 -3
- package/build/cjs/lib/setup.d.ts +1 -1
- package/build/cjs/lib/setup.js +858 -1758
- package/build/cjs/lib/setup.js.map +3 -3
- package/build/esm/lib/_Types.d.ts +8 -1
- package/build/esm/lib/_Types.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCert.d.ts +7 -4
- package/build/esm/lib/cli/cliCert.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCert.js +6 -6
- package/build/esm/lib/cli/cliCert.js.map +1 -1
- package/build/esm/lib/cli/cliCommand.d.ts +63 -15
- package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCommand.js +4 -1
- package/build/esm/lib/cli/cliCommand.js.map +1 -1
- package/build/esm/lib/cli/cliCompact.d.ts +5 -2
- package/build/esm/lib/cli/cliCompact.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCompact.js +5 -2
- package/build/esm/lib/cli/cliCompact.js.map +1 -1
- package/build/esm/lib/cli/cliDebug.d.ts +5 -2
- package/build/esm/lib/cli/cliDebug.d.ts.map +1 -1
- package/build/esm/lib/cli/cliDebug.js +4 -1
- package/build/esm/lib/cli/cliDebug.js.map +1 -1
- package/build/esm/lib/cli/cliHost.d.ts +13 -10
- package/build/esm/lib/cli/cliHost.d.ts.map +1 -1
- package/build/esm/lib/cli/cliHost.js +8 -5
- package/build/esm/lib/cli/cliHost.js.map +1 -1
- package/build/esm/lib/cli/cliLogs.d.ts +9 -3
- package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
- package/build/esm/lib/cli/cliLogs.js +8 -1
- package/build/esm/lib/cli/cliLogs.js.map +1 -1
- package/build/esm/lib/cli/cliMessage.d.ts +2 -1
- package/build/esm/lib/cli/cliMessage.d.ts.map +1 -1
- package/build/esm/lib/cli/cliMessage.js +1 -0
- package/build/esm/lib/cli/cliMessage.js.map +1 -1
- package/build/esm/lib/cli/cliObjects.d.ts +21 -18
- package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
- package/build/esm/lib/cli/cliObjects.js +44 -38
- package/build/esm/lib/cli/cliObjects.js.map +1 -1
- package/build/esm/lib/cli/cliPlugin.d.ts +3 -3
- package/build/esm/lib/cli/cliPlugin.d.ts.map +1 -1
- package/build/esm/lib/cli/cliPlugin.js +1 -1
- package/build/esm/lib/cli/cliPlugin.js.map +1 -1
- package/build/esm/lib/cli/cliProcess.d.ts +17 -7
- package/build/esm/lib/cli/cliProcess.d.ts.map +1 -1
- package/build/esm/lib/cli/cliProcess.js +73 -12
- package/build/esm/lib/cli/cliProcess.js.map +1 -1
- package/build/esm/lib/cli/cliStates.d.ts +7 -4
- package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
- package/build/esm/lib/cli/cliStates.js +6 -2
- package/build/esm/lib/cli/cliStates.js.map +1 -1
- package/build/esm/lib/progressBar.d.ts +59 -0
- package/build/esm/lib/progressBar.d.ts.map +1 -0
- package/build/esm/lib/progressBar.js +104 -0
- package/build/esm/lib/progressBar.js.map +1 -0
- package/build/esm/lib/setup/customError.d.ts +4 -0
- package/build/esm/lib/setup/customError.d.ts.map +1 -1
- package/build/esm/lib/setup/customError.js +3 -0
- package/build/esm/lib/setup/customError.js.map +1 -1
- package/build/esm/lib/setup/dbConnection.d.ts.map +1 -1
- package/build/esm/lib/setup/dbConnection.js +10 -13
- package/build/esm/lib/setup/dbConnection.js.map +1 -1
- package/build/esm/lib/setup/formatters.d.ts +4 -4
- package/build/esm/lib/setup/formatters.js +4 -4
- package/build/esm/lib/setup/pluginInfos.d.ts +5 -0
- package/build/esm/lib/setup/pluginInfos.d.ts.map +1 -1
- package/build/esm/lib/setup/pluginInfos.js +5 -0
- package/build/esm/lib/setup/pluginInfos.js.map +1 -1
- package/build/esm/lib/setup/setupBackup.d.ts +53 -0
- package/build/esm/lib/setup/setupBackup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupBackup.js +132 -13
- package/build/esm/lib/setup/setupBackup.js.map +1 -1
- package/build/esm/lib/setup/setupInstall.d.ts +66 -15
- package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
- package/build/esm/lib/setup/setupInstall.js +309 -23
- package/build/esm/lib/setup/setupInstall.js.map +1 -1
- package/build/esm/lib/setup/setupLicense.d.ts +13 -0
- package/build/esm/lib/setup/setupLicense.d.ts.map +1 -1
- package/build/esm/lib/setup/setupLicense.js +31 -1
- package/build/esm/lib/setup/setupLicense.js.map +1 -1
- package/build/esm/lib/setup/setupList.d.ts +55 -1
- package/build/esm/lib/setup/setupList.d.ts.map +1 -1
- package/build/esm/lib/setup/setupList.js +61 -8
- package/build/esm/lib/setup/setupList.js.map +1 -1
- package/build/esm/lib/setup/setupMultihost.d.ts +7 -0
- package/build/esm/lib/setup/setupMultihost.d.ts.map +1 -1
- package/build/esm/lib/setup/setupMultihost.js +85 -6
- package/build/esm/lib/setup/setupMultihost.js.map +1 -1
- package/build/esm/lib/setup/setupPacketManager.d.ts +10 -0
- package/build/esm/lib/setup/setupPacketManager.d.ts.map +1 -1
- package/build/esm/lib/setup/setupPacketManager.js +9 -0
- package/build/esm/lib/setup/setupPacketManager.js.map +1 -1
- package/build/esm/lib/setup/setupRepo.d.ts +19 -0
- package/build/esm/lib/setup/setupRepo.d.ts.map +1 -1
- package/build/esm/lib/setup/setupRepo.js +164 -14
- package/build/esm/lib/setup/setupRepo.js.map +1 -1
- package/build/esm/lib/setup/setupSetup.d.ts +34 -0
- package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupSetup.js +218 -21
- package/build/esm/lib/setup/setupSetup.js.map +1 -1
- package/build/esm/lib/setup/setupUpgrade.d.ts +13 -2
- package/build/esm/lib/setup/setupUpgrade.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpgrade.js +70 -6
- package/build/esm/lib/setup/setupUpgrade.js.map +1 -1
- package/build/esm/lib/setup/setupUpload.d.ts +77 -1
- package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpload.js +164 -7
- package/build/esm/lib/setup/setupUpload.js.map +1 -1
- package/build/esm/lib/setup/setupUsers.d.ts +44 -14
- package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUsers.js +346 -14
- package/build/esm/lib/setup/setupUsers.js.map +1 -1
- package/build/esm/lib/setup/setupVendor.d.ts +14 -1
- package/build/esm/lib/setup/setupVendor.d.ts.map +1 -1
- package/build/esm/lib/setup/setupVendor.js +33 -2
- package/build/esm/lib/setup/setupVendor.js.map +1 -1
- package/build/esm/lib/setup/setupVisDebug.d.ts +16 -2
- package/build/esm/lib/setup/setupVisDebug.d.ts.map +1 -1
- package/build/esm/lib/setup/setupVisDebug.js +39 -14
- package/build/esm/lib/setup/setupVisDebug.js.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 +2 -4
- package/build/esm/lib/setup/utils.js.map +1 -1
- package/build/esm/lib/setup.d.ts +1 -1
- package/build/esm/lib/setup.d.ts.map +1 -1
- package/build/esm/lib/setup.js +959 -1910
- package/build/esm/lib/setup.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +14 -14
|
@@ -5,6 +5,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
8
9
|
var __export = (target, all) => {
|
|
9
10
|
for (var name in all)
|
|
10
11
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -28,7 +29,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
30
|
var setupUpload_exports = {};
|
|
30
31
|
__export(setupUpload_exports, {
|
|
31
|
-
Upload: () => Upload
|
|
32
|
+
Upload: () => Upload,
|
|
33
|
+
processCommandUpload: () => processCommandUpload
|
|
32
34
|
});
|
|
33
35
|
module.exports = __toCommonJS(setupUpload_exports);
|
|
34
36
|
var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
@@ -38,8 +40,13 @@ var import_node_util = require("node:util");
|
|
|
38
40
|
var import_axios = __toESM(require("axios"), 1);
|
|
39
41
|
var import_mime_types = __toESM(require("mime-types"), 1);
|
|
40
42
|
var import_node_path = require("node:path");
|
|
43
|
+
var import_dbConnection = require("../../lib/setup/dbConnection.js");
|
|
44
|
+
var import_progressBar = require("../../lib/progressBar.js");
|
|
41
45
|
const hostname = import_js_controller_common.tools.getHostName();
|
|
42
46
|
class Upload {
|
|
47
|
+
static {
|
|
48
|
+
__name(this, "Upload");
|
|
49
|
+
}
|
|
43
50
|
states;
|
|
44
51
|
objects;
|
|
45
52
|
regApp = new RegExp(`/${import_js_controller_common.tools.appName.replace(/\./g, "\\.")}\\.`, "i");
|
|
@@ -47,6 +54,9 @@ class Upload {
|
|
|
47
54
|
sendToHostFromCliAsync;
|
|
48
55
|
callbacks = {};
|
|
49
56
|
lastProgressUpdate = Date.now();
|
|
57
|
+
/**
|
|
58
|
+
* @param _options The states and objects database clients
|
|
59
|
+
*/
|
|
50
60
|
constructor(_options) {
|
|
51
61
|
const options = _options || {};
|
|
52
62
|
if (!options.states) {
|
|
@@ -59,6 +69,11 @@ class Upload {
|
|
|
59
69
|
this.objects = options.objects;
|
|
60
70
|
this.sendToHostFromCliAsync = import_js_controller_common.tools.promisifyNoError(this.sendToHostFromCli);
|
|
61
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Filter the given hosts to those that are currently alive
|
|
74
|
+
*
|
|
75
|
+
* @param hosts The hosts to check
|
|
76
|
+
*/
|
|
62
77
|
async checkHostsIfAlive(hosts) {
|
|
63
78
|
const result = [];
|
|
64
79
|
if (hosts) {
|
|
@@ -71,6 +86,11 @@ class Upload {
|
|
|
71
86
|
}
|
|
72
87
|
return result;
|
|
73
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Get the list of known hosts
|
|
91
|
+
*
|
|
92
|
+
* @param onlyAlive Whether to only return hosts that are currently alive
|
|
93
|
+
*/
|
|
74
94
|
async getHosts(onlyAlive) {
|
|
75
95
|
const hosts = [];
|
|
76
96
|
try {
|
|
@@ -94,7 +114,11 @@ class Upload {
|
|
|
94
114
|
}
|
|
95
115
|
return hosts;
|
|
96
116
|
}
|
|
97
|
-
|
|
117
|
+
/**
|
|
118
|
+
* Check if some adapters must be restarted because of the given adapter's files and restart them
|
|
119
|
+
*
|
|
120
|
+
* @param adapter The adapter whose dependents should be restarted
|
|
121
|
+
*/
|
|
98
122
|
async checkRestartOther(adapter) {
|
|
99
123
|
const adapterDir = import_js_controller_common.tools.getAdapterDir(adapter);
|
|
100
124
|
if (!adapterDir) {
|
|
@@ -137,6 +161,14 @@ class Upload {
|
|
|
137
161
|
console.error(`Cannot parse ${adapterDir}/io-package.json: ${e.message}`);
|
|
138
162
|
}
|
|
139
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Send a message to a host from the CLI
|
|
166
|
+
*
|
|
167
|
+
* @param host The target host id
|
|
168
|
+
* @param command The command to send
|
|
169
|
+
* @param message The message payload
|
|
170
|
+
* @param callback Called with the host's response
|
|
171
|
+
*/
|
|
140
172
|
sendToHostFromCli(host, command, message, callback) {
|
|
141
173
|
const time = Date.now();
|
|
142
174
|
const from = `system.host.${hostname}_cli_${time}`;
|
|
@@ -145,7 +177,7 @@ class Upload {
|
|
|
145
177
|
callback();
|
|
146
178
|
}
|
|
147
179
|
callback = null;
|
|
148
|
-
this.states.unsubscribeMessage(from);
|
|
180
|
+
this.states.unsubscribeMessage(from).catch((e) => console.error(`Cannot unsubscribe: ${e.message}`));
|
|
149
181
|
this.states.onChange = null;
|
|
150
182
|
}, 6e4);
|
|
151
183
|
this.states.onChange = (id, msg) => {
|
|
@@ -156,7 +188,7 @@ class Upload {
|
|
|
156
188
|
callback(msg && msg.message);
|
|
157
189
|
callback = null;
|
|
158
190
|
clearTimeout(timeout);
|
|
159
|
-
this.states.unsubscribeMessage(from);
|
|
191
|
+
this.states.unsubscribeMessage(from).catch((e) => console.error(`Cannot unsubscribe: ${e.message}`));
|
|
160
192
|
this.states.onChange = null;
|
|
161
193
|
}
|
|
162
194
|
}
|
|
@@ -177,9 +209,14 @@ class Upload {
|
|
|
177
209
|
this.callbackId = 1;
|
|
178
210
|
}
|
|
179
211
|
this.callbacks[`_${obj.callback.id}`] = { cb: callback };
|
|
180
|
-
this.states.pushMessage(host, obj);
|
|
212
|
+
this.states.pushMessage(host, obj).catch((e) => console.error(`Cannot push message: ${e.message}`));
|
|
181
213
|
});
|
|
182
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Upload the files of all given adapters from every host
|
|
217
|
+
*
|
|
218
|
+
* @param adapters The adapters to upload
|
|
219
|
+
*/
|
|
183
220
|
async uploadAdapterFullAsync(adapters) {
|
|
184
221
|
if (adapters?.length) {
|
|
185
222
|
const liveHosts = await this.getHosts(true);
|
|
@@ -239,7 +276,7 @@ class Upload {
|
|
|
239
276
|
try {
|
|
240
277
|
const result = await (0, import_axios.default)(source, {
|
|
241
278
|
responseType: "arraybuffer",
|
|
242
|
-
validateStatus: (status) => status === 200
|
|
279
|
+
validateStatus: /* @__PURE__ */ __name((status) => status === 200, "validateStatus")
|
|
243
280
|
});
|
|
244
281
|
if (result?.data) {
|
|
245
282
|
await this.objects.writeFileAsync(adapter, target, result.data);
|
|
@@ -269,8 +306,14 @@ class Upload {
|
|
|
269
306
|
}
|
|
270
307
|
return `${adapter}/${target}`;
|
|
271
308
|
}
|
|
309
|
+
/**
|
|
310
|
+
* Delete the given files from the objects database
|
|
311
|
+
*
|
|
312
|
+
* @param files The files to delete
|
|
313
|
+
* @param logger Logger used to report errors
|
|
314
|
+
*/
|
|
272
315
|
async eraseFiles(files, logger) {
|
|
273
|
-
if (files
|
|
316
|
+
if (files?.length) {
|
|
274
317
|
for (const file of files) {
|
|
275
318
|
try {
|
|
276
319
|
await this.objects.unlinkAsync(file.adapter, file.path);
|
|
@@ -322,9 +365,19 @@ class Upload {
|
|
|
322
365
|
}
|
|
323
366
|
return { filesToDelete: _files, dirs: _dirs };
|
|
324
367
|
}
|
|
368
|
+
/**
|
|
369
|
+
* Upload the files of a single adapter into the objects database
|
|
370
|
+
*
|
|
371
|
+
* @param adapter The adapter whose files are uploaded
|
|
372
|
+
* @param isAdmin Whether the admin files should be uploaded
|
|
373
|
+
* @param files The files to upload
|
|
374
|
+
* @param id The upload state id used to report progress
|
|
375
|
+
* @param logger Logger used to report progress
|
|
376
|
+
*/
|
|
325
377
|
async upload(adapter, isAdmin, files, id, logger) {
|
|
326
378
|
const uploadID = `system.adapter.${adapter}.upload`;
|
|
327
379
|
await this.states.setState(uploadID, { val: 0, ack: true });
|
|
380
|
+
const progress = files.length && logger === console && import_progressBar.ProgressBar.isSupported() ? new import_progressBar.ProgressBar(id, files.length) : null;
|
|
328
381
|
for (let f = 0; f < files.length; f++) {
|
|
329
382
|
const file = files[f];
|
|
330
383
|
if (file === ".gitignore") {
|
|
@@ -338,7 +391,9 @@ class Upload {
|
|
|
338
391
|
let attName = attNameArr.pop();
|
|
339
392
|
attName = attName.split("/").slice(2).join("/");
|
|
340
393
|
const remainingFiles = files.length - f - 1;
|
|
341
|
-
if (
|
|
394
|
+
if (progress) {
|
|
395
|
+
progress.update(f + 1);
|
|
396
|
+
} else if (remainingFiles >= 100) {
|
|
342
397
|
(!f || !(remainingFiles % 50)) && logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);
|
|
343
398
|
} else if (remainingFiles > 20) {
|
|
344
399
|
if (!f || !(remainingFiles % 10)) {
|
|
@@ -361,15 +416,23 @@ class Upload {
|
|
|
361
416
|
const content = await import_fs_extra.default.readFile(file);
|
|
362
417
|
await this.objects.writeFileAsync(id, attName, content, { mimeType: mimeType || void 0 });
|
|
363
418
|
} catch (e) {
|
|
419
|
+
progress?.interrupt();
|
|
364
420
|
console.error(`Error: Cannot upload ${file}: ${e.message}`);
|
|
365
421
|
}
|
|
366
422
|
}
|
|
423
|
+
progress?.finish();
|
|
367
424
|
if (!isAdmin && files.length) {
|
|
368
425
|
await this.states.setState(uploadID, { val: 0, ack: true });
|
|
369
426
|
}
|
|
370
427
|
return adapter;
|
|
371
428
|
}
|
|
372
429
|
// Read synchronous all files recursively from local directory
|
|
430
|
+
/**
|
|
431
|
+
* Recursively collect all file paths below the given directory
|
|
432
|
+
*
|
|
433
|
+
* @param dir The directory to walk
|
|
434
|
+
* @param _results Accumulator of results collected so far
|
|
435
|
+
*/
|
|
373
436
|
walk(dir, _results) {
|
|
374
437
|
const results = _results || [];
|
|
375
438
|
try {
|
|
@@ -493,6 +556,12 @@ class Upload {
|
|
|
493
556
|
}
|
|
494
557
|
return adapter;
|
|
495
558
|
}
|
|
559
|
+
/**
|
|
560
|
+
* Deep-merge additional values into the native section of an object
|
|
561
|
+
*
|
|
562
|
+
* @param target The target object to extend
|
|
563
|
+
* @param additional The additional values to merge in
|
|
564
|
+
*/
|
|
496
565
|
extendNative(target, additional) {
|
|
497
566
|
if (import_js_controller_common.tools.isObject(additional)) {
|
|
498
567
|
for (const [attr, attrData] of Object.entries(additional)) {
|
|
@@ -512,6 +581,13 @@ class Upload {
|
|
|
512
581
|
}
|
|
513
582
|
return target;
|
|
514
583
|
}
|
|
584
|
+
/**
|
|
585
|
+
* Merge additional values into the common section of an instance object, preserving some attributes
|
|
586
|
+
*
|
|
587
|
+
* @param target The target common object to extend
|
|
588
|
+
* @param additional The additional values to merge in
|
|
589
|
+
* @param instance The instance id the common belongs to
|
|
590
|
+
*/
|
|
515
591
|
extendCommon(target, additional, instance) {
|
|
516
592
|
if (import_js_controller_common.tools.isObject(additional)) {
|
|
517
593
|
const preserveAttributes = [
|
|
@@ -681,8 +757,75 @@ class Upload {
|
|
|
681
757
|
return name;
|
|
682
758
|
}
|
|
683
759
|
}
|
|
760
|
+
function processCommandUpload(options) {
|
|
761
|
+
const { args, params, callback } = options;
|
|
762
|
+
const { showHelp } = options.commandOptions;
|
|
763
|
+
const name = args[0];
|
|
764
|
+
const subTree = args[1];
|
|
765
|
+
if (name) {
|
|
766
|
+
(0, import_dbConnection.dbConnect)(params, async ({ objects, states }) => {
|
|
767
|
+
const upload = new Upload({ states, objects });
|
|
768
|
+
if (name === "all") {
|
|
769
|
+
try {
|
|
770
|
+
const objs = await objects.getObjectListAsync({
|
|
771
|
+
startkey: "system.adapter.",
|
|
772
|
+
endkey: "system.adapter.\u9999"
|
|
773
|
+
});
|
|
774
|
+
if (objs) {
|
|
775
|
+
const adapters = [];
|
|
776
|
+
for (const row of objs.rows) {
|
|
777
|
+
if (row.value.type !== "adapter") {
|
|
778
|
+
continue;
|
|
779
|
+
}
|
|
780
|
+
adapters.push(import_js_controller_common.tools.isObject(row.value.common.name) ? row.value.common.name.en : row.value.common.name);
|
|
781
|
+
}
|
|
782
|
+
await upload.uploadAdapterFullAsync(adapters);
|
|
783
|
+
}
|
|
784
|
+
callback();
|
|
785
|
+
} catch (err) {
|
|
786
|
+
console.error(`Cannot upload all adapters: ${err.message}`);
|
|
787
|
+
return void callback(import_js_controller_common.EXIT_CODES.CANNOT_UPLOAD_DATA);
|
|
788
|
+
}
|
|
789
|
+
} else {
|
|
790
|
+
if (name.includes(".")) {
|
|
791
|
+
if (!subTree) {
|
|
792
|
+
console.log(`Please specify target name, like:
|
|
793
|
+
${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/main/img/picture.png`);
|
|
794
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
795
|
+
}
|
|
796
|
+
try {
|
|
797
|
+
const newName = await upload.uploadFile(name, subTree);
|
|
798
|
+
console.log(`File "${name}" is successfully saved under ${newName}`);
|
|
799
|
+
return void callback();
|
|
800
|
+
} catch (err) {
|
|
801
|
+
console.error(`Cannot upload file "${name}": ${err.message}`);
|
|
802
|
+
return void callback(import_js_controller_common.EXIT_CODES.CANNOT_UPLOAD_DATA);
|
|
803
|
+
}
|
|
804
|
+
} else {
|
|
805
|
+
try {
|
|
806
|
+
if (subTree) {
|
|
807
|
+
await upload.uploadAdapter(name, false, true, subTree);
|
|
808
|
+
} else {
|
|
809
|
+
await upload.uploadAdapterFullAsync([name]);
|
|
810
|
+
}
|
|
811
|
+
return void callback();
|
|
812
|
+
} catch (err) {
|
|
813
|
+
console.error(`Cannot upload files "${name}": ${err.message}`);
|
|
814
|
+
return void callback(import_js_controller_common.EXIT_CODES.CANNOT_UPLOAD_DATA);
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
});
|
|
819
|
+
} else {
|
|
820
|
+
console.log("No adapter name found!");
|
|
821
|
+
showHelp();
|
|
822
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
__name(processCommandUpload, "processCommandUpload");
|
|
684
826
|
// Annotate the CommonJS export names for ESM import in node:
|
|
685
827
|
0 && (module.exports = {
|
|
686
|
-
Upload
|
|
828
|
+
Upload,
|
|
829
|
+
processCommandUpload
|
|
687
830
|
});
|
|
688
831
|
//# sourceMappingURL=setupUpload.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/setup/setupUpload.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Upload adapter files into DB\n *\n * Copyright 2013-2024 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport fs from 'fs-extra';\nimport { tools } from '@iobroker/js-controller-common';\nimport deepClone from 'deep-clone';\nimport { isDeepStrictEqual } from 'node:util';\nimport axios from 'axios';\nimport mime from 'mime-types';\nimport { join } from 'node:path';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport type { InternalLogger } from '@iobroker/js-controller-common-db/tools';\n\nconst hostname = tools.getHostName();\n\nexport interface CLIUploadOptions {\n states: StatesRedisClient;\n objects: ObjectsRedisClient;\n}\n\ninterface File {\n adapter: string;\n path: string;\n}\n\ninterface Logger extends InternalLogger {\n log(message: string): void;\n}\n\n/** Logger without noisy levels */\ntype MinimalLogger = Omit<Logger, 'info' | 'silly' | 'debug'>;\n\nexport class Upload {\n private readonly states: StatesRedisClient;\n private readonly objects: ObjectsRedisClient;\n private readonly regApp = new RegExp(`/${tools.appName.replace(/\\./g, '\\\\.')}\\\\.`, 'i');\n private callbackId = 1;\n private readonly sendToHostFromCliAsync: (...args: any[]) => Promise<any>;\n private callbacks: Record<string, any> = {};\n private lastProgressUpdate = Date.now();\n\n constructor(_options: CLIUploadOptions) {\n const options = _options || {};\n\n if (!options.states) {\n throw new Error('Invalid arguments: states is missing');\n }\n if (!options.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n\n this.states = options.states;\n this.objects = options.objects;\n this.sendToHostFromCliAsync = tools.promisifyNoError(this.sendToHostFromCli);\n }\n\n async checkHostsIfAlive(hosts: string[]): Promise<string[]> {\n const result = [];\n if (hosts) {\n for (const host of hosts) {\n const state = await this.states.getStateAsync(`${host}.alive`);\n if (state?.val) {\n result.push(host);\n }\n }\n }\n return result;\n }\n\n async getHosts(onlyAlive: boolean): Promise<string[]> {\n const hosts = [];\n try {\n const arr = await this.objects.getObjectListAsync({\n startkey: 'system.host.',\n endkey: 'system.host.\\u9999',\n });\n if (arr?.rows) {\n for (const row of arr.rows) {\n if (row.value.type !== 'host') {\n continue;\n }\n hosts.push(row.value._id);\n }\n }\n } catch (e) {\n // ignore\n console.warn(`Cannot read hosts: ${e.message}`);\n }\n\n if (onlyAlive) {\n return this.checkHostsIfAlive(hosts);\n }\n return hosts;\n }\n\n // Check if some adapters must be restarted and restart them\n async checkRestartOther(adapter: string): Promise<void> {\n const adapterDir = tools.getAdapterDir(adapter);\n\n if (!adapterDir) {\n console.error(`Adapter directory of adapter \"${adapter}\" not found`);\n return;\n }\n\n try {\n const adapterConf = await fs.readJSON(join(adapterDir, 'io-package.json'));\n if (adapterConf.common.restartAdapters) {\n if (!Array.isArray(adapterConf.common.restartAdapters)) {\n // it's not an array, now it can only be a single adapter as string\n if (typeof adapterConf.common.restartAdapters !== 'string') {\n return;\n }\n adapterConf.common.restartAdapters = [adapterConf.common.restartAdapters];\n }\n\n if (adapterConf.common.restartAdapters.length && adapterConf.common.restartAdapters[0]) {\n const instances = await tools.getAllInstances(adapterConf.common.restartAdapters, this.objects);\n if (instances?.length) {\n for (const instance of instances) {\n try {\n const obj = await this.objects.getObjectAsync(instance);\n // if instance is enabled\n if (obj?.common?.enabled) {\n obj.common.enabled = false; // disable instance\n\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n\n await this.objects.setObjectAsync(obj._id, obj);\n\n obj.common.enabled = true; // enable instance\n obj.ts = Date.now();\n\n await this.objects.setObjectAsync(obj._id, obj);\n console.log(`Adapter \"${obj._id}\" restarted.`);\n }\n } catch (e) {\n console.error(`Cannot restart adapter \"${instance}\": ${e.message}`);\n }\n }\n }\n }\n }\n } catch (e) {\n console.error(`Cannot parse ${adapterDir}/io-package.json: ${e.message}`);\n }\n }\n\n sendToHostFromCli(\n host: string,\n command: string,\n message: ioBroker.MessagePayload,\n callback: ioBroker.MessageCallback | null,\n ): void {\n const time = Date.now();\n const from = `system.host.${hostname}_cli_${time}`;\n\n const timeout = setTimeout(() => {\n if (callback) {\n callback();\n }\n callback = null;\n this.states.unsubscribeMessage(from);\n // @ts-expect-error todo: I don't think this works\n this.states.onChange = null;\n }, 60_000);\n\n // @ts-expect-error todo: I don't think this works\n this.states.onChange = (id, msg) => {\n if (id.endsWith(from)) {\n if (msg.command === 'log' || msg.command === 'error' || msg.command === 'warn') {\n // @ts-expect-error\n console[msg.command](`${host} -> ${msg.text}`);\n } else if (callback) {\n callback(msg && msg.message);\n callback = null;\n clearTimeout(timeout);\n this.states.unsubscribeMessage(from);\n // @ts-expect-error\n this.states.onChange = null;\n }\n }\n };\n\n this.states.subscribeMessage(from, () => {\n const obj = {\n command,\n message: message,\n from: `system.host.${hostname}_cli_${time}`,\n callback: {\n message,\n id: this.callbackId++,\n ack: false,\n time,\n },\n } as const;\n\n if (this.callbackId > 0xffffffff) {\n this.callbackId = 1;\n }\n\n this.callbacks[`_${obj.callback.id}`] = { cb: callback };\n\n // we cannot receive answers from hosts in CLI, so this command is \"fire and forget\"\n this.states.pushMessage(host, obj);\n });\n }\n\n async uploadAdapterFullAsync(adapters: string[]): Promise<void> {\n if (adapters?.length) {\n const liveHosts = await this.getHosts(true);\n for (const adapter of adapters) {\n // Find the host which has this adapter\n const instances = await tools.getInstances(adapter, this.objects, true);\n // try to find instance on this host\n let instance = instances.find(obj => obj?.common?.host === hostname);\n\n // try to find enabled instance on live host\n instance =\n instance || instances.find(obj => obj?.common?.enabled && liveHosts.includes(obj.common.host));\n\n // try to find any instance\n instance = instance || instances.find(obj => obj?.common && liveHosts.includes(obj.common.host));\n\n if (instance && instance.common.host !== hostname) {\n console.log(`Send upload command to host \"${instance.common.host}\"... `);\n // send upload message to the host\n const response = await this.sendToHostFromCliAsync(instance.common.host, 'upload', adapter);\n if (response) {\n console.log(`Upload result: ${response.result}`);\n } else {\n console.error(`No answer from ${instance.common.host}`);\n }\n } else {\n if (!instance) {\n // no one alive instance found\n const adapterDir = tools.getAdapterDir(adapter);\n if (!adapterDir || !fs.existsSync(adapterDir)) {\n console.warn(\n `No alive host found which has the adapter ${adapter} installed! No upload possible. Skipped.`,\n );\n continue;\n }\n }\n\n // try to upload on this host. It will print an error if the adapter directory not found\n await this.uploadAdapter(adapter, true, true);\n await this.upgradeAdapterObjects(adapter);\n await this.uploadAdapter(adapter, false, true);\n }\n }\n }\n }\n\n /**\n * Uploads a file\n *\n * @param source source path\n * @param target target path\n */\n async uploadFile(source: string, target: string): Promise<string> {\n target = target.replace(/\\\\/g, '/');\n source = source.replace(/\\\\/g, '/');\n if (target[0] === '/') {\n target = target.substring(1);\n }\n if (target[target.length - 1] === '/') {\n let name = source.split('/').pop()!;\n name = name.split('?')[0];\n if (!name.includes('.')) {\n name = 'index.html';\n }\n target += name;\n }\n const parts = target.split('/');\n const adapter = parts[0];\n parts.splice(0, 1);\n target = parts.join('/');\n\n if (source.match(/^http:\\/\\/|^https:\\/\\//)) {\n try {\n const result = await axios(source, {\n responseType: 'arraybuffer',\n validateStatus: status => status === 200,\n });\n if (result?.data) {\n await this.objects.writeFileAsync(adapter, target, result.data);\n } else {\n console.error(`Empty response from URL \"${source}\"`);\n throw new Error(`Empty response from URL \"${source}\"`);\n }\n } catch (e) {\n let result;\n if (e.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n result = e.response.data || e.response.status;\n } else if (e.request) {\n // The request was made but no response was received\n // `err.request` is an instance of XMLHttpRequest in the browser and an instance of\n // http.ClientRequest in node.js\n result = e.request;\n } else {\n // Something happened in setting up the request that triggered an Error\n result = e.message;\n }\n console.error(`Cannot get URL \"${source}\": ${result}`);\n throw new Error(result);\n }\n } else {\n try {\n await this.objects.writeFileAsync(adapter, target, fs.readFileSync(source));\n } catch (e) {\n console.error(`Cannot read file \"${source}\": ${e.message}`);\n throw e;\n }\n }\n\n return `${adapter}/${target}`;\n }\n\n async eraseFiles(files: any[], logger: MinimalLogger | typeof console): Promise<void> {\n if (files && files.length) {\n for (const file of files) {\n try {\n await this.objects.unlinkAsync(file.adapter, file.path);\n } catch (e) {\n logger.error(`Cannot delete file \"${file.path}\": ${e}`);\n }\n }\n }\n }\n\n /**\n * Collect Files of an adapter specific directory from the ioBroker storage\n *\n * @param adapter Adapter name\n * @param path path in the adapter specific storage space\n * @param logger Logger instance\n */\n async collectExistingFilesToDelete(\n adapter: string,\n path: string,\n logger: MinimalLogger | typeof console,\n ): Promise<{\n filesToDelete: File[];\n dirs: File[];\n }> {\n let _files: File[] = [];\n let _dirs: File[] = [];\n let files: ioBroker.ReadDirResult[];\n try {\n files = await this.objects.readDirAsync(adapter, path);\n } catch {\n // ignore err\n files = [];\n }\n\n if (files?.length) {\n for (const file of files) {\n if (file.file === '.' || file.file === '..') {\n continue;\n }\n const newPath = path + file.file;\n if (file.isDir) {\n if (!_dirs.find(e => e.path === newPath)) {\n _dirs.push({ adapter, path: newPath });\n }\n try {\n const result = await this.collectExistingFilesToDelete(adapter, `${newPath}/`, logger);\n if (result.filesToDelete) {\n _files = _files.concat(result.filesToDelete);\n }\n\n _dirs = _dirs.concat(result.dirs);\n } catch (e) {\n logger.warn(`Cannot delete folder \"${adapter}${newPath}/\": ${e.message}`);\n }\n } else if (!_files.find(e => e.path === newPath)) {\n _files.push({ adapter, path: newPath });\n }\n }\n }\n\n return { filesToDelete: _files, dirs: _dirs };\n }\n\n async upload(\n adapter: string,\n isAdmin: boolean,\n files: string[],\n id: string,\n logger: MinimalLogger | typeof console,\n ): Promise<string> {\n const uploadID = `system.adapter.${adapter}.upload`;\n\n await this.states.setState(uploadID, { val: 0, ack: true });\n\n for (let f = 0; f < files.length; f++) {\n const file = files[f];\n // do not upload '.gitignore' files. Todo: add other exceptions\n if (file === '.gitignore') {\n continue;\n }\n\n const mimeType = mime.lookup(file);\n let attNameArr = file.split(this.regApp);\n // try to find anyway if adapter is not lower case\n if (attNameArr.length === 1 && file.toLowerCase().includes(tools.appName.toLowerCase())) {\n attNameArr = ['', file.substring(tools.appName.length + 2)];\n }\n\n let attName = attNameArr.pop()!;\n attName = attName.split('/').slice(2).join('/');\n\n const remainingFiles = files.length - f - 1;\n\n if (remainingFiles >= 100) {\n (!f || !(remainingFiles % 50)) &&\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n } else if (remainingFiles > 20) {\n if (!f || !(remainingFiles % 10)) {\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n }\n } else {\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n }\n\n // Update upload indicator\n if (!isAdmin) {\n const now = Date.now();\n if (now - this.lastProgressUpdate > 1_000) {\n this.lastProgressUpdate = now;\n await this.states.setState(uploadID, {\n val: Math.round((1_000 * (files.length - f)) / files.length) / 10,\n ack: true,\n });\n }\n }\n\n try {\n const content = await fs.readFile(file);\n await this.objects.writeFileAsync(id, attName, content, { mimeType: mimeType || undefined });\n } catch (e) {\n console.error(`Error: Cannot upload ${file}: ${e.message}`);\n }\n }\n\n // Set upload progress to 0;\n if (!isAdmin && files.length) {\n await this.states.setState(uploadID, { val: 0, ack: true });\n }\n\n return adapter;\n }\n\n // Read synchronous all files recursively from local directory\n walk(dir: string, _results?: string[]): string[] {\n const results = _results || [];\n try {\n if (fs.existsSync(dir)) {\n const list = fs.readdirSync(dir);\n list.map(file => {\n const stat = fs.statSync(`${dir}/${file}`);\n if (stat.isDirectory()) {\n this.walk(`${dir}/${file}`, results);\n } else {\n if (!file.endsWith('.npmignore') && !file.endsWith('.gitignore')) {\n results.push(`${dir}/${file}`);\n }\n }\n });\n }\n } catch (e) {\n console.error(e);\n }\n\n return results;\n }\n\n /**\n * Upload given adapter\n *\n * @param adapter adapter name\n * @param isAdmin if admin folder should be uploaded too\n * @param forceUpload if upload should be forced\n * @param subTree subtree path to upload\n * @param _logger logger instance\n */\n async uploadAdapter(\n adapter: string,\n isAdmin: boolean,\n forceUpload: boolean,\n subTree?: string,\n _logger?: MinimalLogger,\n ): Promise<string> {\n const id = adapter + (isAdmin ? '.admin' : '');\n const adapterDir = tools.getAdapterDir(adapter);\n let dir = adapterDir ? adapterDir + (isAdmin ? '/admin' : '/www') : '';\n\n const logger = _logger || console;\n\n if (subTree && dir) {\n dir += `/${subTree}`;\n }\n if (adapterDir === null || !fs.existsSync(adapterDir)) {\n console.log(\n `INFO: Directory \"${\n adapterDir || `for ${adapter}${isAdmin ? '.admin' : ''}`\n }\" does not exist. Nothing was uploaded or deleted.`,\n );\n return adapter;\n }\n\n let cfg;\n try {\n cfg = await fs.readJSON(`${adapterDir}/io-package.json`);\n } catch (e) {\n // file not parsable or does not exist\n console.error(`Could not read io-package.json: ${e.message}`);\n }\n\n if (!fs.existsSync(dir)) {\n // www folder have not all adapters. So show warning only for admin folder\n // widgets do not have www folder, but they have onlyWWW flag\n (isAdmin || (cfg?.common?.onlyWWW && !cfg.common.visWidgets)) &&\n console.log(\n `INFO: Directory \"${\n dir || `for ${adapter}${isAdmin ? '.admin' : ''}`\n }\" was not found! Nothing was uploaded or deleted.`,\n );\n\n if (isAdmin) {\n return adapter;\n }\n await this.checkRestartOther(adapter);\n return adapter;\n }\n\n // check for common.wwwDontUpload (required for legacy adapters and admin)\n if (!isAdmin && cfg?.common?.wwwDontUpload) {\n return adapter;\n }\n\n // Create \"upload progress\" object if not exists\n if (!isAdmin) {\n let obj;\n const uploadID = `system.adapter.${adapter}.upload`;\n try {\n obj = await this.objects.getObject(uploadID);\n } catch {\n // ignore\n }\n if (!obj) {\n await this.objects.setObject(uploadID, {\n _id: uploadID,\n type: 'state',\n common: {\n name: `${adapter}.upload`,\n type: 'number',\n role: 'indicator.state',\n unit: '%',\n min: 0,\n max: 100,\n def: 0,\n desc: 'Upload process indicator',\n read: true,\n write: false,\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {},\n });\n }\n // Set indicator to 0\n await this.states.setState(uploadID, { val: 0, ack: true });\n }\n\n let result;\n try {\n result = await this.objects.getObjectAsync(id);\n } catch {\n // ignore\n }\n // Read all names with subtrees from local directory\n const files = this.walk(dir);\n if (!result) {\n // @ts-expect-error types needed admin is not allowed for meta, but it should be allowed\n await this.objects.setObjectAsync(id, {\n type: 'meta',\n common: {\n name: id.split('.').pop()!,\n type: isAdmin ? 'admin' : 'www',\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {},\n });\n forceUpload = true;\n }\n\n if (forceUpload) {\n // only skip if explicitly opted out\n // The visualization check is needed as user of legacy systems often stored files inside adapter directories like `vis`\n // in the long term, such adapters should explicitly opt out, so we can hopefully remove this line in 2-3 versions (current 5.0)\n if (\n cfg?.common?.eraseOnUpload !== false &&\n !(cfg?.common?.eraseOnUpload === undefined && cfg?.common?.type === 'visualization')\n ) {\n const { filesToDelete } = await this.collectExistingFilesToDelete(\n isAdmin ? `${adapter}.admin` : adapter,\n '/',\n logger,\n );\n // delete old files, before upload of new\n await this.eraseFiles(filesToDelete, logger);\n }\n if (!isAdmin) {\n await this.checkRestartOther(adapter);\n await new Promise<void>(resolve => setTimeout(() => resolve(), 25));\n await this.upload(adapter, isAdmin, files, id, logger);\n } else {\n await this.upload(adapter, isAdmin, files, id, logger);\n }\n }\n return adapter;\n }\n\n extendNative(target: Record<string, any>, additional: Record<string, unknown>): Record<string, any> {\n if (tools.isObject(additional)) {\n for (const [attr, attrData] of Object.entries(additional)) {\n if (target[attr] === undefined) {\n target[attr] = attrData;\n } else if (tools.isObject(attrData)) {\n try {\n target[attr] = target[attr] || {};\n } catch {\n console.warn(`Cannot update attribute ${attr} of native`);\n }\n if (typeof target[attr] === 'object' && target[attr] !== null) {\n this.extendNative(target[attr], attrData);\n }\n }\n }\n }\n return target;\n }\n\n extendCommon(\n target: Record<string, any>,\n additional: Record<string, any>,\n instance: string,\n ): ioBroker.InstanceCommon {\n if (tools.isObject(additional)) {\n const preserveAttributes = [\n 'title',\n 'schedule',\n 'restartSchedule',\n 'mode',\n 'loglevel',\n 'enabled',\n 'custom',\n 'tier',\n ];\n\n // Object attributes that should be completely replaced, not merged\n const replaceAttributes = ['adminUI', 'adminTab', 'adminColumns'];\n\n for (const [attr, attrData] of Object.entries(additional)) {\n // preserve these attributes, except, they were undefined before and preserve titleLang if current titleLang is of type string (changed by user)\n if (preserveAttributes.includes(attr) || (attr === 'titleLang' && typeof target[attr] === 'string')) {\n if (target[attr] === undefined) {\n target[attr] = attrData;\n }\n } else if (\n typeof attrData !== 'object' ||\n attrData instanceof Array ||\n replaceAttributes.includes(attr)\n ) {\n try {\n target[attr] = attrData;\n\n // dataFolder can have wildcards\n if (attr === 'dataFolder' && target.dataFolder && target.dataFolder.includes('%INSTANCE%')) {\n target.dataFolder = target.dataFolder.replace(/%INSTANCE%/g, instance);\n }\n } catch {\n console.warn(`Cannot update attribute ${attr} of common`);\n }\n } else {\n target[attr] = target[attr] || {};\n if (typeof target[attr] !== 'object') {\n target[attr] = {}; // here we clean the simple value with object\n }\n\n this.extendCommon(target[attr], attrData, instance);\n }\n }\n }\n return target as ioBroker.InstanceCommon;\n }\n\n /**\n * Extends the `system.instance.adapter.<instanceNumber>` objects with the native properties from adapters io-package.json\n *\n * @param name name of the adapter\n * @param ioPack parsed io-package content\n * @param hostname name of the host where the adapter is installed on\n * @param logger instance of logger\n */\n async _upgradeAdapterObjectsHelper(\n name: string,\n ioPack: ioBroker.AdapterObject,\n hostname: string,\n logger: MinimalLogger | typeof console,\n ): Promise<string> {\n // Update all instances of this host\n const res = await this.objects.getObjectViewAsync('system', 'instance', {\n startkey: `system.adapter.${name}.`,\n endkey: `system.adapter.${name}.\\u9999`,\n });\n\n if (res) {\n for (const row of res.rows) {\n if (row.value?.common.host === hostname) {\n const _obj = await this.objects.getObject(row.id);\n const newObject = deepClone(_obj) as ioBroker.InstanceObject;\n\n // TODO: refactor the following assignments into a method, where we can define which attributes need a real override and their defaults\n\n // all common settings should be taken from new one\n newObject.common = this.extendCommon(\n newObject.common,\n ioPack.common,\n newObject._id.split('.').pop()!,\n );\n newObject.native = this.extendNative(newObject.native, ioPack.native);\n\n // protected/encryptedNative and notifications also need to be updated\n newObject.protectedNative = ioPack.protectedNative || [];\n newObject.encryptedNative = ioPack.encryptedNative || [];\n newObject.notifications = ioPack.notifications || [];\n // update instanceObjects and objects\n newObject.instanceObjects = ioPack.instanceObjects || [];\n newObject.objects = ioPack.objects || [];\n\n newObject.common.version = ioPack.common.version;\n newObject.common.installedVersion = ioPack.common.version;\n newObject.common.installedFrom = ioPack.common.installedFrom;\n\n // do not merge visWidgets and localLinks\n if (ioPack.common.visWidgets) {\n newObject.common.visWidgets = ioPack.common.visWidgets;\n } else {\n delete newObject.common.visWidgets;\n }\n\n if (ioPack.common.localLinks) {\n newObject.common.localLinks = ioPack.common.localLinks;\n } else {\n delete newObject.common.localLinks;\n }\n\n if (!ioPack.common.compact && newObject.common.compact) {\n newObject.common.compact = ioPack.common.compact;\n }\n\n // Compare objects to reduce restarts of instances\n if (!isDeepStrictEqual(newObject, _obj)) {\n logger.log(`Update \"${newObject._id}\"`);\n\n newObject.from = `system.host.${tools.getHostName()}.cli`;\n newObject.ts = Date.now();\n\n await this.objects.setObjectAsync(newObject._id, newObject);\n }\n }\n }\n }\n\n // updates only \"_design/system\" and co \"_design/*\"\n if (Array.isArray(ioPack.objects)) {\n for (const obj of ioPack.objects) {\n if (name === 'js-controller' && !obj._id.startsWith('_design/')) {\n continue;\n }\n\n obj.from = `system.host.${hostname}.cli`;\n obj.ts = Date.now();\n\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n } catch (e) {\n logger.error(`Cannot update object: ${e}`);\n }\n }\n }\n\n return name;\n }\n\n /**\n * Create object from io-package json\n *\n * @param name adapter name\n * @param ioPack IoPack content\n * @param logger logger instance\n */\n async upgradeAdapterObjects(\n name: string,\n ioPack?: ioBroker.AdapterObject,\n logger: MinimalLogger | typeof console = console,\n ): Promise<string> {\n const adapterDir = tools.getAdapterDir(name);\n let ioPackFile;\n try {\n ioPackFile = fs.readJSONSync(`${adapterDir}/io-package.json`);\n } catch {\n if (adapterDir) {\n logger.error(`Cannot find io-package.json in ${adapterDir}`);\n } else {\n logger.error(`Cannot find io-package.json for \"${name}\"`);\n }\n ioPackFile = null;\n }\n\n ioPack = ioPack || ioPackFile;\n\n if (ioPack) {\n logger.log(\n `Updating objects from io-package.json for adapter \"${name}\" with version \"${ioPack.common.version}\"`,\n );\n // Always update installedFrom from File on disk if exists and set\n if (ioPackFile?.common?.installedFrom) {\n ioPack.common = ioPack.common || {};\n ioPack.common.installedFrom = ioPackFile.common.installedFrom;\n }\n // Not existing? Why ever ... we recreate\n let _obj;\n try {\n _obj = await this.objects.getObject(`system.adapter.${name}`);\n } catch {\n // ignore err\n }\n const obj: Omit<ioBroker.AdapterObject, '_id'> = _obj || {\n common: ioPack.common,\n native: ioPack.native,\n type: 'adapter',\n instanceObjects: [],\n objects: [],\n };\n\n obj.common = ioPack.common || {};\n obj.native = ioPack.native || {};\n // protected/encryptedNative and notifications also need to be updated\n obj.protectedNative = ioPack.protectedNative || [];\n obj.encryptedNative = ioPack.encryptedNative || [];\n obj.notifications = ioPack.notifications || [];\n // update instanceObjects and objects\n obj.instanceObjects = ioPack.instanceObjects || [];\n obj.objects = ioPack.objects || [];\n\n obj.type = 'adapter';\n\n obj.common.installedVersion = ioPack.common.version;\n\n if (obj.common.news) {\n delete obj.common.news; // remove this information as it could be big, but it will be taken from repo\n }\n\n const hostname = tools.getHostName();\n\n obj.from = `system.host.${hostname}.cli`;\n obj.ts = Date.now();\n\n try {\n await this.objects.setObject(`system.adapter.${name}`, obj);\n await this.objects.setObject(`system.host.${hostname}.adapter.${name}`, obj);\n } catch (e) {\n logger.error(\n `Cannot set \"system.adapter.${name}\" and \"system.host.${hostname}.adapters.${name}\": ${e.message}`,\n );\n }\n\n await this._upgradeAdapterObjectsHelper(name, ioPack, hostname, logger);\n }\n\n return name;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Upload adapter files into DB\n *\n * Copyright 2013-2024 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport fs from 'fs-extra';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport deepClone from 'deep-clone';\nimport { isDeepStrictEqual } from 'node:util';\nimport axios from 'axios';\nimport mime from 'mime-types';\nimport { join } from 'node:path';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport type { InternalLogger } from '@iobroker/js-controller-common-db/tools';\nimport type { ProcessCommandOptions } from '@/lib/cli/cliCommand.js';\nimport { dbConnect } from '@/lib/setup/dbConnection.js';\nimport { ProgressBar } from '@/lib/progressBar.js';\n\nconst hostname = tools.getHostName();\n\n/** Options for the upload command */\nexport interface CLIUploadOptions {\n /** The states database client */\n states: StatesRedisClient;\n /** The objects database client */\n objects: ObjectsRedisClient;\n}\n\ninterface File {\n adapter: string;\n path: string;\n}\n\ninterface Logger extends InternalLogger {\n log(message: string): void;\n}\n\n/** Logger without noisy levels */\ntype MinimalLogger = Omit<Logger, 'info' | 'silly' | 'debug'>;\n\n/**\n * CLI command to upload adapter files into the objects database\n */\nexport class Upload {\n private readonly states: StatesRedisClient;\n private readonly objects: ObjectsRedisClient;\n private readonly regApp = new RegExp(`/${tools.appName.replace(/\\./g, '\\\\.')}\\\\.`, 'i');\n private callbackId = 1;\n private readonly sendToHostFromCliAsync: (...args: any[]) => Promise<any>;\n private callbacks: Record<string, any> = {};\n private lastProgressUpdate = Date.now();\n\n /**\n * @param _options The states and objects database clients\n */\n constructor(_options: CLIUploadOptions) {\n const options = _options || {};\n\n if (!options.states) {\n throw new Error('Invalid arguments: states is missing');\n }\n if (!options.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n\n this.states = options.states;\n this.objects = options.objects;\n this.sendToHostFromCliAsync = tools.promisifyNoError(this.sendToHostFromCli);\n }\n\n /**\n * Filter the given hosts to those that are currently alive\n *\n * @param hosts The hosts to check\n */\n async checkHostsIfAlive(hosts: string[]): Promise<string[]> {\n const result = [];\n if (hosts) {\n for (const host of hosts) {\n const state = await this.states.getStateAsync(`${host}.alive`);\n if (state?.val) {\n result.push(host);\n }\n }\n }\n return result;\n }\n\n /**\n * Get the list of known hosts\n *\n * @param onlyAlive Whether to only return hosts that are currently alive\n */\n async getHosts(onlyAlive: boolean): Promise<string[]> {\n const hosts = [];\n try {\n const arr = await this.objects.getObjectListAsync({\n startkey: 'system.host.',\n endkey: 'system.host.\\u9999',\n });\n if (arr?.rows) {\n for (const row of arr.rows) {\n if (row.value.type !== 'host') {\n continue;\n }\n hosts.push(row.value._id);\n }\n }\n } catch (e) {\n // ignore\n console.warn(`Cannot read hosts: ${e.message}`);\n }\n\n if (onlyAlive) {\n return this.checkHostsIfAlive(hosts);\n }\n return hosts;\n }\n\n /**\n * Check if some adapters must be restarted because of the given adapter's files and restart them\n *\n * @param adapter The adapter whose dependents should be restarted\n */\n async checkRestartOther(adapter: string): Promise<void> {\n const adapterDir = tools.getAdapterDir(adapter);\n\n if (!adapterDir) {\n console.error(`Adapter directory of adapter \"${adapter}\" not found`);\n return;\n }\n\n try {\n const adapterConf = await fs.readJSON(join(adapterDir, 'io-package.json'));\n if (adapterConf.common.restartAdapters) {\n if (!Array.isArray(adapterConf.common.restartAdapters)) {\n // it's not an array, now it can only be a single adapter as string\n if (typeof adapterConf.common.restartAdapters !== 'string') {\n return;\n }\n adapterConf.common.restartAdapters = [adapterConf.common.restartAdapters];\n }\n\n if (adapterConf.common.restartAdapters.length && adapterConf.common.restartAdapters[0]) {\n const instances = await tools.getAllInstances(adapterConf.common.restartAdapters, this.objects);\n if (instances?.length) {\n for (const instance of instances) {\n try {\n const obj = await this.objects.getObjectAsync(instance);\n // if instance is enabled\n if (obj?.common?.enabled) {\n obj.common.enabled = false; // disable instance\n\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n\n await this.objects.setObjectAsync(obj._id, obj);\n\n obj.common.enabled = true; // enable instance\n obj.ts = Date.now();\n\n await this.objects.setObjectAsync(obj._id, obj);\n console.log(`Adapter \"${obj._id}\" restarted.`);\n }\n } catch (e) {\n console.error(`Cannot restart adapter \"${instance}\": ${e.message}`);\n }\n }\n }\n }\n }\n } catch (e) {\n console.error(`Cannot parse ${adapterDir}/io-package.json: ${e.message}`);\n }\n }\n\n /**\n * Send a message to a host from the CLI\n *\n * @param host The target host id\n * @param command The command to send\n * @param message The message payload\n * @param callback Called with the host's response\n */\n sendToHostFromCli(\n host: string,\n command: string,\n message: ioBroker.MessagePayload,\n callback: ioBroker.MessageCallback | null,\n ): void {\n const time = Date.now();\n const from = `system.host.${hostname}_cli_${time}`;\n\n const timeout = setTimeout(() => {\n if (callback) {\n callback();\n }\n callback = null;\n this.states.unsubscribeMessage(from).catch(e => console.error(`Cannot unsubscribe: ${e.message}`));\n // @ts-expect-error todo: I don't think this works\n this.states.onChange = null;\n }, 60_000);\n\n // @ts-expect-error todo: I don't think this works\n this.states.onChange = (id, msg) => {\n if (id.endsWith(from)) {\n if (msg.command === 'log' || msg.command === 'error' || msg.command === 'warn') {\n // @ts-expect-error\n console[msg.command](`${host} -> ${msg.text}`);\n } else if (callback) {\n callback(msg && msg.message);\n callback = null;\n clearTimeout(timeout);\n this.states.unsubscribeMessage(from).catch(e => console.error(`Cannot unsubscribe: ${e.message}`));\n // @ts-expect-error\n this.states.onChange = null;\n }\n }\n };\n\n this.states.subscribeMessage(from, () => {\n const obj = {\n command,\n message: message,\n from: `system.host.${hostname}_cli_${time}`,\n callback: {\n message,\n id: this.callbackId++,\n ack: false,\n time,\n },\n } as const;\n\n if (this.callbackId > 0xffffffff) {\n this.callbackId = 1;\n }\n\n this.callbacks[`_${obj.callback.id}`] = { cb: callback };\n\n // we cannot receive answers from hosts in CLI, so this command is \"fire and forget\"\n this.states.pushMessage(host, obj).catch(e => console.error(`Cannot push message: ${e.message}`));\n });\n }\n\n /**\n * Upload the files of all given adapters from every host\n *\n * @param adapters The adapters to upload\n */\n async uploadAdapterFullAsync(adapters: string[]): Promise<void> {\n if (adapters?.length) {\n const liveHosts = await this.getHosts(true);\n for (const adapter of adapters) {\n // Find the host which has this adapter\n const instances = await tools.getInstances(adapter, this.objects, true);\n // try to find instance on this host\n let instance = instances.find(obj => obj?.common?.host === hostname);\n\n // try to find enabled instance on live host\n instance =\n instance || instances.find(obj => obj?.common?.enabled && liveHosts.includes(obj.common.host));\n\n // try to find any instance\n instance = instance || instances.find(obj => obj?.common && liveHosts.includes(obj.common.host));\n\n if (instance && instance.common.host !== hostname) {\n console.log(`Send upload command to host \"${instance.common.host}\"... `);\n // send upload message to the host\n const response = await this.sendToHostFromCliAsync(instance.common.host, 'upload', adapter);\n if (response) {\n console.log(`Upload result: ${response.result}`);\n } else {\n console.error(`No answer from ${instance.common.host}`);\n }\n } else {\n if (!instance) {\n // no one alive instance found\n const adapterDir = tools.getAdapterDir(adapter);\n if (!adapterDir || !fs.existsSync(adapterDir)) {\n console.warn(\n `No alive host found which has the adapter ${adapter} installed! No upload possible. Skipped.`,\n );\n continue;\n }\n }\n\n // try to upload on this host. It will print an error if the adapter directory not found\n await this.uploadAdapter(adapter, true, true);\n await this.upgradeAdapterObjects(adapter);\n await this.uploadAdapter(adapter, false, true);\n }\n }\n }\n }\n\n /**\n * Uploads a file\n *\n * @param source source path\n * @param target target path\n */\n async uploadFile(source: string, target: string): Promise<string> {\n target = target.replace(/\\\\/g, '/');\n source = source.replace(/\\\\/g, '/');\n if (target[0] === '/') {\n target = target.substring(1);\n }\n if (target[target.length - 1] === '/') {\n let name = source.split('/').pop()!;\n name = name.split('?')[0];\n if (!name.includes('.')) {\n name = 'index.html';\n }\n target += name;\n }\n const parts = target.split('/');\n const adapter = parts[0];\n parts.splice(0, 1);\n target = parts.join('/');\n\n if (source.match(/^http:\\/\\/|^https:\\/\\//)) {\n try {\n const result = await axios(source, {\n responseType: 'arraybuffer',\n validateStatus: status => status === 200,\n });\n if (result?.data) {\n await this.objects.writeFileAsync(adapter, target, result.data);\n } else {\n console.error(`Empty response from URL \"${source}\"`);\n throw new Error(`Empty response from URL \"${source}\"`);\n }\n } catch (e) {\n let result;\n if (e.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n result = e.response.data || e.response.status;\n } else if (e.request) {\n // The request was made but no response was received\n // `err.request` is an instance of XMLHttpRequest in the browser and an instance of\n // http.ClientRequest in node.js\n result = e.request;\n } else {\n // Something happened in setting up the request that triggered an Error\n result = e.message;\n }\n console.error(`Cannot get URL \"${source}\": ${result}`);\n throw new Error(result);\n }\n } else {\n try {\n await this.objects.writeFileAsync(adapter, target, fs.readFileSync(source));\n } catch (e) {\n console.error(`Cannot read file \"${source}\": ${e.message}`);\n throw e;\n }\n }\n\n return `${adapter}/${target}`;\n }\n\n /**\n * Delete the given files from the objects database\n *\n * @param files The files to delete\n * @param logger Logger used to report errors\n */\n async eraseFiles(files: File[], logger: MinimalLogger | typeof console): Promise<void> {\n if (files?.length) {\n for (const file of files) {\n try {\n await this.objects.unlinkAsync(file.adapter, file.path);\n } catch (e) {\n logger.error(`Cannot delete file \"${file.path}\": ${e}`);\n }\n }\n }\n }\n\n /**\n * Collect Files of an adapter specific directory from the ioBroker storage\n *\n * @param adapter Adapter name\n * @param path path in the adapter specific storage space\n * @param logger Logger instance\n */\n async collectExistingFilesToDelete(\n adapter: string,\n path: string,\n logger: MinimalLogger | typeof console,\n ): Promise<{\n filesToDelete: File[];\n dirs: File[];\n }> {\n let _files: File[] = [];\n let _dirs: File[] = [];\n let files: ioBroker.ReadDirResult[];\n try {\n files = await this.objects.readDirAsync(adapter, path);\n } catch {\n // ignore err\n files = [];\n }\n\n if (files?.length) {\n for (const file of files) {\n if (file.file === '.' || file.file === '..') {\n continue;\n }\n const newPath = path + file.file;\n if (file.isDir) {\n if (!_dirs.find(e => e.path === newPath)) {\n _dirs.push({ adapter, path: newPath });\n }\n try {\n const result = await this.collectExistingFilesToDelete(adapter, `${newPath}/`, logger);\n if (result.filesToDelete) {\n _files = _files.concat(result.filesToDelete);\n }\n\n _dirs = _dirs.concat(result.dirs);\n } catch (e) {\n logger.warn(`Cannot delete folder \"${adapter}${newPath}/\": ${e.message}`);\n }\n } else if (!_files.find(e => e.path === newPath)) {\n _files.push({ adapter, path: newPath });\n }\n }\n }\n\n return { filesToDelete: _files, dirs: _dirs };\n }\n\n /**\n * Upload the files of a single adapter into the objects database\n *\n * @param adapter The adapter whose files are uploaded\n * @param isAdmin Whether the admin files should be uploaded\n * @param files The files to upload\n * @param id The upload state id used to report progress\n * @param logger Logger used to report progress\n */\n async upload(\n adapter: string,\n isAdmin: boolean,\n files: string[],\n id: string,\n logger: MinimalLogger | typeof console,\n ): Promise<string> {\n const uploadID = `system.adapter.${adapter}.upload`;\n\n await this.states.setState(uploadID, { val: 0, ack: true });\n\n // A bar only makes sense when the output goes to a terminal which can overwrite its own\n // line, and when it goes to the console at all - an upload triggered by the controller\n // writes through a real logger into iobroker.log, where control characters are noise.\n const progress =\n files.length && logger === console && ProgressBar.isSupported() ? new ProgressBar(id, files.length) : null;\n\n for (let f = 0; f < files.length; f++) {\n const file = files[f];\n // do not upload '.gitignore' files. Todo: add other exceptions\n if (file === '.gitignore') {\n continue;\n }\n\n const mimeType = mime.lookup(file);\n let attNameArr = file.split(this.regApp);\n // try to find anyway if adapter is not lower case\n if (attNameArr.length === 1 && file.toLowerCase().includes(tools.appName.toLowerCase())) {\n attNameArr = ['', file.substring(tools.appName.length + 2)];\n }\n\n let attName = attNameArr.pop()!;\n attName = attName.split('/').slice(2).join('/');\n\n const remainingFiles = files.length - f - 1;\n\n if (progress) {\n progress.update(f + 1);\n } else if (remainingFiles >= 100) {\n (!f || !(remainingFiles % 50)) &&\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n } else if (remainingFiles > 20) {\n if (!f || !(remainingFiles % 10)) {\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n }\n } else {\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n }\n\n // Update upload indicator\n if (!isAdmin) {\n const now = Date.now();\n if (now - this.lastProgressUpdate > 1_000) {\n this.lastProgressUpdate = now;\n await this.states.setState(uploadID, {\n val: Math.round((1_000 * (files.length - f)) / files.length) / 10,\n ack: true,\n });\n }\n }\n\n try {\n const content = await fs.readFile(file);\n await this.objects.writeFileAsync(id, attName, content, { mimeType: mimeType || undefined });\n } catch (e) {\n // close the bar's line first, otherwise the message lands inside it and the next\n // redraw overwrites it\n progress?.interrupt();\n console.error(`Error: Cannot upload ${file}: ${e.message}`);\n }\n }\n\n progress?.finish();\n\n // Set upload progress to 0;\n if (!isAdmin && files.length) {\n await this.states.setState(uploadID, { val: 0, ack: true });\n }\n\n return adapter;\n }\n\n // Read synchronous all files recursively from local directory\n /**\n * Recursively collect all file paths below the given directory\n *\n * @param dir The directory to walk\n * @param _results Accumulator of results collected so far\n */\n walk(dir: string, _results?: string[]): string[] {\n const results = _results || [];\n try {\n if (fs.existsSync(dir)) {\n const list = fs.readdirSync(dir);\n list.map(file => {\n const stat = fs.statSync(`${dir}/${file}`);\n if (stat.isDirectory()) {\n this.walk(`${dir}/${file}`, results);\n } else {\n if (!file.endsWith('.npmignore') && !file.endsWith('.gitignore')) {\n results.push(`${dir}/${file}`);\n }\n }\n });\n }\n } catch (e) {\n console.error(e);\n }\n\n return results;\n }\n\n /**\n * Upload given adapter\n *\n * @param adapter adapter name\n * @param isAdmin if admin folder should be uploaded too\n * @param forceUpload if upload should be forced\n * @param subTree subtree path to upload\n * @param _logger logger instance\n */\n async uploadAdapter(\n adapter: string,\n isAdmin: boolean,\n forceUpload: boolean,\n subTree?: string,\n _logger?: MinimalLogger,\n ): Promise<string> {\n const id = adapter + (isAdmin ? '.admin' : '');\n const adapterDir = tools.getAdapterDir(adapter);\n let dir = adapterDir ? adapterDir + (isAdmin ? '/admin' : '/www') : '';\n\n const logger = _logger || console;\n\n if (subTree && dir) {\n dir += `/${subTree}`;\n }\n if (adapterDir === null || !fs.existsSync(adapterDir)) {\n console.log(\n `INFO: Directory \"${\n adapterDir || `for ${adapter}${isAdmin ? '.admin' : ''}`\n }\" does not exist. Nothing was uploaded or deleted.`,\n );\n return adapter;\n }\n\n let cfg;\n try {\n cfg = await fs.readJSON(`${adapterDir}/io-package.json`);\n } catch (e) {\n // file not parsable or does not exist\n console.error(`Could not read io-package.json: ${e.message}`);\n }\n\n if (!fs.existsSync(dir)) {\n // www folder have not all adapters. So show warning only for admin folder\n // widgets do not have www folder, but they have onlyWWW flag\n (isAdmin || (cfg?.common?.onlyWWW && !cfg.common.visWidgets)) &&\n console.log(\n `INFO: Directory \"${\n dir || `for ${adapter}${isAdmin ? '.admin' : ''}`\n }\" was not found! Nothing was uploaded or deleted.`,\n );\n\n if (isAdmin) {\n return adapter;\n }\n await this.checkRestartOther(adapter);\n return adapter;\n }\n\n // check for common.wwwDontUpload (required for legacy adapters and admin)\n if (!isAdmin && cfg?.common?.wwwDontUpload) {\n return adapter;\n }\n\n // Create \"upload progress\" object if not exists\n if (!isAdmin) {\n let obj;\n const uploadID = `system.adapter.${adapter}.upload`;\n try {\n obj = await this.objects.getObject(uploadID);\n } catch {\n // ignore\n }\n if (!obj) {\n await this.objects.setObject(uploadID, {\n _id: uploadID,\n type: 'state',\n common: {\n name: `${adapter}.upload`,\n type: 'number',\n role: 'indicator.state',\n unit: '%',\n min: 0,\n max: 100,\n def: 0,\n desc: 'Upload process indicator',\n read: true,\n write: false,\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {},\n });\n }\n // Set indicator to 0\n await this.states.setState(uploadID, { val: 0, ack: true });\n }\n\n let result;\n try {\n result = await this.objects.getObjectAsync(id);\n } catch {\n // ignore\n }\n // Read all names with subtrees from local directory\n const files = this.walk(dir);\n if (!result) {\n // @ts-expect-error types needed admin is not allowed for meta, but it should be allowed\n await this.objects.setObjectAsync(id, {\n type: 'meta',\n common: {\n name: id.split('.').pop()!,\n type: isAdmin ? 'admin' : 'www',\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {},\n });\n forceUpload = true;\n }\n\n if (forceUpload) {\n // only skip if explicitly opted out\n // The visualization check is needed as user of legacy systems often stored files inside adapter directories like `vis`\n // in the long term, such adapters should explicitly opt out, so we can hopefully remove this line in 2-3 versions (current 5.0)\n if (\n cfg?.common?.eraseOnUpload !== false &&\n !(cfg?.common?.eraseOnUpload === undefined && cfg?.common?.type === 'visualization')\n ) {\n const { filesToDelete } = await this.collectExistingFilesToDelete(\n isAdmin ? `${adapter}.admin` : adapter,\n '/',\n logger,\n );\n // delete old files, before upload of new\n await this.eraseFiles(filesToDelete, logger);\n }\n if (!isAdmin) {\n await this.checkRestartOther(adapter);\n await new Promise<void>(resolve => setTimeout(() => resolve(), 25));\n await this.upload(adapter, isAdmin, files, id, logger);\n } else {\n await this.upload(adapter, isAdmin, files, id, logger);\n }\n }\n return adapter;\n }\n\n /**\n * Deep-merge additional values into the native section of an object\n *\n * @param target The target object to extend\n * @param additional The additional values to merge in\n */\n extendNative(target: Record<string, any>, additional: Record<string, unknown>): Record<string, any> {\n if (tools.isObject(additional)) {\n for (const [attr, attrData] of Object.entries(additional)) {\n if (target[attr] === undefined) {\n target[attr] = attrData;\n } else if (tools.isObject(attrData)) {\n try {\n target[attr] = target[attr] || {};\n } catch {\n console.warn(`Cannot update attribute ${attr} of native`);\n }\n if (typeof target[attr] === 'object' && target[attr] !== null) {\n this.extendNative(target[attr], attrData);\n }\n }\n }\n }\n return target;\n }\n\n /**\n * Merge additional values into the common section of an instance object, preserving some attributes\n *\n * @param target The target common object to extend\n * @param additional The additional values to merge in\n * @param instance The instance id the common belongs to\n */\n extendCommon(\n target: Record<string, any>,\n additional: Record<string, any>,\n instance: string,\n ): ioBroker.InstanceCommon {\n if (tools.isObject(additional)) {\n const preserveAttributes = [\n 'title',\n 'schedule',\n 'restartSchedule',\n 'mode',\n 'loglevel',\n 'enabled',\n 'custom',\n 'tier',\n ];\n\n // Object attributes that should be completely replaced, not merged\n const replaceAttributes = ['adminUI', 'adminTab', 'adminColumns'];\n\n for (const [attr, attrData] of Object.entries(additional)) {\n // preserve these attributes, except, they were undefined before and preserve titleLang if current titleLang is of type string (changed by user)\n if (preserveAttributes.includes(attr) || (attr === 'titleLang' && typeof target[attr] === 'string')) {\n if (target[attr] === undefined) {\n target[attr] = attrData;\n }\n } else if (\n typeof attrData !== 'object' ||\n attrData instanceof Array ||\n replaceAttributes.includes(attr)\n ) {\n try {\n target[attr] = attrData;\n\n // dataFolder can have wildcards\n if (attr === 'dataFolder' && target.dataFolder && target.dataFolder.includes('%INSTANCE%')) {\n target.dataFolder = target.dataFolder.replace(/%INSTANCE%/g, instance);\n }\n } catch {\n console.warn(`Cannot update attribute ${attr} of common`);\n }\n } else {\n target[attr] = target[attr] || {};\n if (typeof target[attr] !== 'object') {\n target[attr] = {}; // here we clean the simple value with object\n }\n\n this.extendCommon(target[attr], attrData, instance);\n }\n }\n }\n return target as ioBroker.InstanceCommon;\n }\n\n /**\n * Extends the `system.instance.adapter.<instanceNumber>` objects with the native properties from adapters io-package.json\n *\n * @param name name of the adapter\n * @param ioPack parsed io-package content\n * @param hostname name of the host where the adapter is installed on\n * @param logger instance of logger\n */\n async _upgradeAdapterObjectsHelper(\n name: string,\n ioPack: ioBroker.AdapterObject,\n hostname: string,\n logger: MinimalLogger | typeof console,\n ): Promise<string> {\n // Update all instances of this host\n const res = await this.objects.getObjectViewAsync('system', 'instance', {\n startkey: `system.adapter.${name}.`,\n endkey: `system.adapter.${name}.\\u9999`,\n });\n\n if (res) {\n for (const row of res.rows) {\n if (row.value?.common.host === hostname) {\n const _obj = await this.objects.getObject(row.id);\n const newObject = deepClone(_obj) as ioBroker.InstanceObject;\n\n // TODO: refactor the following assignments into a method, where we can define which attributes need a real override and their defaults\n\n // all common settings should be taken from new one\n newObject.common = this.extendCommon(\n newObject.common,\n ioPack.common,\n newObject._id.split('.').pop()!,\n );\n newObject.native = this.extendNative(newObject.native, ioPack.native);\n\n // protected/encryptedNative and notifications also need to be updated\n newObject.protectedNative = ioPack.protectedNative || [];\n newObject.encryptedNative = ioPack.encryptedNative || [];\n newObject.notifications = ioPack.notifications || [];\n // update instanceObjects and objects\n newObject.instanceObjects = ioPack.instanceObjects || [];\n newObject.objects = ioPack.objects || [];\n\n newObject.common.version = ioPack.common.version;\n newObject.common.installedVersion = ioPack.common.version;\n newObject.common.installedFrom = ioPack.common.installedFrom;\n\n // do not merge visWidgets and localLinks\n if (ioPack.common.visWidgets) {\n newObject.common.visWidgets = ioPack.common.visWidgets;\n } else {\n delete newObject.common.visWidgets;\n }\n\n if (ioPack.common.localLinks) {\n newObject.common.localLinks = ioPack.common.localLinks;\n } else {\n delete newObject.common.localLinks;\n }\n\n if (!ioPack.common.compact && newObject.common.compact) {\n newObject.common.compact = ioPack.common.compact;\n }\n\n // Compare objects to reduce restarts of instances\n if (!isDeepStrictEqual(newObject, _obj)) {\n logger.log(`Update \"${newObject._id}\"`);\n\n newObject.from = `system.host.${tools.getHostName()}.cli`;\n newObject.ts = Date.now();\n\n await this.objects.setObjectAsync(newObject._id, newObject);\n }\n }\n }\n }\n\n // updates only \"_design/system\" and co \"_design/*\"\n if (Array.isArray(ioPack.objects)) {\n for (const obj of ioPack.objects) {\n if (name === 'js-controller' && !obj._id.startsWith('_design/')) {\n continue;\n }\n\n obj.from = `system.host.${hostname}.cli`;\n obj.ts = Date.now();\n\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n } catch (e) {\n logger.error(`Cannot update object: ${e}`);\n }\n }\n }\n\n return name;\n }\n\n /**\n * Create object from io-package json\n *\n * @param name adapter name\n * @param ioPack IoPack content\n * @param logger logger instance\n */\n async upgradeAdapterObjects(\n name: string,\n ioPack?: ioBroker.AdapterObject,\n logger: MinimalLogger | typeof console = console,\n ): Promise<string> {\n const adapterDir = tools.getAdapterDir(name);\n let ioPackFile;\n try {\n ioPackFile = fs.readJSONSync(`${adapterDir}/io-package.json`);\n } catch {\n if (adapterDir) {\n logger.error(`Cannot find io-package.json in ${adapterDir}`);\n } else {\n logger.error(`Cannot find io-package.json for \"${name}\"`);\n }\n ioPackFile = null;\n }\n\n ioPack = ioPack || ioPackFile;\n\n if (ioPack) {\n logger.log(\n `Updating objects from io-package.json for adapter \"${name}\" with version \"${ioPack.common.version}\"`,\n );\n // Always update installedFrom from File on disk if exists and set\n if (ioPackFile?.common?.installedFrom) {\n ioPack.common = ioPack.common || {};\n ioPack.common.installedFrom = ioPackFile.common.installedFrom;\n }\n // Not existing? Why ever ... we recreate\n let _obj;\n try {\n _obj = await this.objects.getObject(`system.adapter.${name}`);\n } catch {\n // ignore err\n }\n const obj: Omit<ioBroker.AdapterObject, '_id'> = _obj || {\n common: ioPack.common,\n native: ioPack.native,\n type: 'adapter',\n instanceObjects: [],\n objects: [],\n };\n\n obj.common = ioPack.common || {};\n obj.native = ioPack.native || {};\n // protected/encryptedNative and notifications also need to be updated\n obj.protectedNative = ioPack.protectedNative || [];\n obj.encryptedNative = ioPack.encryptedNative || [];\n obj.notifications = ioPack.notifications || [];\n // update instanceObjects and objects\n obj.instanceObjects = ioPack.instanceObjects || [];\n obj.objects = ioPack.objects || [];\n\n obj.type = 'adapter';\n\n obj.common.installedVersion = ioPack.common.version;\n\n if (obj.common.news) {\n delete obj.common.news; // remove this information as it could be big, but it will be taken from repo\n }\n\n const hostname = tools.getHostName();\n\n obj.from = `system.host.${hostname}.cli`;\n obj.ts = Date.now();\n\n try {\n await this.objects.setObject(`system.adapter.${name}`, obj);\n await this.objects.setObject(`system.host.${hostname}.adapter.${name}`, obj);\n } catch (e) {\n logger.error(\n `Cannot set \"system.adapter.${name}\" and \"system.host.${hostname}.adapters.${name}\": ${e.message}`,\n );\n }\n\n await this._upgradeAdapterObjectsHelper(name, ioPack, hostname, logger);\n }\n\n return name;\n }\n}\n\n/**\n * @param options The process command options\n */\nexport function processCommandUpload(options: ProcessCommandOptions): void {\n const { args, params, callback } = options;\n const { showHelp } = options.commandOptions;\n\n const name = args[0];\n const subTree = args[1];\n if (name) {\n dbConnect(params, async ({ objects, states }) => {\n const upload = new Upload({ states, objects });\n\n if (name === 'all') {\n try {\n const objs = await objects.getObjectListAsync({\n startkey: 'system.adapter.',\n endkey: 'system.adapter.\\u9999',\n });\n\n if (objs) {\n const adapters = [];\n\n for (const row of objs.rows) {\n if (row.value.type !== 'adapter') {\n continue;\n }\n\n adapters.push(\n tools.isObject(row.value.common.name)\n ? row.value.common.name.en\n : row.value.common.name,\n );\n }\n\n await upload.uploadAdapterFullAsync(adapters);\n }\n callback();\n } catch (err) {\n console.error(`Cannot upload all adapters: ${err.message}`);\n return void callback(EXIT_CODES.CANNOT_UPLOAD_DATA);\n }\n } else {\n // if upload of file\n if (name.includes('.')) {\n if (!subTree) {\n console.log(\n `Please specify target name, like:\\n${tools.appName} upload /file/picture.png /vis-2.0/main/img/picture.png`,\n );\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n\n try {\n const newName = await upload.uploadFile(name, subTree);\n console.log(`File \"${name}\" is successfully saved under ${newName}`);\n return void callback();\n } catch (err) {\n console.error(`Cannot upload file \"${name}\": ${err.message}`);\n return void callback(EXIT_CODES.CANNOT_UPLOAD_DATA);\n }\n } else {\n try {\n if (subTree) {\n await upload.uploadAdapter(name, false, true, subTree);\n } else {\n await upload.uploadAdapterFullAsync([name]);\n }\n return void callback();\n } catch (err) {\n console.error(`Cannot upload files \"${name}\": ${err.message}`);\n return void callback(EXIT_CODES.CANNOT_UPLOAD_DATA);\n }\n }\n }\n });\n } else {\n console.log('No adapter name found!');\n showHelp();\n return void callback(EXIT_CODES.INVALID_ADAPTER_ID);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["fs", "axios", "mime", "hostname", "deepClone"]
|
|
7
7
|
}
|