@iobroker/js-controller-cli 7.2.2 → 7.2.3-alpha.1-20260621-61726ea22

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 (177) hide show
  1. package/build/cjs/lib/_Types.d.ts +7 -0
  2. package/build/cjs/lib/cli/cliCert.d.ts +5 -2
  3. package/build/cjs/lib/cli/cliCert.js +5 -2
  4. package/build/cjs/lib/cli/cliCert.js.map +2 -2
  5. package/build/cjs/lib/cli/cliCommand.d.ts +32 -1
  6. package/build/cjs/lib/cli/cliCommand.js +4 -1
  7. package/build/cjs/lib/cli/cliCommand.js.map +2 -2
  8. package/build/cjs/lib/cli/cliCompact.d.ts +4 -1
  9. package/build/cjs/lib/cli/cliCompact.js +4 -1
  10. package/build/cjs/lib/cli/cliCompact.js.map +2 -2
  11. package/build/cjs/lib/cli/cliDebug.d.ts +4 -1
  12. package/build/cjs/lib/cli/cliDebug.js +4 -1
  13. package/build/cjs/lib/cli/cliDebug.js.map +2 -2
  14. package/build/cjs/lib/cli/cliHost.d.ts +8 -5
  15. package/build/cjs/lib/cli/cliHost.js +8 -5
  16. package/build/cjs/lib/cli/cliHost.js.map +2 -2
  17. package/build/cjs/lib/cli/cliLogs.d.ts +4 -1
  18. package/build/cjs/lib/cli/cliLogs.js +4 -1
  19. package/build/cjs/lib/cli/cliLogs.js.map +2 -2
  20. package/build/cjs/lib/cli/cliMessage.d.ts +1 -0
  21. package/build/cjs/lib/cli/cliMessage.js.map +2 -2
  22. package/build/cjs/lib/cli/cliObjects.d.ts +12 -9
  23. package/build/cjs/lib/cli/cliObjects.js +12 -9
  24. package/build/cjs/lib/cli/cliObjects.js.map +2 -2
  25. package/build/cjs/lib/cli/cliPlugin.js.map +1 -1
  26. package/build/cjs/lib/cli/cliProcess.d.ts +4 -0
  27. package/build/cjs/lib/cli/cliProcess.js +3 -0
  28. package/build/cjs/lib/cli/cliProcess.js.map +2 -2
  29. package/build/cjs/lib/cli/cliStates.d.ts +3 -0
  30. package/build/cjs/lib/cli/cliStates.js +3 -0
  31. package/build/cjs/lib/cli/cliStates.js.map +2 -2
  32. package/build/cjs/lib/setup/customError.d.ts +4 -0
  33. package/build/cjs/lib/setup/customError.js +3 -0
  34. package/build/cjs/lib/setup/customError.js.map +2 -2
  35. package/build/cjs/lib/setup/formatters.d.ts +4 -4
  36. package/build/cjs/lib/setup/formatters.js.map +1 -1
  37. package/build/cjs/lib/setup/pluginInfos.d.ts +5 -0
  38. package/build/cjs/lib/setup/pluginInfos.js.map +2 -2
  39. package/build/cjs/lib/setup/setupBackup.d.ts +34 -0
  40. package/build/cjs/lib/setup/setupBackup.js +22 -0
  41. package/build/cjs/lib/setup/setupBackup.js.map +2 -2
  42. package/build/cjs/lib/setup/setupInstall.d.ts +37 -14
  43. package/build/cjs/lib/setup/setupInstall.js +28 -14
  44. package/build/cjs/lib/setup/setupInstall.js.map +2 -2
  45. package/build/cjs/lib/setup/setupLicense.d.ts +8 -0
  46. package/build/cjs/lib/setup/setupLicense.js +3 -0
  47. package/build/cjs/lib/setup/setupLicense.js.map +2 -2
  48. package/build/cjs/lib/setup/setupList.d.ts +54 -0
  49. package/build/cjs/lib/setup/setupList.js +51 -0
  50. package/build/cjs/lib/setup/setupList.js.map +2 -2
  51. package/build/cjs/lib/setup/setupPacketManager.d.ts +10 -0
  52. package/build/cjs/lib/setup/setupPacketManager.js +6 -0
  53. package/build/cjs/lib/setup/setupPacketManager.js.map +2 -2
  54. package/build/cjs/lib/setup/setupRepo.d.ts +6 -0
  55. package/build/cjs/lib/setup/setupRepo.js +3 -0
  56. package/build/cjs/lib/setup/setupRepo.js.map +2 -2
  57. package/build/cjs/lib/setup/setupSetup.d.ts +27 -0
  58. package/build/cjs/lib/setup/setupSetup.js +18 -0
  59. package/build/cjs/lib/setup/setupSetup.js.map +2 -2
  60. package/build/cjs/lib/setup/setupUpgrade.d.ts +6 -0
  61. package/build/cjs/lib/setup/setupUpgrade.js +3 -0
  62. package/build/cjs/lib/setup/setupUpgrade.js.map +2 -2
  63. package/build/cjs/lib/setup/setupUpload.d.ts +71 -0
  64. package/build/cjs/lib/setup/setupUpload.js +65 -1
  65. package/build/cjs/lib/setup/setupUpload.js.map +2 -2
  66. package/build/cjs/lib/setup/setupUsers.d.ts +23 -14
  67. package/build/cjs/lib/setup/setupUsers.js +17 -14
  68. package/build/cjs/lib/setup/setupUsers.js.map +2 -2
  69. package/build/cjs/lib/setup/setupVendor.d.ts +9 -1
  70. package/build/cjs/lib/setup/setupVendor.js +4 -1
  71. package/build/cjs/lib/setup/setupVendor.js.map +2 -2
  72. package/build/cjs/lib/setup/setupVisDebug.d.ts +9 -0
  73. package/build/cjs/lib/setup/setupVisDebug.js +3 -0
  74. package/build/cjs/lib/setup/setupVisDebug.js.map +2 -2
  75. package/build/esm/lib/_Types.d.ts +7 -0
  76. package/build/esm/lib/_Types.d.ts.map +1 -1
  77. package/build/esm/lib/cli/cliCert.d.ts +5 -2
  78. package/build/esm/lib/cli/cliCert.d.ts.map +1 -1
  79. package/build/esm/lib/cli/cliCert.js +5 -2
  80. package/build/esm/lib/cli/cliCert.js.map +1 -1
  81. package/build/esm/lib/cli/cliCommand.d.ts +32 -1
  82. package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
  83. package/build/esm/lib/cli/cliCommand.js +4 -1
  84. package/build/esm/lib/cli/cliCommand.js.map +1 -1
  85. package/build/esm/lib/cli/cliCompact.d.ts +4 -1
  86. package/build/esm/lib/cli/cliCompact.d.ts.map +1 -1
  87. package/build/esm/lib/cli/cliCompact.js +4 -1
  88. package/build/esm/lib/cli/cliCompact.js.map +1 -1
  89. package/build/esm/lib/cli/cliDebug.d.ts +4 -1
  90. package/build/esm/lib/cli/cliDebug.d.ts.map +1 -1
  91. package/build/esm/lib/cli/cliDebug.js +4 -1
  92. package/build/esm/lib/cli/cliDebug.js.map +1 -1
  93. package/build/esm/lib/cli/cliHost.d.ts +8 -5
  94. package/build/esm/lib/cli/cliHost.d.ts.map +1 -1
  95. package/build/esm/lib/cli/cliHost.js +8 -5
  96. package/build/esm/lib/cli/cliHost.js.map +1 -1
  97. package/build/esm/lib/cli/cliLogs.d.ts +4 -1
  98. package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
  99. package/build/esm/lib/cli/cliLogs.js +4 -1
  100. package/build/esm/lib/cli/cliLogs.js.map +1 -1
  101. package/build/esm/lib/cli/cliMessage.d.ts +1 -0
  102. package/build/esm/lib/cli/cliMessage.d.ts.map +1 -1
  103. package/build/esm/lib/cli/cliMessage.js +1 -0
  104. package/build/esm/lib/cli/cliMessage.js.map +1 -1
  105. package/build/esm/lib/cli/cliObjects.d.ts +12 -9
  106. package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
  107. package/build/esm/lib/cli/cliObjects.js +17 -14
  108. package/build/esm/lib/cli/cliObjects.js.map +1 -1
  109. package/build/esm/lib/cli/cliPlugin.js +1 -1
  110. package/build/esm/lib/cli/cliProcess.d.ts +4 -0
  111. package/build/esm/lib/cli/cliProcess.d.ts.map +1 -1
  112. package/build/esm/lib/cli/cliProcess.js +5 -1
  113. package/build/esm/lib/cli/cliProcess.js.map +1 -1
  114. package/build/esm/lib/cli/cliStates.d.ts +3 -0
  115. package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
  116. package/build/esm/lib/cli/cliStates.js +3 -0
  117. package/build/esm/lib/cli/cliStates.js.map +1 -1
  118. package/build/esm/lib/setup/customError.d.ts +4 -0
  119. package/build/esm/lib/setup/customError.d.ts.map +1 -1
  120. package/build/esm/lib/setup/customError.js +3 -0
  121. package/build/esm/lib/setup/customError.js.map +1 -1
  122. package/build/esm/lib/setup/formatters.d.ts +4 -4
  123. package/build/esm/lib/setup/formatters.js +4 -4
  124. package/build/esm/lib/setup/pluginInfos.d.ts +5 -0
  125. package/build/esm/lib/setup/pluginInfos.d.ts.map +1 -1
  126. package/build/esm/lib/setup/pluginInfos.js +5 -0
  127. package/build/esm/lib/setup/pluginInfos.js.map +1 -1
  128. package/build/esm/lib/setup/setupBackup.d.ts +34 -0
  129. package/build/esm/lib/setup/setupBackup.d.ts.map +1 -1
  130. package/build/esm/lib/setup/setupBackup.js +25 -0
  131. package/build/esm/lib/setup/setupBackup.js.map +1 -1
  132. package/build/esm/lib/setup/setupInstall.d.ts +37 -14
  133. package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
  134. package/build/esm/lib/setup/setupInstall.js +31 -14
  135. package/build/esm/lib/setup/setupInstall.js.map +1 -1
  136. package/build/esm/lib/setup/setupLicense.d.ts +8 -0
  137. package/build/esm/lib/setup/setupLicense.d.ts.map +1 -1
  138. package/build/esm/lib/setup/setupLicense.js +6 -0
  139. package/build/esm/lib/setup/setupLicense.js.map +1 -1
  140. package/build/esm/lib/setup/setupList.d.ts +54 -0
  141. package/build/esm/lib/setup/setupList.d.ts.map +1 -1
  142. package/build/esm/lib/setup/setupList.js +54 -0
  143. package/build/esm/lib/setup/setupList.js.map +1 -1
  144. package/build/esm/lib/setup/setupPacketManager.d.ts +10 -0
  145. package/build/esm/lib/setup/setupPacketManager.d.ts.map +1 -1
  146. package/build/esm/lib/setup/setupPacketManager.js +9 -0
  147. package/build/esm/lib/setup/setupPacketManager.js.map +1 -1
  148. package/build/esm/lib/setup/setupRepo.d.ts +6 -0
  149. package/build/esm/lib/setup/setupRepo.d.ts.map +1 -1
  150. package/build/esm/lib/setup/setupRepo.js +6 -0
  151. package/build/esm/lib/setup/setupRepo.js.map +1 -1
  152. package/build/esm/lib/setup/setupSetup.d.ts +27 -0
  153. package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
  154. package/build/esm/lib/setup/setupSetup.js +21 -0
  155. package/build/esm/lib/setup/setupSetup.js.map +1 -1
  156. package/build/esm/lib/setup/setupUpgrade.d.ts +6 -0
  157. package/build/esm/lib/setup/setupUpgrade.d.ts.map +1 -1
  158. package/build/esm/lib/setup/setupUpgrade.js +6 -0
  159. package/build/esm/lib/setup/setupUpgrade.js.map +1 -1
  160. package/build/esm/lib/setup/setupUpload.d.ts +71 -0
  161. package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
  162. package/build/esm/lib/setup/setupUpload.js +68 -1
  163. package/build/esm/lib/setup/setupUpload.js.map +1 -1
  164. package/build/esm/lib/setup/setupUsers.d.ts +23 -14
  165. package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
  166. package/build/esm/lib/setup/setupUsers.js +20 -14
  167. package/build/esm/lib/setup/setupUsers.js.map +1 -1
  168. package/build/esm/lib/setup/setupVendor.d.ts +9 -1
  169. package/build/esm/lib/setup/setupVendor.d.ts.map +1 -1
  170. package/build/esm/lib/setup/setupVendor.js +7 -1
  171. package/build/esm/lib/setup/setupVendor.js.map +1 -1
  172. package/build/esm/lib/setup/setupVisDebug.d.ts +9 -0
  173. package/build/esm/lib/setup/setupVisDebug.d.ts.map +1 -1
  174. package/build/esm/lib/setup/setupVisDebug.js +6 -0
  175. package/build/esm/lib/setup/setupVisDebug.js.map +1 -1
  176. package/build/tsconfig.build.tsbuildinfo +1 -1
  177. package/package.json +4 -4
