iobroker.admin 7.7.1 → 7.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +3 -4
  2. package/adminWww/assets/{AdapterUpdateDialog-Bgswiqs9.js → AdapterUpdateDialog-DHGhgEEq.js} +1 -1
  3. package/adminWww/assets/{Adapters-yQiEeoh8.js → Adapters-CgSIajcF.js} +2 -2
  4. package/adminWww/assets/{Config-C1Gjt8DC.js → Config-BQSl4bfA.js} +1 -1
  5. package/adminWww/assets/{CustomModal-CgEtkfCG.js → CustomModal-DNMTLv4y.js} +1 -1
  6. package/adminWww/assets/{CustomTab-CwioFUor.js → CustomTab-Bl8S8QZW.js} +1 -1
  7. package/adminWww/assets/{DefaultPropsProvider-DxsXuIyE.js → DefaultPropsProvider-u5xB1Fxz.js} +1 -1
  8. package/adminWww/assets/{EasyMode-CN-reJVI.js → EasyMode-xDbqrply.js} +1 -1
  9. package/adminWww/assets/{Enums-8m252lzC.js → Enums-BSICIhWI.js} +1 -1
  10. package/adminWww/assets/{Fields-lI3YkIzQ.js → Fields-C3JkTmfP.js} +1 -1
  11. package/adminWww/assets/{Files-fQpSPYWI.js → Files-DK85-COY.js} +2 -2
  12. package/adminWww/assets/{FilledInput-CKswrNd5.js → FilledInput-CysG4ax_.js} +1 -1
  13. package/adminWww/assets/{Hosts-BPdUlXV5.js → Hosts-qIsB4Gub.js} +2 -2
  14. package/adminWww/assets/Instances-BA_DCzs8.js +2 -0
  15. package/adminWww/assets/{Intro-Dr1-aqO9.js → Intro-00oh6SLw.js} +1 -1
  16. package/adminWww/assets/{Logs-xCCrWV30.js → Logs-Cvpgh-zN.js} +1 -1
  17. package/adminWww/assets/Objects-Dp71iotS.js +60 -0
  18. package/adminWww/assets/{State-nZ6sjU9_.js → State-BqfD2ABf.js} +1 -1
  19. package/adminWww/assets/{Tabs-BJ1rL35Z.js → Tabs-sxfWgN0b.js} +2 -2
  20. package/adminWww/assets/{Users-B0iasrSG.js → Users-CDcWqTfZ.js} +1 -1
  21. package/adminWww/assets/ace-BG5WYul1.js +985 -0
  22. package/adminWww/assets/{blueGrey-D-KQaGde.js → blueGrey-DYsiMDOn.js} +1 -1
  23. package/adminWww/assets/{bootstrap-DDrI3lVl.js → bootstrap-BYQTdf9r.js} +91 -103
  24. package/adminWww/assets/{createSvgIcon-DuKI6CvW.js → createSvgIcon-Bh3KWtyp.js} +1 -1
  25. package/adminWww/assets/{emotion-react.browser.esm-DApPKwaj.js → emotion-react.browser.esm-BCDt9NrH.js} +1 -1
  26. package/adminWww/assets/{emotion-styled.browser.esm-Dc05hmeu.js → emotion-styled.browser.esm-CyFqGgyG.js} +1 -1
  27. package/adminWww/assets/{emotion-utils.browser.esm-DOjH6Olm.js → emotion-utils.browser.esm-pglN4_eI.js} +1 -1
  28. package/adminWww/assets/{geosearch.module-CWfRtxrN.js → geosearch.module-DH4NhiPj.js} +1 -1
  29. package/adminWww/assets/hostInit-fzxL8JAx.js +1 -1
  30. package/adminWww/assets/{iconBase-CgxZ5MMC.js → iconBase-C3vi24ZE.js} +1 -1
  31. package/adminWww/assets/{index-BmWdDCX_.js → index-B1ITPhEY.js} +2 -2
  32. package/adminWww/assets/{index-D7Rlw-5R.js → index-D--ojYan.js} +1 -1
  33. package/adminWww/assets/{index-BjVqnwqt.js → index-D3IAEXXP.js} +1 -1
  34. package/adminWww/assets/{index-HOidq_rM.js → index-DPDg2YA0.js} +1 -1
  35. package/adminWww/assets/{index-Bsv_DXxB.js → index-DTGUg51P.js} +1 -1
  36. package/adminWww/assets/{index-BP5kWU3L.js → index-Qa7Q_Dz5.js} +1 -1
  37. package/adminWww/assets/{index-RvHSqeMD.js → index-qcIeekse.js} +13 -13
  38. package/adminWww/assets/{index-gHyOgbGJ.js → index-rKfs-rCa.js} +1 -1
  39. package/adminWww/assets/{index-DH1kmwK1.js → index-wN1ZlPSW.js} +2 -2
  40. package/adminWww/assets/iobroker_admin__loadShare___mf_0_emotion_mf_1_react__loadShare__-BOKYvG_W.js +1 -0
  41. package/adminWww/assets/{iobroker_admin__loadShare__leaflet__loadShare__-B1OZ7tj-.js → iobroker_admin__loadShare__leaflet__loadShare__-h9SMNPLU.js} +1 -1
  42. package/adminWww/assets/iobroker_admin__loadShare__prop_mf_2_types__loadShare__-BnsS7SOQ.js +1 -0
  43. package/adminWww/assets/{iobroker_admin__loadShare__react__loadShare__-DtlEM_52.js → iobroker_admin__loadShare__react__loadShare__-Bis6NHgw.js} +1 -1
  44. package/adminWww/assets/iobroker_admin__mf_v__runtimeInit__mf_v__-CTkuGOOk.js +5 -0
  45. package/adminWww/assets/{sentry-CNy_SQq1.js → sentry-H_UdJ2zx.js} +1 -1
  46. package/adminWww/assets/{zh-cn-DZTx1vAh.js → zh-cn-vvAC9zpl.js} +3 -3
  47. package/adminWww/index.html +2 -2
  48. package/adminWww/mf-manifest.json +1 -1
  49. package/adminWww/remoteEntry.js +2 -2
  50. package/adminWww/static/js/worker-javascript.js +1 -1
  51. package/adminWww/static/js/worker-yaml.js +1 -1
  52. package/io-package.json +14 -14
  53. package/package.json +10 -9
  54. package/adminWww/assets/Instances-BStmfz4r.js +0 -2
  55. package/adminWww/assets/Objects-BF8brXaf.js +0 -60
  56. package/adminWww/assets/ace-CFIUQz8j.js +0 -970
  57. package/adminWww/assets/iobroker_admin__loadShare___mf_0_emotion_mf_1_react__loadShare__-gw2iqPBS.js +0 -1
  58. package/adminWww/assets/iobroker_admin__loadShare__prop_mf_2_types__loadShare__-BGyJCibC.js +0 -1
  59. package/adminWww/assets/iobroker_admin__mf_v__runtimeInit__mf_v__-VDoBF19b.js +0 -10
  60. package/build-backend/src/lib/checkLinuxPass.js +0 -280
  61. package/build-backend/src/lib/checkLinuxPass.js.map +0 -1
  62. package/build-backend/src/lib/testPassword.js +0 -58
  63. package/build-backend/src/lib/testPassword.js.map +0 -1
  64. package/build-backend/src/lib/translations.js +0 -27
  65. package/build-backend/src/lib/translations.js.map +0 -1
  66. package/build-backend/src/lib/utils.js +0 -344
  67. package/build-backend/src/lib/utils.js.map +0 -1
  68. package/build-backend/src/lib/web.js +0 -1165
  69. package/build-backend/src/lib/web.js.map +0 -1
  70. package/build-backend/src/main.js +0 -1704
  71. package/build-backend/src/main.js.map +0 -1
  72. package/build-backend/src-admin/src/components/Adapters/Utils.js +0 -39
  73. package/build-backend/src-admin/src/components/Adapters/Utils.js.map +0 -1