@@ -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 } 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\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);\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 /**\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: 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 /**\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 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 /**\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"],
5
+ "mappings": "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",
6
6
  "names": ["fs", "axios", "mime", "hostname", "deepClone"]
7
7
  }
@@ -1,19 +1,28 @@
1
1
  import type { ProcessExitCallback } from '../_Types.js';
2
2
  import type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';
3
+ /** Options for the users command */
3
4
  export interface CLIUsersOptions {
5
+ /** Callback to exit the process with an exit code */
4
6
  processExit: ProcessExitCallback;
7
+ /** The objects database client */
5
8
  objects: ObjectsRedisClient;
6
9
  }
10
+ /**
11
+ * CLI command to manage ioBroker users and groups
12
+ */
7
13
  export declare class Users {
8
14
  private readonly objects;
9
15
  private readonly processExit;
16
+ /**
17
+ * @param options The objects database client and the process-exit callback
18
+ */
10
19
  constructor(options: CLIUsersOptions);
11
20
  /**
12
21
  * Adds new user to system
13
22
  *
14
23
  * @param username name of the user which will be added
15
24
  * @param pw password
16
- * @param callback
25
+ * @param callback Called once the user has been added
17
26
  */
18
27
  addUser(username: string, pw: string, callback: ioBroker.ErrorCallback): void;
19
28
  /**
@@ -27,7 +36,7 @@ export declare class Users {
27
36
  *
28
37
  * @param username name of the user to set password for
29
38
  * @param pw password
30
- * @param callback
39
+ * @param callback Called once the password has been set
31
40
  */
32
41
  setPassword(username: string, pw: string, callback: ioBroker.ErrorCallback): void;
33
42
  /**
@@ -35,14 +44,14 @@ export declare class Users {
35
44
  *
36
45
  * @param username name of the user to check password
37
46
  * @param pw password
38
- * @param callback
47
+ * @param callback Called with whether the password is correct
39
48
  */
40
49
  checkPassword(username: string, pw: string, callback: (err?: Error | null, isOk?: boolean) => void): void;
41
50
  /**
42
51
  * Deletes user from system
43
52
  *
44
53
  * @param username name of the user to delete
45
- * @param callback
54
+ * @param callback Called once the user has been deleted
46
55
  */
47
56
  delUser(username: string, callback: ioBroker.ErrorCallback): void;
48
57
  /**
@@ -50,7 +59,7 @@ export declare class Users {
50
59
  *
51
60
  * @param username user which will be added to the group
52
61
  * @param groupName name of the group where the user will be added to
53
- * @param callback
62
+ * @param callback Called once the user has been added to the group
54
63
  */
55
64
  addUserToGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void;
56
65
  /**
@@ -59,7 +68,7 @@ export declare class Users {
59
68
  * @param username user which sohuld be created
60
69
  * @param groupName default group for the new user
61
70
  * @param password user password
62
- * @param callback
71
+ * @param callback Called once the user has been created
63
72
  */
64
73
  addUserPrompt(username: string, groupName: string, password: string, callback: ioBroker.ErrorCallback): void;
65
74
  /**
@@ -67,7 +76,7 @@ export declare class Users {
67
76
  *
68
77
  * @param username name of the user to set password for
69
78
  * @param password password of user
70
- * @param callback
79
+ * @param callback Called once the password has been set
71
80
  */
72
81
  setUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): Promise<void>;
73
82
  /**
@@ -75,7 +84,7 @@ export declare class Users {
75
84
  *
76
85
  * @param username name of the user which will be activated
77
86
  * @param enable true if it should be enabled else false
78
- * @param callback
87
+ * @param callback Called once the user has been enabled or disabled
79
88
  */
80
89
  enableUser(username: string, enable: boolean, callback: ioBroker.ErrorCallback): void;
81
90
  /**
@@ -83,21 +92,21 @@ export declare class Users {
83
92
  *
84
93
  * @param username name of the user to check password for
85
94
  * @param password password to check
86
- * @param callback
95
+ * @param callback Called with whether the password is valid
87
96
  */
88
97
  checkUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): void;
89
98
  /**
90
99
  * Get user object
91
100
  *
92
101
  * @param username name of the user to get object of
93
- * @param callback
102
+ * @param callback Called with the user object
94
103
  */
95
104
  getUser(username: string, callback: (err?: Error | null, enabled?: boolean) => void): void;
96
105
  /**
97
106
  * Get group object
98
107
  *
99
108
  * @param group groupname
100
- * @param callback
109
+ * @param callback Called with the group object
101
110
  */
102
111
  getGroup(group: string, callback: (err?: Error | null, enabled?: boolean, members?: string[]) => void): void;