@@ -1,344 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AUTO_UPGRADE_OPTIONS_MAPPING = exports.AUTO_UPGRADE_SETTINGS = exports.CONTROLLER_CHANGELOG_URL = void 0;
4
- exports.replaceLink = replaceLink;
5
- /** Url where controller changelog is reachable */
6
- exports.CONTROLLER_CHANGELOG_URL = 'https://github.com/ioBroker/ioBroker.js-controller/blob/master/CHANGELOG.md';
7
- /** All possible auto upgrade settings */
8
- exports.AUTO_UPGRADE_SETTINGS = ['none', 'patch', 'minor', 'major'];
9
- /** Mapping to make it more understandable which upgrades are allowed */
10
- exports.AUTO_UPGRADE_OPTIONS_MAPPING = {
11
- none: 'none',
12
- patch: 'patch',
13
- minor: 'patch & minor',
14
- major: 'patch, minor & major',
15
- };
16
- function ip2int(ip) {
17
- return ip.split('.').reduce((ipInt, octet) => (ipInt << 8) + parseInt(octet, 10), 0) >>> 0;
18
- }
19
- function findNetworkAddressOfHost(obj, localIp) {
20
- const networkInterfaces = obj?.native?.hardware?.networkInterfaces;
21
- if (!networkInterfaces) {
22
- return null;
23
- }
24
- let hostIp;
25
- for (const networkInterface of Object.values(networkInterfaces)) {
26
- if (!networkInterface) {
27
- continue;
28
- }
29
- for (let i = 0; i < networkInterface.length; i++) {
30
- const ip = networkInterface[i];
31
- if (ip.internal) {
32
- return;
33
- }
34
- if (localIp.includes(':') && ip.family !== 'IPv6') {
35
- return;
36
- }
37
- if (localIp.includes('.') && !localIp.match(/[^.\d]/) && ip.family !== 'IPv4') {
38
- return;
39
- }
40
- if (localIp === '127.0.0.0' || localIp === 'localhost' || localIp.match(/[^.\d]/)) {
41
- // if DNS name
42
- hostIp = ip.address;
43
- }
44
- else if (ip.family === 'IPv4' &&
45
- localIp.includes('.') &&
46
- (ip2int(localIp) & ip2int(ip.netmask)) === (ip2int(ip.address) & ip2int(ip.netmask))) {
47
- hostIp = ip.address;
48
- }
49
- else {
50
- hostIp = ip.address;
51
- }
52
- }
53
- }
54
- if (!hostIp) {
55
- for (const networkInterface of Object.values(networkInterfaces)) {
56
- if (!networkInterface) {
57
- continue;
58
- }
59
- for (let i = 0; i < networkInterface.length; i++) {
60
- const ip = networkInterface[i];
61
- if (ip.internal) {
62
- return;
63
- }
64
- if (localIp.includes(':') && ip.family !== 'IPv6') {
65
- return;
66
- }
67
- if (localIp.includes('.') && !localIp.match(/[^.\d]/) && ip.family !== 'IPv4') {
68
- return;
69
- }
70
- if (localIp === '127.0.0.0' || localIp === 'localhost' || localIp.match(/[^.\d]/)) {
71
- // if DNS name
72
- hostIp = ip.address;
73
- }
74
- else {
75
- hostIp = ip.address;
76
- }
77
- }
78
- }
79
- }
80
- if (!hostIp) {
81
- for (const networkInterface of Object.values(networkInterfaces)) {
82
- if (!networkInterface) {
83
- continue;
84
- }
85
- for (let i = 0; i < networkInterface.length; i++) {
86
- const ip = networkInterface[i];
87
- if (ip.internal) {
88
- return;
89
- }
90
- hostIp = ip.address;
91
- }
92
- }
93
- }
94
- return hostIp;
95
- }
96
- function getHostname(instanceObj, objects, hosts, currentHostname, adminInstance) {
97
- if (!instanceObj || !instanceObj.common) {
98
- return null;
99
- }
100
- let hostname;
101
- // check if the adapter from the same host as admin
102
- const adminHost = objects[`system.adapter.${adminInstance}`]?.common?.host;
103
- if (instanceObj.common.host !== adminHost) {
104
- // find IP address
105
- const host = hosts[`system.host.${instanceObj.common.host}`];
106
- if (host) {
107
- const ip = findNetworkAddressOfHost(host, currentHostname);
108
- if (ip) {
109
- hostname = ip;
110
- }
111
- else {
112
- console.warn(`Cannot find suitable IP in host ${instanceObj.common.host} for ${instanceObj._id}`);
113
- return null;
114
- }
115
- }
116
- else {
117
- console.warn(`Cannot find host ${instanceObj.common.host} for ${instanceObj._id}`);
118
- return null;
119
- }
120
- }
121
- else {
122
- hostname = currentHostname;
123
- }
124
- return hostname;
125
- }
126
- // internal use
127
- function _replaceLink(link, objects, adapterInstance, attr, placeholder, hosts, hostname, adminInstance) {
128
- if (attr === 'protocol') {
129
- attr = 'secure';
130
- }
131
- try {
132
- const object = objects[`system.adapter.${adapterInstance}`];
133
- if (link && object) {
134
- if (attr === 'secure') {
135
- link = link.replace(`%${placeholder}%`, object.native[attr] ? 'https' : 'http');
136
- }
137
- else {
138
- let value = object.native[attr];
139
- // workaround for port
140
- if ((attr === 'webinterfacePort' || attr === 'port') && (!value || value === '0')) {
141
- if (object.native.secure === true) {
142
- value = 443;
143
- }
144
- else {
145
- value = 80;
146
- }
147
- }
148
- if (attr === 'bind' || attr === 'ip') {
149
- let ip = object.native.bind || object.native.ip;
150
- if (ip === '0.0.0.0') {
151
- ip = getHostname(object, objects, hosts, hostname, adminInstance);
152
- }
153
- if (!link.includes(`%${placeholder}%`)) {
154
- link = link.replace(`%native_${placeholder}%`, ip || '');
155
- }
156
- else {
157
- link = link.replace(`%${placeholder}%`, ip || '');
158
- }
159
- }
160
- else if (!link.includes(`%${placeholder}%`)) {
161
- link = link.replace(`%native_${placeholder}%`, value);
162
- }
163
- else {
164
- link = link.replace(`%${placeholder}%`, value);
165
- }
166
- }
167
- }
168
- else {
169
- console.log(`Cannot get link ${attr}`);
170
- link = link.replace(`%${placeholder}%`, '');
171
- }
172
- }
173
- catch (error) {
174
- console.log(error);
175
- }
176
- return link;
177
- }
178
- /**
179
- * Convert the template link to string
180
- *
181
- * Possible placeholders:
182
- * `%ip%` - `native.bind` or `native.ip` of this adapter. If it is '0.0.0.0', we are trying to find the host IP that is reachable from the current browser.
183
- * `%protocol%` - `native.protocol` or `native.secure` of this adapter. The result is 'http' or 'https'.
184
- * `%s%` - `native.protocol` or `native.secure` of this adapter. The result is '' or 's'. The idea is to use the pattern like "http%s%://..."
185
- * `%instance%` - instance number
186
- * `%adapterName_nativeAttr%` - Takes the native value `nativeAttr` of all instances of adapterName. This generates many links if more than one instance installed
187
- * `%adapterName.x_nativeAttr%` - Takes the native value `nativeAttr` of adapterName.x instance
188
- *
189
- * @param link pattern for link
190
- * @param adapter adapter name
191
- * @param instance adapter instance number
192
- * @param context Context object
193
- * @param context.instances Object with all instances
194
- * @param context.hostname Actual host name
195
- * @param context.adminInstance Actual admin instance
196
- * @param context.hosts Object with all hosts
197
- */
198
- function replaceLink(link, adapter, instance, context) {
199
- const _urls = [];
200
- let port;
201
- if (link) {
202
- const instanceObj = context.instances[`system.adapter.${adapter}.${instance}`];
203
- const native = instanceObj?.native || {};
204
- const placeholders = link.match(/%(\w+)%/g);
205
- if (placeholders) {
206
- for (let p = 0; p < placeholders.length; p++) {
207
- let placeholder = placeholders[p];
208
- if (placeholder === '%ip%') {
209
- let ip = (native.bind || native.ip);
210
- if (!ip || ip === '0.0.0.0') {
211
- // Check host
212
- ip = getHostname(instanceObj, context.instances, context.hosts, context.hostname, context.adminInstance);
213
- }
214
- if (_urls.length) {
215
- _urls.forEach(item => (item.url = item.url.replace('%ip%', ip)));
216
- }
217
- else {
218
- link = link.replace('%ip%', ip || '');
219
- }
220
- }
221
- else if (placeholder === '%protocol%') {
222
- const protocolVal = native.secure === undefined ? native.protocol : native.secure;
223
- let protocol;
224
- if (protocolVal === true || protocolVal === 'true') {
225
- protocol = 'https';
226
- }
227
- else if (protocolVal === false || protocolVal === 'false' || !protocolVal) {
228
- protocol = 'http';
229
- }
230
- else {
231
- protocol = protocolVal.toString().replace(/:$/, '');
232
- }
233
- if (_urls.length) {
234
- _urls.forEach(item => (item.url = item.url.replace('%protocol%', protocol)));
235
- }
236
- else {
237
- link = link.replace('%protocol%', protocol);
238
- }
239
- }
240
- else if (placeholder === '%s%') {
241
- const protocolVal = native.secure === undefined ? native.protocol : native.secure;
242
- let protocol;
243
- if (protocolVal === true || protocolVal === 'true') {
244
- protocol = 's';
245
- }
246
- else if (protocolVal === false || protocolVal === 'false' || !protocolVal) {
247
- protocol = '';
248
- }
249
- else {
250
- protocol = protocolVal.toString().replace(/:$/, '');
251
- }
252
- if (_urls.length) {
253
- _urls.forEach(item => (item.url = item.url.replace('%s%', protocol)));
254
- }
255
- else {
256
- link = link.replace('%s%', protocol);
257
- }
258
- }
259
- else if (placeholder === '%instance%') {
260
- link = link.replace('%instance%', instance.toString());
261
- if (_urls.length) {
262
- _urls.forEach(item => (item.url = item.url.replace('%instance%', instance.toString())));
263
- }
264
- else {
265
- link = link.replace('%instance%', instance.toString());
266
- }
267
- }
268
- else {
269
- // remove %%
270
- placeholder = placeholder.replace(/%/g, '');
271
- if (placeholder.startsWith('native_')) {
272
- placeholder = placeholder.substring(7);
273
- }
274
- // like web.0_port or web_protocol
275
- if (!placeholder.includes('_')) {
276
- // if only one instance
277
- const adapterInstance = `${adapter}.${instance}`;
278
- if (_urls.length) {
279
- _urls.forEach(item => (item.url = _replaceLink(item.url, context.instances, adapterInstance, placeholder, placeholder, context.hosts, context.hostname, context.adminInstance)));
280
- }
281
- else {
282
- link = _replaceLink(link, context.instances, adapterInstance, placeholder, placeholder, context.hosts, context.hostname, context.adminInstance);
283
- port = context.instances[`system.adapter.${adapterInstance}`]?.native?.port;
284
- }
285
- }
286
- else {
287
- const [adapterInstance, attr] = placeholder.split('_');
288
- // if instance number not found
289
- if (!adapterInstance.match(/\.[0-9]+$/)) {
290
- // list all possible instances
291
- let ids;
292
- if (adapter === adapterInstance) {
293
- // take only this one instance and that's all
294
- ids = [`${adapter}.${instance}`];
295
- }
296
- else {
297
- ids = Object.keys(context.instances)
298
- .filter(id => id.startsWith(`system.adapter.${adapterInstance}.`) &&
299
- context.instances[id].common.enabled)
300
- .map(id => id.substring(15));
301
- // try to get disabled instances
302
- if (!ids.length) {
303
- ids = Object.keys(context.instances)
304
- .filter(id => id.startsWith(`system.adapter.${adapterInstance}.`))
305
- .map(id => id.substring(15));
306
- }
307
- }
308
- for (const id of ids) {
309
- if (_urls.length) {
310
- const item = _urls.find(t => t.instance === id);
311
- if (item) {
312
- item.url = _replaceLink(item.url, context.instances, id, attr, placeholder, context.hosts, context.hostname, context.adminInstance);
313
- }
314
- else {
315
- // add new
316
- const _link = _replaceLink(link, context.instances, id, attr, placeholder, context.hosts, context.hostname, context.adminInstance);
317
- const _port = context.instances[`system.adapter.${id}`]?.native
318
- ?.port;
319
- _urls.push({ url: _link, port: _port, instance: id });
320
- }
321
- }
322
- else {
323
- const _link = _replaceLink(link, context.instances, id, attr, placeholder, context.hosts, context.hostname, context.adminInstance);
324
- const _port = context.instances[`system.adapter.${id}`]?.native
325
- ?.port;
326
- _urls.push({ url: _link, port: _port, instance: id });
327
- }
328
- }
329
- }
330
- else {
331
- link = _replaceLink(link, context.instances, adapterInstance, attr, placeholder, context.hosts, context.hostname, context.adminInstance);
332
- port = context.instances[`system.adapter.${adapterInstance}`]?.native?.port;
333
- }
334
- }
335
- }
336
- }
337
- }
338
- }
339
- if (_urls.length) {
340
- return _urls;
341
- }
342
- return [{ url: link, port }];
343
- }
344
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/** Url where controller changelog is reachable */\nexport const CONTROLLER_CHANGELOG_URL = 'https://github.com/ioBroker/ioBroker.js-controller/blob/master/CHANGELOG.md';\n\n/** All possible auto upgrade settings */\nexport const AUTO_UPGRADE_SETTINGS: ioBroker.AutoUpgradePolicy[] = ['none', 'patch', 'minor', 'major'];\n\n/** Mapping to make it more understandable which upgrades are allowed */\nexport const AUTO_UPGRADE_OPTIONS_MAPPING: Record<ioBroker.AutoUpgradePolicy, string> = {\n none: 'none',\n patch: 'patch',\n minor: 'patch & minor',\n major: 'patch, minor & major',\n};\n\nfunction ip2int(ip: string): number {\n return ip.split('.').reduce((ipInt, octet) => (ipInt << 8) + parseInt(octet, 10), 0) >>> 0;\n}\n\nfunction findNetworkAddressOfHost(obj: ioBroker.HostObject, localIp: string): null | string {\n const networkInterfaces = obj?.native?.hardware?.networkInterfaces;\n if (!networkInterfaces) {\n return null;\n }\n\n let hostIp;\n for (const networkInterface of Object.values(networkInterfaces)) {\n if (!networkInterface) {\n continue;\n }\n for (let i = 0; i < networkInterface.length; i++) {\n const ip = networkInterface[i];\n if (ip.internal) {\n return;\n }\n if (localIp.includes(':') && ip.family !== 'IPv6') {\n return;\n }\n if (localIp.includes('.') && !localIp.match(/[^.\\d]/) && ip.family !== 'IPv4') {\n return;\n }\n if (localIp === '127.0.0.0' || localIp === 'localhost' || localIp.match(/[^.\\d]/)) {\n // if DNS name\n hostIp = ip.address;\n } else if (\n ip.family === 'IPv4' &&\n localIp.includes('.') &&\n (ip2int(localIp) & ip2int(ip.netmask)) === (ip2int(ip.address) & ip2int(ip.netmask))\n ) {\n hostIp = ip.address;\n } else {\n hostIp = ip.address;\n }\n }\n }\n\n if (!hostIp) {\n for (const networkInterface of Object.values(networkInterfaces)) {\n if (!networkInterface) {\n continue;\n }\n for (let i = 0; i < networkInterface.length; i++) {\n const ip = networkInterface[i];\n if (ip.internal) {\n return;\n }\n if (localIp.includes(':') && ip.family !== 'IPv6') {\n return;\n }\n if (localIp.includes('.') && !localIp.match(/[^.\\d]/) && ip.family !== 'IPv4') {\n return;\n }\n if (localIp === '127.0.0.0' || localIp === 'localhost' || localIp.match(/[^.\\d]/)) {\n // if DNS name\n hostIp = ip.address;\n } else {\n hostIp = ip.address;\n }\n }\n }\n }\n\n if (!hostIp) {\n for (const networkInterface of Object.values(networkInterfaces)) {\n if (!networkInterface) {\n continue;\n }\n for (let i = 0; i < networkInterface.length; i++) {\n const ip = networkInterface[i];\n if (ip.internal) {\n return;\n }\n hostIp = ip.address;\n }\n }\n }\n\n return hostIp;\n}\n\nfunction getHostname(\n instanceObj: ioBroker.InstanceObject,\n objects: Record<string, ioBroker.InstanceObject>,\n hosts: Record<string, ioBroker.HostObject>,\n currentHostname: string,\n adminInstance: string,\n): string {\n if (!instanceObj || !instanceObj.common) {\n return null;\n }\n\n let hostname;\n // check if the adapter from the same host as admin\n const adminHost = objects[`system.adapter.${adminInstance}`]?.common?.host;\n if (instanceObj.common.host !== adminHost) {\n // find IP address\n const host = hosts[`system.host.${instanceObj.common.host}`];\n if (host) {\n const ip = findNetworkAddressOfHost(host, currentHostname);\n if (ip) {\n hostname = ip;\n } else {\n console.warn(`Cannot find suitable IP in host ${instanceObj.common.host} for ${instanceObj._id}`);\n return null;\n }\n } else {\n console.warn(`Cannot find host ${instanceObj.common.host} for ${instanceObj._id}`);\n return null;\n }\n } else {\n hostname = currentHostname;\n }\n\n return hostname;\n}\n\n// internal use\nfunction _replaceLink(\n link: string,\n objects: Record<string, ioBroker.InstanceObject>,\n adapterInstance: string,\n attr: string,\n placeholder: string,\n hosts: Record<string, ioBroker.HostObject>,\n hostname: string,\n adminInstance: string,\n): string {\n if (attr === 'protocol') {\n attr = 'secure';\n }\n\n try {\n const object = objects[`system.adapter.${adapterInstance}`];\n\n if (link && object) {\n if (attr === 'secure') {\n link = link.replace(`%${placeholder}%`, object.native[attr] ? 'https' : 'http');\n } else {\n let value = object.native[attr];\n // workaround for port\n if ((attr === 'webinterfacePort' || attr === 'port') && (!value || value === '0')) {\n if (object.native.secure === true) {\n value = 443;\n } else {\n value = 80;\n }\n }\n\n if (attr === 'bind' || attr === 'ip') {\n let ip = object.native.bind || object.native.ip;\n if (ip === '0.0.0.0') {\n ip = getHostname(object, objects, hosts, hostname, adminInstance);\n }\n if (!link.includes(`%${placeholder}%`)) {\n link = link.replace(`%native_${placeholder}%`, ip || '');\n } else {\n link = link.replace(`%${placeholder}%`, ip || '');\n }\n } else if (!link.includes(`%${placeholder}%`)) {\n link = link.replace(`%native_${placeholder}%`, value);\n } else {\n link = link.replace(`%${placeholder}%`, value);\n }\n }\n } else {\n console.log(`Cannot get link ${attr}`);\n link = link.replace(`%${placeholder}%`, '');\n }\n } catch (error) {\n console.log(error);\n }\n return link;\n}\n\n/**\n * Convert the template link to string\n *\n * Possible placeholders:\n * `%ip%` - `native.bind` or `native.ip` of this adapter. If it is '0.0.0.0', we are trying to find the host IP that is reachable from the current browser.\n * `%protocol%` - `native.protocol` or `native.secure` of this adapter. The result is 'http' or 'https'.\n * `%s%` - `native.protocol` or `native.secure` of this adapter. The result is '' or 's'. The idea is to use the pattern like \"http%s%://...\"\n * `%instance%` - instance number\n * `%adapterName_nativeAttr%` - Takes the native value `nativeAttr` of all instances of adapterName. This generates many links if more than one instance installed\n * `%adapterName.x_nativeAttr%` - Takes the native value `nativeAttr` of adapterName.x instance\n *\n * @param link pattern for link\n * @param adapter adapter name\n * @param instance adapter instance number\n * @param context Context object\n * @param context.instances Object with all instances\n * @param context.hostname Actual host name\n * @param context.adminInstance Actual admin instance\n * @param context.hosts Object with all hosts\n */\nexport function replaceLink(\n link: string,\n adapter: string,\n instance: number,\n context: {\n instances: Record<string, ioBroker.InstanceObject>;\n hostname: string;\n adminInstance: string;\n hosts: Record<string, ioBroker.HostObject>;\n },\n): {\n url: string;\n port: number;\n instance?: string;\n}[] {\n const _urls: {\n url: string;\n port: number;\n instance?: string;\n }[] = [];\n let port: number;\n\n if (link) {\n const instanceObj = context.instances[`system.adapter.${adapter}.${instance}`];\n const native = instanceObj?.native || {};\n\n const placeholders = link.match(/%(\\w+)%/g);\n\n if (placeholders) {\n for (let p = 0; p < placeholders.length; p++) {\n let placeholder = placeholders[p];\n\n if (placeholder === '%ip%') {\n let ip: string = (native.bind || native.ip) as string;\n if (!ip || ip === '0.0.0.0') {\n // Check host\n ip = getHostname(\n instanceObj,\n context.instances,\n context.hosts,\n context.hostname,\n context.adminInstance,\n );\n }\n\n if (_urls.length) {\n _urls.forEach(item => (item.url = item.url.replace('%ip%', ip)));\n } else {\n link = link.replace('%ip%', ip || '');\n }\n } else if (placeholder === '%protocol%') {\n const protocolVal: string | boolean = native.secure === undefined ? native.protocol : native.secure;\n let protocol: 'http' | 'https';\n if (protocolVal === true || protocolVal === 'true') {\n protocol = 'https';\n } else if (protocolVal === false || protocolVal === 'false' || !protocolVal) {\n protocol = 'http';\n } else {\n protocol = protocolVal.toString().replace(/:$/, '') as 'http' | 'https';\n }\n\n if (_urls.length) {\n _urls.forEach(item => (item.url = item.url.replace('%protocol%', protocol)));\n } else {\n link = link.replace('%protocol%', protocol);\n }\n } else if (placeholder === '%s%') {\n const protocolVal: string | boolean = native.secure === undefined ? native.protocol : native.secure;\n let protocol: '' | 's';\n if (protocolVal === true || protocolVal === 'true') {\n protocol = 's';\n } else if (protocolVal === false || protocolVal === 'false' || !protocolVal) {\n protocol = '';\n } else {\n protocol = protocolVal.toString().replace(/:$/, '') as '' | 's';\n }\n\n if (_urls.length) {\n _urls.forEach(item => (item.url = item.url.replace('%s%', protocol)));\n } else {\n link = link.replace('%s%', protocol);\n }\n } else if (placeholder === '%instance%') {\n link = link.replace('%instance%', instance.toString());\n if (_urls.length) {\n _urls.forEach(item => (item.url = item.url.replace('%instance%', instance.toString())));\n } else {\n link = link.replace('%instance%', instance.toString());\n }\n } else {\n // remove %%\n placeholder = placeholder.replace(/%/g, '');\n\n if (placeholder.startsWith('native_')) {\n placeholder = placeholder.substring(7);\n }\n\n // like web.0_port or web_protocol\n if (!placeholder.includes('_')) {\n // if only one instance\n const adapterInstance = `${adapter}.${instance}`;\n if (_urls.length) {\n _urls.forEach(\n item =>\n (item.url = _replaceLink(\n item.url,\n context.instances,\n adapterInstance,\n placeholder,\n placeholder,\n context.hosts,\n context.hostname,\n context.adminInstance,\n )),\n );\n } else {\n link = _replaceLink(\n link,\n context.instances,\n adapterInstance,\n placeholder,\n placeholder,\n context.hosts,\n context.hostname,\n context.adminInstance,\n );\n port = context.instances[`system.adapter.${adapterInstance}`]?.native?.port;\n }\n } else {\n const [adapterInstance, attr] = placeholder.split('_');\n\n // if instance number not found\n if (!adapterInstance.match(/\\.[0-9]+$/)) {\n // list all possible instances\n let ids: string[];\n if (adapter === adapterInstance) {\n // take only this one instance and that's all\n ids = [`${adapter}.${instance}`];\n } else {\n ids = Object.keys(context.instances)\n .filter(\n id =>\n id.startsWith(`system.adapter.${adapterInstance}.`) &&\n context.instances[id].common.enabled,\n )\n .map(id => id.substring(15));\n\n // try to get disabled instances\n if (!ids.length) {\n ids = Object.keys(context.instances)\n .filter(id => id.startsWith(`system.adapter.${adapterInstance}.`))\n .map(id => id.substring(15));\n }\n }\n\n for (const id of ids) {\n if (_urls.length) {\n const item = _urls.find(t => t.instance === id);\n if (item) {\n item.url = _replaceLink(\n item.url,\n context.instances,\n id,\n attr,\n placeholder,\n context.hosts,\n context.hostname,\n context.adminInstance,\n );\n } else {\n // add new\n const _link = _replaceLink(\n link,\n context.instances,\n id,\n attr,\n placeholder,\n context.hosts,\n context.hostname,\n context.adminInstance,\n );\n const _port: number = context.instances[`system.adapter.${id}`]?.native\n ?.port as number;\n\n _urls.push({ url: _link, port: _port, instance: id });\n }\n } else {\n const _link = _replaceLink(\n link,\n context.instances,\n id,\n attr,\n placeholder,\n context.hosts,\n context.hostname,\n context.adminInstance,\n );\n\n const _port: number = context.instances[`system.adapter.${id}`]?.native\n ?.port as number;\n _urls.push({ url: _link, port: _port, instance: id });\n }\n }\n } else {\n link = _replaceLink(\n link,\n context.instances,\n adapterInstance,\n attr,\n placeholder,\n context.hosts,\n context.hostname,\n context.adminInstance,\n );\n\n port = context.instances[`system.adapter.${adapterInstance}`]?.native?.port as number;\n }\n }\n }\n }\n }\n }\n\n if (_urls.length) {\n return _urls;\n }\n return [{ url: link, port }];\n}\n"]}