103
112
  /**
@@ -105,7 +114,7 @@ export declare class Users {
105
114
  *
106
115
  * @param group groupname
107
116
  * @param enable if enable or disable
108
- * @param callback
117
+ * @param callback Called once the group has been enabled or disabled
109
118
  */
110
119
  enableGroup(group: string, enable: boolean, callback: ioBroker.ErrorCallback): void;
111
120
  /**
@@ -118,7 +127,7 @@ export declare class Users {
118
127
  * Remove group
119
128
  *
120
129
  * @param group groupname
121
- * @param callback
130
+ * @param callback Called once the group has been removed
122
131
  */
123
132
  delGroup(group: string, callback: ioBroker.ErrorCallback): void;
124
133
  /**
@@ -126,7 +135,7 @@ export declare class Users {
126
135
  *
127
136
  * @param username name of the user which will be removed from group
128
137
  * @param groupName name of the group user will be removed from
129
- * @param callback
138
+ * @param callback Called once the user has been removed from the group
130
139
  */
131
140
  removeUserFromGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void;
132
141
  }
@@ -36,6 +36,9 @@ var import_prompt = __toESM(require("prompt"), 1);
36
36
  class Users {
37
37
  objects;
38
38
  processExit;
39
+ /**
40
+ * @param options The objects database client and the process-exit callback
41
+ */
39
42
  constructor(options) {
40
43
  if (!options.objects) {
41
44
  throw new Error("Invalid arguments: objects is missing");
@@ -51,7 +54,7 @@ class Users {
51
54
  *
52
55
  * @param username name of the user which will be added
53
56
  * @param pw password
54
- * @param callback
57
+ * @param callback Called once the user has been added
55
58
  */
56
59
  addUser(username, pw, callback) {
57
60
  const _user = username.replace(/\s/g, "_").toLowerCase();
@@ -97,7 +100,7 @@ class Users {
97
100
  *
98
101
  * @param username name of the user to set password for
99
102
  * @param pw password
100
- * @param callback
103
+ * @param callback Called once the password has been set
101
104
  */
102
105
  setPassword(username, pw, callback) {
103
106
  const _user = username.replace(/\s/g, "_").toLowerCase();
@@ -123,7 +126,7 @@ class Users {
123
126
  *
124
127
  * @param username name of the user to check password
125
128
  * @param pw password
126
- * @param callback
129
+ * @param callback Called with whether the password is correct
127
130
  */
128
131
  checkPassword(username, pw, callback) {
129
132
  const _user = username.replace(/\s/g, "_").toLowerCase();
@@ -140,7 +143,7 @@ class Users {
140
143
  * Deletes user from system
141
144
  *
142
145
  * @param username name of the user to delete
143
- * @param callback
146
+ * @param callback Called once the user has been deleted
144
147
  */
145
148
  delUser(username, callback) {
146
149
  if (!username) {
@@ -193,7 +196,7 @@ class Users {
193
196
  *
194
197
  * @param username user which will be added to the group
195
198
  * @param groupName name of the group where the user will be added to
196
- * @param callback
199
+ * @param callback Called once the user has been added to the group
197
200
  */
198
201
  addUserToGroup(username, groupName, callback) {
199
202
  let _user = username.replace(/\s/g, "_").toLowerCase();
@@ -232,7 +235,7 @@ class Users {
232
235
  * @param username user which sohuld be created
233
236
  * @param groupName default group for the new user
234
237
  * @param password user password
235
- * @param callback
238
+ * @param callback Called once the user has been created
236
239
  */
237
240
  addUserPrompt(username, groupName, password2, callback) {
238
241
  if (!username) {
@@ -306,7 +309,7 @@ class Users {
306
309
  *
307
310
  * @param username name of the user to set password for
308
311
  * @param password password of user
309
- * @param callback
312
+ * @param callback Called once the password has been set
310
313
  */
311
314
  async setUserPassword(username, password2, callback) {
312
315
  if (!username) {
@@ -365,7 +368,7 @@ class Users {
365
368
  *
366
369
  * @param username name of the user which will be activated
367
370
  * @param enable true if it should be enabled else false
368
- * @param callback
371
+ * @param callback Called once the user has been enabled or disabled
369
372
  */
370
373
  enableUser(username, enable, callback) {
371
374
  if (!username) {
@@ -397,7 +400,7 @@ class Users {
397
400
  *
398
401
  * @param username name of the user to check password for
399
402
  * @param password password to check
400
- * @param callback
403
+ * @param callback Called with whether the password is valid
401
404
  */
402
405
  checkUserPassword(username, password2, callback) {
403
406
  if (!username && !password2) {
@@ -463,7 +466,7 @@ class Users {
463
466
  * Get user object
464
467
  *
465
468
  * @param username name of the user to get object of
466
- * @param callback
469
+ * @param callback Called with the user object
467
470
  */
468
471
  getUser(username, callback) {
469
472
  this.objects.getObject(`system.user.${username}`, (err, obj) => {
@@ -480,7 +483,7 @@ class Users {
480
483
  * Get group object
481
484
  *
482
485
  * @param group groupname
483
- * @param callback
486
+ * @param callback Called with the group object
484
487
  */
485
488
  getGroup(group, callback) {
486
489
  this.objects.getObject(`system.group.${group}`, (err, obj) => {
@@ -498,7 +501,7 @@ class Users {
498
501
  *
499
502
  * @param group groupname
500
503
  * @param enable if enable or disable
501
- * @param callback
504
+ * @param callback Called once the group has been enabled or disabled
502
505
  */
503
506
  enableGroup(group, enable, callback) {
504
507
  if (!group) {
@@ -553,7 +556,7 @@ class Users {
553
556
  * Remove group
554
557
  *
555
558
  * @param group groupname
556
- * @param callback
559
+ * @param callback Called once the group has been removed
557
560
  */
558
561
  delGroup(group, callback) {
559
562
  const _group = group.replace(/\s/g, "_");
@@ -574,7 +577,7 @@ class Users {
574
577
  *
575
578
  * @param username name of the user which will be removed from group
576
579
  * @param groupName name of the group user will be removed from
577
- * @param callback
580
+ * @param callback Called once the user has been removed from the group
578
581
  */
579
582
  removeUserFromGroup(username, groupName, callback) {
580
583
  const _group = groupName.replace(/\s/g, "_");