@iobroker/js-controller-cli 7.2.3 → 8.0.0-alpha.2-20260923-99da17fcc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/build/cjs/index.js +3 -3
  2. package/build/cjs/lib/_Types.d.ts +8 -1
  3. package/build/cjs/lib/cli/cliCert.d.ts +7 -4
  4. package/build/cjs/lib/cli/cliCert.js +10 -6
  5. package/build/cjs/lib/cli/cliCert.js.map +2 -2
  6. package/build/cjs/lib/cli/cliCommand.d.ts +63 -15
  7. package/build/cjs/lib/cli/cliCommand.js +8 -1
  8. package/build/cjs/lib/cli/cliCommand.js.map +2 -2
  9. package/build/cjs/lib/cli/cliCompact.d.ts +5 -2
  10. package/build/cjs/lib/cli/cliCompact.js +9 -2
  11. package/build/cjs/lib/cli/cliCompact.js.map +2 -2
  12. package/build/cjs/lib/cli/cliDebug.d.ts +5 -2
  13. package/build/cjs/lib/cli/cliDebug.js +8 -1
  14. package/build/cjs/lib/cli/cliDebug.js.map +2 -2
  15. package/build/cjs/lib/cli/cliHost.d.ts +13 -10
  16. package/build/cjs/lib/cli/cliHost.js +13 -5
  17. package/build/cjs/lib/cli/cliHost.js.map +2 -2
  18. package/build/cjs/lib/cli/cliLogs.d.ts +9 -3
  19. package/build/cjs/lib/cli/cliLogs.js +12 -1
  20. package/build/cjs/lib/cli/cliLogs.js.map +2 -2
  21. package/build/cjs/lib/cli/cliMessage.d.ts +2 -1
  22. package/build/cjs/lib/cli/cliMessage.js +5 -0
  23. package/build/cjs/lib/cli/cliMessage.js.map +2 -2
  24. package/build/cjs/lib/cli/cliObjects.d.ts +21 -18
  25. package/build/cjs/lib/cli/cliObjects.js +51 -33
  26. package/build/cjs/lib/cli/cliObjects.js.map +2 -2
  27. package/build/cjs/lib/cli/cliPlugin.d.ts +3 -3
  28. package/build/cjs/lib/cli/cliPlugin.js +6 -0
  29. package/build/cjs/lib/cli/cliPlugin.js.map +2 -2
  30. package/build/cjs/lib/cli/cliProcess.d.ts +17 -7
  31. package/build/cjs/lib/cli/cliProcess.js +77 -24
  32. package/build/cjs/lib/cli/cliProcess.js.map +3 -3
  33. package/build/cjs/lib/cli/cliStates.d.ts +7 -4
  34. package/build/cjs/lib/cli/cliStates.js +14 -6
  35. package/build/cjs/lib/cli/cliStates.js.map +2 -2
  36. package/build/cjs/lib/cli/cliTools.js +11 -0
  37. package/build/cjs/lib/cli/cliTools.js.map +1 -1
  38. package/build/cjs/lib/cli/messages.js +47 -46
  39. package/build/cjs/lib/cli/messages.js.map +1 -1
  40. package/build/cjs/lib/progressBar.d.ts +59 -0
  41. package/build/cjs/lib/progressBar.js +115 -0
  42. package/build/cjs/lib/progressBar.js.map +7 -0
  43. package/build/cjs/lib/setup/customError.d.ts +4 -0
  44. package/build/cjs/lib/setup/customError.js +7 -0
  45. package/build/cjs/lib/setup/customError.js.map +2 -2
  46. package/build/cjs/lib/setup/dbConnection.js +69 -64
  47. package/build/cjs/lib/setup/dbConnection.js.map +3 -3
  48. package/build/cjs/lib/setup/formatters.d.ts +4 -4
  49. package/build/cjs/lib/setup/formatters.js +5 -0
  50. package/build/cjs/lib/setup/formatters.js.map +2 -2
  51. package/build/cjs/lib/setup/multihostClient.js +6 -2
  52. package/build/cjs/lib/setup/multihostClient.js.map +1 -1
  53. package/build/cjs/lib/setup/pluginInfos.d.ts +5 -0
  54. package/build/cjs/lib/setup/pluginInfos.js +2 -0
  55. package/build/cjs/lib/setup/pluginInfos.js.map +2 -2
  56. package/build/cjs/lib/setup/setupBackup.d.ts +53 -0
  57. package/build/cjs/lib/setup/setupBackup.js +125 -14
  58. package/build/cjs/lib/setup/setupBackup.js.map +3 -3
  59. package/build/cjs/lib/setup/setupInstall.d.ts +66 -15
  60. package/build/cjs/lib/setup/setupInstall.js +282 -28
  61. package/build/cjs/lib/setup/setupInstall.js.map +2 -2
  62. package/build/cjs/lib/setup/setupLicense.d.ts +13 -0
  63. package/build/cjs/lib/setup/setupLicense.js +33 -2
  64. package/build/cjs/lib/setup/setupLicense.js.map +2 -2
  65. package/build/cjs/lib/setup/setupList.d.ts +55 -1
  66. package/build/cjs/lib/setup/setupList.js +78 -24
  67. package/build/cjs/lib/setup/setupList.js.map +3 -3
  68. package/build/cjs/lib/setup/setupMultihost.d.ts +7 -0
  69. package/build/cjs/lib/setup/setupMultihost.js +78 -11
  70. package/build/cjs/lib/setup/setupMultihost.js.map +3 -3
  71. package/build/cjs/lib/setup/setupPacketManager.d.ts +10 -0
  72. package/build/cjs/lib/setup/setupPacketManager.js +16 -6
  73. package/build/cjs/lib/setup/setupPacketManager.js.map +2 -2
  74. package/build/cjs/lib/setup/setupRepo.d.ts +19 -0
  75. package/build/cjs/lib/setup/setupRepo.js +141 -13
  76. package/build/cjs/lib/setup/setupRepo.js.map +2 -2
  77. package/build/cjs/lib/setup/setupSetup.d.ts +34 -0
  78. package/build/cjs/lib/setup/setupSetup.js +209 -35
  79. package/build/cjs/lib/setup/setupSetup.js.map +3 -3
  80. package/build/cjs/lib/setup/setupUpgrade.d.ts +13 -2
  81. package/build/cjs/lib/setup/setupUpgrade.js +72 -12
  82. package/build/cjs/lib/setup/setupUpgrade.js.map +2 -2
  83. package/build/cjs/lib/setup/setupUpload.d.ts +77 -1
  84. package/build/cjs/lib/setup/setupUpload.js +152 -9
  85. package/build/cjs/lib/setup/setupUpload.js.map +2 -2
  86. package/build/cjs/lib/setup/setupUsers.d.ts +44 -14
  87. package/build/cjs/lib/setup/setupUsers.js +330 -17
  88. package/build/cjs/lib/setup/setupUsers.js.map +2 -2
  89. package/build/cjs/lib/setup/setupVendor.d.ts +14 -1
  90. package/build/cjs/lib/setup/setupVendor.js +40 -8
  91. package/build/cjs/lib/setup/setupVendor.js.map +2 -2
  92. package/build/cjs/lib/setup/setupVisDebug.d.ts +16 -2
  93. package/build/cjs/lib/setup/setupVisDebug.js +41 -17
  94. package/build/cjs/lib/setup/setupVisDebug.js.map +3 -3
  95. package/build/cjs/lib/setup/utils.d.ts +1 -1
  96. package/build/cjs/lib/setup/utils.js +13 -9
  97. package/build/cjs/lib/setup/utils.js.map +3 -3
  98. package/build/cjs/lib/setup.d.ts +1 -1
  99. package/build/cjs/lib/setup.js +858 -1758
  100. package/build/cjs/lib/setup.js.map +3 -3
  101. package/build/esm/lib/_Types.d.ts +8 -1
  102. package/build/esm/lib/_Types.d.ts.map +1 -1
  103. package/build/esm/lib/cli/cliCert.d.ts +7 -4
  104. package/build/esm/lib/cli/cliCert.d.ts.map +1 -1
  105. package/build/esm/lib/cli/cliCert.js +6 -6
  106. package/build/esm/lib/cli/cliCert.js.map +1 -1
  107. package/build/esm/lib/cli/cliCommand.d.ts +63 -15
  108. package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
  109. package/build/esm/lib/cli/cliCommand.js +4 -1
  110. package/build/esm/lib/cli/cliCommand.js.map +1 -1
  111. package/build/esm/lib/cli/cliCompact.d.ts +5 -2
  112. package/build/esm/lib/cli/cliCompact.d.ts.map +1 -1
  113. package/build/esm/lib/cli/cliCompact.js +5 -2
  114. package/build/esm/lib/cli/cliCompact.js.map +1 -1
  115. package/build/esm/lib/cli/cliDebug.d.ts +5 -2
  116. package/build/esm/lib/cli/cliDebug.d.ts.map +1 -1
  117. package/build/esm/lib/cli/cliDebug.js +4 -1
  118. package/build/esm/lib/cli/cliDebug.js.map +1 -1
  119. package/build/esm/lib/cli/cliHost.d.ts +13 -10
  120. package/build/esm/lib/cli/cliHost.d.ts.map +1 -1
  121. package/build/esm/lib/cli/cliHost.js +8 -5
  122. package/build/esm/lib/cli/cliHost.js.map +1 -1
  123. package/build/esm/lib/cli/cliLogs.d.ts +9 -3
  124. package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
  125. package/build/esm/lib/cli/cliLogs.js +8 -1
  126. package/build/esm/lib/cli/cliLogs.js.map +1 -1
  127. package/build/esm/lib/cli/cliMessage.d.ts +2 -1
  128. package/build/esm/lib/cli/cliMessage.d.ts.map +1 -1
  129. package/build/esm/lib/cli/cliMessage.js +1 -0
  130. package/build/esm/lib/cli/cliMessage.js.map +1 -1
  131. package/build/esm/lib/cli/cliObjects.d.ts +21 -18
  132. package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
  133. package/build/esm/lib/cli/cliObjects.js +44 -38
  134. package/build/esm/lib/cli/cliObjects.js.map +1 -1
  135. package/build/esm/lib/cli/cliPlugin.d.ts +3 -3
  136. package/build/esm/lib/cli/cliPlugin.d.ts.map +1 -1
  137. package/build/esm/lib/cli/cliPlugin.js +1 -1
  138. package/build/esm/lib/cli/cliPlugin.js.map +1 -1
  139. package/build/esm/lib/cli/cliProcess.d.ts +17 -7
  140. package/build/esm/lib/cli/cliProcess.d.ts.map +1 -1
  141. package/build/esm/lib/cli/cliProcess.js +73 -12
  142. package/build/esm/lib/cli/cliProcess.js.map +1 -1
  143. package/build/esm/lib/cli/cliStates.d.ts +7 -4
  144. package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
  145. package/build/esm/lib/cli/cliStates.js +6 -2
  146. package/build/esm/lib/cli/cliStates.js.map +1 -1
  147. package/build/esm/lib/progressBar.d.ts +59 -0
  148. package/build/esm/lib/progressBar.d.ts.map +1 -0
  149. package/build/esm/lib/progressBar.js +104 -0
  150. package/build/esm/lib/progressBar.js.map +1 -0
  151. package/build/esm/lib/setup/customError.d.ts +4 -0
  152. package/build/esm/lib/setup/customError.d.ts.map +1 -1
  153. package/build/esm/lib/setup/customError.js +3 -0
  154. package/build/esm/lib/setup/customError.js.map +1 -1
  155. package/build/esm/lib/setup/dbConnection.d.ts.map +1 -1
  156. package/build/esm/lib/setup/dbConnection.js +10 -13
  157. package/build/esm/lib/setup/dbConnection.js.map +1 -1
  158. package/build/esm/lib/setup/formatters.d.ts +4 -4
  159. package/build/esm/lib/setup/formatters.js +4 -4
  160. package/build/esm/lib/setup/pluginInfos.d.ts +5 -0
  161. package/build/esm/lib/setup/pluginInfos.d.ts.map +1 -1
  162. package/build/esm/lib/setup/pluginInfos.js +5 -0
  163. package/build/esm/lib/setup/pluginInfos.js.map +1 -1
  164. package/build/esm/lib/setup/setupBackup.d.ts +53 -0
  165. package/build/esm/lib/setup/setupBackup.d.ts.map +1 -1
  166. package/build/esm/lib/setup/setupBackup.js +132 -13
  167. package/build/esm/lib/setup/setupBackup.js.map +1 -1
  168. package/build/esm/lib/setup/setupInstall.d.ts +66 -15
  169. package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
  170. package/build/esm/lib/setup/setupInstall.js +309 -23
  171. package/build/esm/lib/setup/setupInstall.js.map +1 -1
  172. package/build/esm/lib/setup/setupLicense.d.ts +13 -0
  173. package/build/esm/lib/setup/setupLicense.d.ts.map +1 -1
  174. package/build/esm/lib/setup/setupLicense.js +31 -1
  175. package/build/esm/lib/setup/setupLicense.js.map +1 -1
  176. package/build/esm/lib/setup/setupList.d.ts +55 -1
  177. package/build/esm/lib/setup/setupList.d.ts.map +1 -1
  178. package/build/esm/lib/setup/setupList.js +61 -8
  179. package/build/esm/lib/setup/setupList.js.map +1 -1
  180. package/build/esm/lib/setup/setupMultihost.d.ts +7 -0
  181. package/build/esm/lib/setup/setupMultihost.d.ts.map +1 -1
  182. package/build/esm/lib/setup/setupMultihost.js +85 -6
  183. package/build/esm/lib/setup/setupMultihost.js.map +1 -1
  184. package/build/esm/lib/setup/setupPacketManager.d.ts +10 -0
  185. package/build/esm/lib/setup/setupPacketManager.d.ts.map +1 -1
  186. package/build/esm/lib/setup/setupPacketManager.js +9 -0
  187. package/build/esm/lib/setup/setupPacketManager.js.map +1 -1
  188. package/build/esm/lib/setup/setupRepo.d.ts +19 -0
  189. package/build/esm/lib/setup/setupRepo.d.ts.map +1 -1
  190. package/build/esm/lib/setup/setupRepo.js +164 -14
  191. package/build/esm/lib/setup/setupRepo.js.map +1 -1
  192. package/build/esm/lib/setup/setupSetup.d.ts +34 -0
  193. package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
  194. package/build/esm/lib/setup/setupSetup.js +218 -21
  195. package/build/esm/lib/setup/setupSetup.js.map +1 -1
  196. package/build/esm/lib/setup/setupUpgrade.d.ts +13 -2
  197. package/build/esm/lib/setup/setupUpgrade.d.ts.map +1 -1
  198. package/build/esm/lib/setup/setupUpgrade.js +70 -6
  199. package/build/esm/lib/setup/setupUpgrade.js.map +1 -1
  200. package/build/esm/lib/setup/setupUpload.d.ts +77 -1
  201. package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
  202. package/build/esm/lib/setup/setupUpload.js +164 -7
  203. package/build/esm/lib/setup/setupUpload.js.map +1 -1
  204. package/build/esm/lib/setup/setupUsers.d.ts +44 -14
  205. package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
  206. package/build/esm/lib/setup/setupUsers.js +346 -14
  207. package/build/esm/lib/setup/setupUsers.js.map +1 -1
  208. package/build/esm/lib/setup/setupVendor.d.ts +14 -1
  209. package/build/esm/lib/setup/setupVendor.d.ts.map +1 -1
  210. package/build/esm/lib/setup/setupVendor.js +33 -2
  211. package/build/esm/lib/setup/setupVendor.js.map +1 -1
  212. package/build/esm/lib/setup/setupVisDebug.d.ts +16 -2
  213. package/build/esm/lib/setup/setupVisDebug.d.ts.map +1 -1
  214. package/build/esm/lib/setup/setupVisDebug.js +39 -14
  215. package/build/esm/lib/setup/setupVisDebug.js.map +1 -1
  216. package/build/esm/lib/setup/utils.d.ts +1 -1
  217. package/build/esm/lib/setup/utils.d.ts.map +1 -1
  218. package/build/esm/lib/setup/utils.js +2 -4
  219. package/build/esm/lib/setup/utils.js.map +1 -1
  220. package/build/esm/lib/setup.d.ts +1 -1
  221. package/build/esm/lib/setup.d.ts.map +1 -1
  222. package/build/esm/lib/setup.js +959 -1910
  223. package/build/esm/lib/setup.js.map +1 -1
  224. package/build/tsconfig.build.tsbuildinfo +1 -1
  225. package/package.json +14 -14
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/setup/setupRepo.ts"],
4
- "sourcesContent": ["import { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport axios from 'axios';\nimport fs from 'fs-extra';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport { BETA_REPO_URL, isIntegerLikeInput, isVersionIgnored, STABLE_REPO_URL } from '@/lib/setup/utils.js';\nimport path from 'node:path';\nimport { SYSTEM_CONFIG_ID, SYSTEM_REPOSITORIES_ID } from '@iobroker/js-controller-common-db/constants';\n\n/** The options passed to the Repo constructor */\nexport interface CLIRepoOptions {\n /** Instance of objects DB */\n objects: ObjectsRedisClient;\n /** Instance of states DB */\n states: StatesRedisClient;\n}\n\n/**\n * All possible Repo Flags which can be passed to the `show` method\n */\nexport interface RepoFlags {\n /** Also list not installed adapters */\n a?: boolean;\n /** Also list not installed adapters */\n all?: boolean;\n /** Only list updatable adapters */\n u?: boolean;\n /** Only list updatable adapters */\n updatable?: boolean;\n /** Force update even if hash hasn't changed */\n f?: boolean;\n /** Force update even if hash hasn't changed */\n force?: boolean;\n}\n\ntype RepoActiveInfo =\n | {\n /** If the repo is active */\n isActive: true;\n /** Name of the repository */\n name: string;\n }\n | {\n /** If the repo is active */\n isActive: false;\n };\n\ninterface RepoActiveOptions {\n /** Url to check if active */\n url: string;\n /** System config object */\n sysConfObj: ioBroker.SystemConfigObject;\n /** Repository object */\n repoObj: ioBroker.RepositoryObject;\n}\n\nexport class Repo {\n private readonly defaultSystemRepo: ioBroker.RepositoryObject;\n private readonly objects: ObjectsRedisClient;\n private readonly states: StatesRedisClient;\n private readonly controllerVersion: string;\n\n constructor(options: CLIRepoOptions) {\n if (!options?.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options?.states) {\n throw new Error('Invalid arguments: states is missing');\n }\n\n const ioPackage = fs.readJSONSync(path.join(tools.getControllerDir(), 'io-package.json'));\n this.controllerVersion = ioPackage.common.version;\n\n this.objects = options.objects;\n this.states = options.states;\n\n this.defaultSystemRepo = {\n common: {\n name: 'System repositories',\n dontDelete: true,\n },\n native: {\n repositories: {\n stable: {\n link: STABLE_REPO_URL,\n json: null,\n },\n beta: {\n link: BETA_REPO_URL,\n json: null,\n },\n },\n },\n _id: SYSTEM_REPOSITORIES_ID,\n type: 'config',\n };\n }\n\n /**\n * Get the repository name by index\n * Throws if the index does not exist\n *\n * @param repoIndex repo name or index\n */\n async getNameByIndex(repoIndex: number): Promise<string> {\n const obj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (!obj?.native?.repositories) {\n throw new Error('No repositories setup!');\n }\n\n const repoNames = Object.keys(obj.native.repositories);\n if (!repoNames[repoIndex]) {\n throw new Error(`No repository for index \"${repoIndex}\" found`);\n }\n\n return repoNames[repoIndex];\n }\n\n /**\n * Update the given repository and returns new repo content\n *\n * @param repoName name of the repository\n * @param force force update even if same hash\n * @param systemConfig content of `system.config` object\n * @param systemRepos content of `system.repositories` object\n */\n private async updateRepo(\n repoName: string,\n force: boolean | undefined,\n systemConfig?: ioBroker.OtherObject,\n systemRepos?: ioBroker.RepositoryObject,\n ): Promise<null | ioBroker.RepositoryJson> {\n if (!repoName) {\n const sysConfig = systemConfig || (await this.objects.getObject(SYSTEM_CONFIG_ID));\n repoName = sysConfig!.common.activeRepo;\n }\n\n const oldRepos = systemRepos || (await this.objects.getObject(SYSTEM_REPOSITORIES_ID));\n if (!oldRepos?.native.repositories?.[repoName]) {\n console.log(`Error: repository \"${repoName}\" not found in the \"${SYSTEM_REPOSITORIES_ID}\"`);\n return null;\n }\n\n const urlOrPath = oldRepos.native.repositories[repoName].link;\n const hashUrl = urlOrPath.replace(/\\.json$/, '-hash.json');\n let hash;\n\n if (\n !force &&\n oldRepos.native.repositories[repoName].hash &&\n oldRepos.native.repositories[repoName].json &&\n (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://'))\n ) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10_000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n if (hash?.data && oldRepos.native.repositories[repoName].hash === hash.data.hash) {\n return oldRepos.native.repositories[repoName].json;\n }\n }\n\n let data;\n\n if (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://')) {\n if (!hash) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n }\n\n const agent = `${tools.appName}, RND: CLI, Node:${process.version}, V:${this.controllerVersion}`;\n try {\n data = await axios({\n url: urlOrPath,\n timeout: 10_000,\n headers: { 'User-Agent': agent },\n });\n if (data.data) {\n data = data.data;\n } else {\n data = null;\n }\n } catch (e) {\n console.error(`Cannot download repository file from \"${urlOrPath}\": ${e.message}`);\n data = null;\n }\n } else {\n if (fs.existsSync(urlOrPath)) {\n try {\n data = JSON.parse(fs.readFileSync(urlOrPath).toString('utf8'));\n } catch (err) {\n console.error(`Error: Cannot read or parse file \"${urlOrPath}\": ${err.message}`);\n }\n } else {\n console.error(`Error: Cannot find file \"${urlOrPath}\"`);\n }\n }\n\n let changed;\n if (data) {\n oldRepos.native.repositories[repoName].json = data;\n changed = true;\n }\n if (hash?.data) {\n oldRepos.native.repositories[repoName].hash = hash.data.hash;\n changed = true;\n }\n if (changed) {\n oldRepos.from = `system.host.${tools.getHostName()}.cli`;\n oldRepos.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, oldRepos);\n }\n\n return oldRepos.native.repositories[repoName].json;\n }\n\n /**\n * Show repo on CLI\n *\n * @param repoUrl url of the repository\n * @param flags CLI flags\n */\n async showRepo(repoUrl: string | string[], flags: RepoFlags): Promise<void> {\n // Get the repositories\n const systemConfig = await this.objects.getObject(SYSTEM_CONFIG_ID);\n const systemRepos = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (!systemConfig) {\n console.error(`Error: Object \"${SYSTEM_CONFIG_ID}\" not found`);\n } else if (!systemRepos) {\n console.error(`Error: Object \"${SYSTEM_REPOSITORIES_ID}\" not found`);\n } else if (!systemRepos.native || !systemRepos.native.repositories) {\n console.error(`Error: no repositories found in the \"${SYSTEM_REPOSITORIES_ID}\"`);\n } else {\n repoUrl = repoUrl || systemConfig.common.activeRepo;\n\n if (!Array.isArray(repoUrl)) {\n repoUrl = [repoUrl];\n }\n\n console.log(`Used ${repoUrl.length > 1 ? 'repositories' : 'repository'}: ${repoUrl.join(', ')}`);\n\n const allSources = {};\n\n for (const url of repoUrl) {\n const repo = systemRepos.native.repositories[url];\n // If known repository\n if (repo) {\n if (typeof repo === 'string') {\n systemRepos.native.repositories[url] = {\n link: repo,\n json: null,\n hash: '',\n };\n }\n\n const sources = await this.updateRepo(url, flags.force || flags.f, systemConfig, systemRepos);\n sources && Object.assign(allSources, sources);\n } else {\n console.error(\n `Error: unknown repository is active - \"${url}\". Known: ${Object.keys(\n systemRepos.native.repositories,\n ).join(', ')}`,\n );\n }\n }\n\n try {\n // update variables of every admin instance\n await this.updateInfo(allSources);\n } catch {\n // not important if fails\n }\n\n return this.showRepoResult(allSources, flags);\n }\n }\n\n /**\n * Show the repo result on CLI\n *\n * @param sources Repo JSON sources\n * @param flags CLI flags\n */\n private async showRepoResult(sources: Record<string, any>, flags: RepoFlags): Promise<void> {\n const installed = tools.getInstalledInfo();\n const adapters = Object.keys(sources).sort();\n\n for (const name of adapters) {\n let updatable = false;\n let text = sources[name].controller ? 'Controller ' : 'Adapter ';\n text += `\"${name}\"`;\n text = text.padEnd(11 + 15);\n\n if (sources[name].version) {\n text += `: ${sources[name].version}`;\n }\n text = text.padEnd(11 + 15 + 11);\n\n if (!(flags.all || flags.a) && !installed[name]) {\n continue;\n }\n\n if (installed[name]?.version) {\n text += `, installed ${installed[name].version}`;\n try {\n // tools.upToDate can throw if a version is invalid\n if (\n sources[name].version !== installed[name].version &&\n sources[name].version &&\n !tools.upToDate(sources[name].version, installed[name].version)\n ) {\n updatable = true;\n text = text.padEnd(11 + 15 + 11 + 18);\n const isIgnored = await isVersionIgnored({\n adapterName: name,\n objects: this.objects,\n version: sources[name].version,\n });\n\n text += isIgnored ? ' [Ignored]' : ' [Updatable]';\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n if ((flags.updatable || flags.u) && !updatable) {\n continue;\n }\n console.log(text);\n }\n }\n\n /**\n * Update Admin info states with number of updates\n *\n * @param sources the repository object\n */\n private async updateInfo(sources: Record<string, any>): Promise<void> {\n const installed = tools.getInstalledInfo();\n const list: string[] = [];\n\n for (const name of Object.keys(sources)) {\n if (installed[name] && installed[name].version && sources[name].version) {\n try {\n // tools.upToDate can throw if a version is invalid\n if (\n sources[name].version !== installed[name].version &&\n !tools.upToDate(sources[name].version, installed[name].version)\n ) {\n // remove the first part of the name\n const n = name.indexOf('.');\n list.push(n === -1 ? name : name.substring(n + 1));\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n }\n\n const objs = await this.objects.getObjectViewAsync('system', 'instance', {\n startkey: 'system.adapter.admin',\n endkey: 'system.adapter.admin\\u9999',\n });\n\n if (objs?.rows?.length) {\n const listStr = list.join(', ');\n for (const row of objs.rows) {\n if (row?.value?.type === 'instance') {\n await this.states.setState(`${row.id}.info.updatesNumber`, { val: list.length, ack: true });\n await this.states.setState(`${row.id}.info.updatesList`, { val: listStr, ack: true });\n }\n }\n }\n }\n\n /**\n * Show the current status of Repo on CLI\n */\n async showRepoStatus(): Promise<number> {\n try {\n const obj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const objCfg = await this.objects.getObject(SYSTEM_CONFIG_ID);\n\n if (!obj) {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n } else if (obj.native.repositories) {\n console.table(\n Object.entries(obj.native.repositories).map(([key, value]) => {\n return {\n name: key,\n url: value.link,\n 'auto upgrade': objCfg?.common.adapterAutoUpgrade?.repositories[key] ?? false,\n };\n }),\n );\n\n if (objCfg?.common) {\n let activeRepo = objCfg.common.activeRepo;\n if (typeof activeRepo === 'string') {\n activeRepo = [activeRepo];\n }\n console.log(`\\nActive repo(s): ${activeRepo.join(', ')}`);\n console.log(`Upgrade policy: ${objCfg.common.adapterAutoUpgrade?.defaultPolicy ?? 'none'}`);\n }\n } else {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n } catch (err) {\n console.error(`Cannot get list: ${err}`);\n }\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n\n /**\n * Add new repo\n *\n * @param repoName name of new repo\n * @param repoUrl url of new repo\n */\n async add(repoName: string, repoUrl: string): Promise<void> {\n const sysRepoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" yet exists: ${obj.native.repositories[repoName].link}`);\n } else {\n if (isIntegerLikeInput(repoName)) {\n throw new Error(\n `Invalid name \"${repoName}\"! A repository name is not allowed to contain only numbers.`,\n );\n }\n\n obj.native.repositories[repoName] = {\n link: repoUrl,\n json: null,\n };\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, obj);\n }\n }\n\n /**\n * Remove repository from sources\n *\n * @param repoName name of repository to remove\n */\n async del(repoName: string): Promise<void> {\n const obj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n if (\n (obj?.common.activeRepo &&\n typeof obj.common.activeRepo === 'string' &&\n obj.common.activeRepo === repoName) ||\n (obj?.common.activeRepo && Array.isArray(obj.common.activeRepo) && obj.common.activeRepo.includes(repoName))\n ) {\n throw new Error(`Cannot delete active repository: ${repoName}`);\n } else {\n const repoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (repoObj) {\n if (!repoObj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n } else {\n delete repoObj.native.repositories[repoName];\n repoObj.from = `system.host.${tools.getHostName()}.cli`;\n repoObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, repoObj);\n }\n }\n }\n }\n\n /**\n * Checks if stable repo is active\n *\n * @param options the system config object and the repository object\n */\n private getRepoActiveInfo(options: RepoActiveOptions): RepoActiveInfo {\n const { repoObj, sysConfObj, url } = options;\n\n const name = sysConfObj.common.activeRepo.find(\n activeRepo => repoObj.native.repositories[activeRepo].link === url,\n );\n\n return name ? { isActive: true, name } : { isActive: false };\n }\n\n /**\n * Set specific repo as active one\n *\n * @param repoName name of the repository to activate\n */\n async setActive(repoName: string): Promise<void> {\n const sysRepoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (!obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n }\n\n const confObj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n if (!confObj || confObj.common.activeRepo.includes(repoName)) {\n return;\n }\n\n confObj.common.activeRepo.push(repoName);\n\n const stableInfo = this.getRepoActiveInfo({\n url: STABLE_REPO_URL,\n sysConfObj: confObj,\n repoObj: obj,\n });\n\n const betaInfo = this.getRepoActiveInfo({\n url: BETA_REPO_URL,\n sysConfObj: confObj,\n repoObj: obj,\n });\n\n if (stableInfo.isActive && betaInfo.isActive) {\n const posStable = confObj.common.activeRepo.indexOf(stableInfo.name);\n const posBeta = confObj.common.activeRepo.indexOf(betaInfo.name);\n\n if (posStable < posBeta) {\n // put beta in front of stable, so stable will override adapters\n confObj.common.activeRepo.splice(posBeta, 1);\n confObj.common.activeRepo.splice(posStable, 0, betaInfo.name);\n console.info(\n `Ensured that stable repository \"${stableInfo.name}\" has priority over beta repository \"${betaInfo.name}\"`,\n );\n }\n }\n\n if (confObj.common.activeRepo.length > 1) {\n console.info('More than one repository is active. Please be sure, that this is a desired constellation!');\n }\n\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_CONFIG_ID, confObj);\n }\n\n /**\n * Set given repo as inactive\n *\n * @param repoName name of the repository\n */\n async setInactive(repoName: string): Promise<void> {\n const confObj = (await this.objects.getObject(SYSTEM_CONFIG_ID))!;\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n const pos = confObj.common.activeRepo.indexOf(repoName);\n if (pos !== -1) {\n confObj.common.activeRepo.splice(pos, 1);\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_CONFIG_ID, confObj);\n }\n }\n\n /**\n * Renames existing repository if old name and link matches, renaming will not be performed if a repo with the new name already exists\n *\n * @param oldName - name of the current repository\n * @param newName - target name\n * @param repoUrl - hyperlink of the repository\n */\n async rename(oldName: string, newName: string, repoUrl: string): Promise<void> {\n let repoObj;\n let sysConfigObj;\n try {\n sysConfigObj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n repoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n if (isIntegerLikeInput(newName)) {\n throw new Error(`Invalid name \"${newName}\"! A repository name is not allowed to contain only numbers.`);\n }\n\n if (!repoObj) {\n return;\n }\n\n if (\n repoObj.native.repositories[oldName] &&\n repoObj.native.repositories[oldName].link === repoUrl &&\n !repoObj.native.repositories[newName]\n ) {\n repoObj.native.repositories[newName] = repoObj.native.repositories[oldName];\n delete repoObj.native.repositories[oldName];\n\n try {\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, repoObj);\n console.log(`Renamed repository \"${oldName} to \"${newName}\"`);\n } catch (e) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${e.message}`);\n }\n\n // if we changed the name of the activeRepo, we should set newName as active repo\n if (\n sysConfigObj?.common &&\n ((typeof sysConfigObj.common.activeRepo === 'string' && sysConfigObj.common.activeRepo === oldName) ||\n (Array.isArray(sysConfigObj.common.activeRepo) && sysConfigObj.common.activeRepo.includes(oldName)))\n ) {\n if (typeof sysConfigObj.common.activeRepo === 'string') {\n sysConfigObj.common.activeRepo = [sysConfigObj.common.activeRepo];\n }\n const pos = sysConfigObj.common.activeRepo.indexOf(oldName);\n sysConfigObj.common.activeRepo.splice(pos, 1, newName);\n\n try {\n await this.objects.setObject(SYSTEM_CONFIG_ID, sysConfigObj);\n } catch (e) {\n throw new Error(`Could not set \"${newName}\" as active repository: ${e.message}`);\n }\n }\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import axios from 'axios';\nimport fs from 'fs-extra';\nimport path from 'node:path';\n\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport { SYSTEM_CONFIG_ID, SYSTEM_REPOSITORIES_ID } from '@iobroker/js-controller-common-db/constants';\nimport { BETA_REPO_URL, isIntegerLikeInput, isVersionIgnored, STABLE_REPO_URL } from '@/lib/setup/utils.js';\nimport type { ProcessCommandOptions } from '@/lib/cli/cliCommand.js';\nimport { dbConnect, dbConnectAsync } from '@/lib/setup/dbConnection.js';\n\n/** The options passed to the Repo constructor */\nexport interface CLIRepoOptions {\n /** Instance of objects DB */\n objects: ObjectsRedisClient;\n /** Instance of states DB */\n states: StatesRedisClient;\n}\n\n/**\n * All possible Repo Flags which can be passed to the `show` method\n */\nexport interface RepoFlags {\n /** Also list not installed adapters */\n a?: boolean;\n /** Also list not installed adapters */\n all?: boolean;\n /** Only list updatable adapters */\n u?: boolean;\n /** Only list updatable adapters */\n updatable?: boolean;\n /** Force update even if hash hasn't changed */\n f?: boolean;\n /** Force update even if hash hasn't changed */\n force?: boolean;\n}\n\ntype RepoActiveInfo =\n | {\n /** If the repo is active */\n isActive: true;\n /** Name of the repository */\n name: string;\n }\n | {\n /** If the repo is active */\n isActive: false;\n };\n\ninterface RepoActiveOptions {\n /** Url to check if active */\n url: string;\n /** System config object */\n sysConfObj: ioBroker.SystemConfigObject;\n /** Repository object */\n repoObj: ioBroker.RepositoryObject;\n}\n\n/**\n * CLI command to manage the ioBroker repositories\n */\nexport class Repo {\n private readonly defaultSystemRepo: ioBroker.RepositoryObject;\n private readonly objects: ObjectsRedisClient;\n private readonly states: StatesRedisClient;\n private readonly controllerVersion: string;\n\n /**\n * @param options The objects/states clients and the controller version\n */\n constructor(options: CLIRepoOptions) {\n if (!options?.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options?.states) {\n throw new Error('Invalid arguments: states is missing');\n }\n\n const ioPackage = fs.readJSONSync(path.join(tools.getControllerDir(), 'io-package.json'));\n this.controllerVersion = ioPackage.common.version;\n\n this.objects = options.objects;\n this.states = options.states;\n\n this.defaultSystemRepo = {\n common: {\n name: 'System repositories',\n dontDelete: true,\n },\n native: {\n repositories: {\n stable: {\n link: STABLE_REPO_URL,\n json: null,\n },\n beta: {\n link: BETA_REPO_URL,\n json: null,\n },\n },\n },\n _id: SYSTEM_REPOSITORIES_ID,\n type: 'config',\n };\n }\n\n /**\n * Get the repository name by index\n * Throws if the index does not exist\n *\n * @param repoIndex repo name or index\n */\n async getNameByIndex(repoIndex: number): Promise<string> {\n const obj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (!obj?.native?.repositories) {\n throw new Error('No repositories setup!');\n }\n\n const repoNames = Object.keys(obj.native.repositories);\n if (!repoNames[repoIndex]) {\n throw new Error(`No repository for index \"${repoIndex}\" found`);\n }\n\n return repoNames[repoIndex];\n }\n\n /**\n * Update the given repository and returns new repo content\n *\n * @param repoName name of the repository\n * @param force force update even if same hash\n * @param systemConfig content of `system.config` object\n * @param systemRepos content of `system.repositories` object\n */\n private async updateRepo(\n repoName: string,\n force: boolean | undefined,\n systemConfig?: ioBroker.OtherObject,\n systemRepos?: ioBroker.RepositoryObject,\n ): Promise<null | ioBroker.RepositoryJson> {\n if (!repoName) {\n const sysConfig = systemConfig || (await this.objects.getObject(SYSTEM_CONFIG_ID));\n repoName = sysConfig!.common.activeRepo;\n }\n\n const oldRepos = systemRepos || (await this.objects.getObject(SYSTEM_REPOSITORIES_ID));\n if (!oldRepos?.native.repositories?.[repoName]) {\n console.log(`Error: repository \"${repoName}\" not found in the \"${SYSTEM_REPOSITORIES_ID}\"`);\n return null;\n }\n\n const urlOrPath = oldRepos.native.repositories[repoName].link;\n const hashUrl = urlOrPath.replace(/\\.json$/, '-hash.json');\n let hash;\n\n if (\n !force &&\n oldRepos.native.repositories[repoName].hash &&\n oldRepos.native.repositories[repoName].json &&\n (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://'))\n ) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10_000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n if (hash?.data && oldRepos.native.repositories[repoName].hash === hash.data.hash) {\n return oldRepos.native.repositories[repoName].json;\n }\n }\n\n let data;\n\n if (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://')) {\n if (!hash) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n }\n\n const agent = `${tools.appName}, RND: CLI, Node:${process.version}, V:${this.controllerVersion}`;\n try {\n data = await axios({\n url: urlOrPath,\n timeout: 10_000,\n headers: { 'User-Agent': agent },\n });\n if (data.data) {\n data = data.data;\n } else {\n data = null;\n }\n } catch (e) {\n console.error(`Cannot download repository file from \"${urlOrPath}\": ${e.message}`);\n data = null;\n }\n } else {\n if (fs.existsSync(urlOrPath)) {\n try {\n data = JSON.parse(fs.readFileSync(urlOrPath).toString('utf8'));\n } catch (err) {\n console.error(`Error: Cannot read or parse file \"${urlOrPath}\": ${err.message}`);\n }\n } else {\n console.error(`Error: Cannot find file \"${urlOrPath}\"`);\n }\n }\n\n let changed;\n if (data) {\n oldRepos.native.repositories[repoName].json = data;\n changed = true;\n }\n if (hash?.data) {\n oldRepos.native.repositories[repoName].hash = hash.data.hash;\n changed = true;\n }\n if (changed) {\n oldRepos.from = `system.host.${tools.getHostName()}.cli`;\n oldRepos.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, oldRepos);\n }\n\n return oldRepos.native.repositories[repoName].json;\n }\n\n /**\n * Show repo on CLI\n *\n * @param repoUrl url of the repository\n * @param flags CLI flags\n */\n async showRepo(repoUrl: string | string[], flags: RepoFlags): Promise<void> {\n // Get the repositories\n const systemConfig = await this.objects.getObject(SYSTEM_CONFIG_ID);\n const systemRepos = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (!systemConfig) {\n console.error(`Error: Object \"${SYSTEM_CONFIG_ID}\" not found`);\n } else if (!systemRepos) {\n console.error(`Error: Object \"${SYSTEM_REPOSITORIES_ID}\" not found`);\n } else if (!systemRepos.native || !systemRepos.native.repositories) {\n console.error(`Error: no repositories found in the \"${SYSTEM_REPOSITORIES_ID}\"`);\n } else {\n repoUrl = repoUrl || systemConfig.common.activeRepo;\n\n if (!Array.isArray(repoUrl)) {\n repoUrl = [repoUrl];\n }\n\n console.log(`Used ${repoUrl.length > 1 ? 'repositories' : 'repository'}: ${repoUrl.join(', ')}`);\n\n const allSources: ioBroker.RepositoryJson = {} as ioBroker.RepositoryJson;\n\n for (const url of repoUrl) {\n const repo = systemRepos.native.repositories[url];\n // If known repository\n if (repo) {\n if (typeof repo === 'string') {\n systemRepos.native.repositories[url] = {\n link: repo,\n json: null,\n hash: '',\n };\n }\n\n const sources = await this.updateRepo(url, flags.force || flags.f, systemConfig, systemRepos);\n if (sources) {\n Object.assign(allSources, sources);\n }\n } else {\n console.error(\n `Error: unknown repository is active - \"${url}\". Known: ${Object.keys(\n systemRepos.native.repositories,\n ).join(', ')}`,\n );\n }\n }\n\n try {\n // update variables of every admin instance\n await this.updateInfo(allSources);\n } catch {\n // not important if fails\n }\n\n return this.showRepoResult(allSources, flags);\n }\n }\n\n /**\n * Show the repo result on CLI\n *\n * @param sources Repo JSON sources\n * @param flags CLI flags\n */\n private async showRepoResult(sources: ioBroker.RepositoryJson, flags: RepoFlags): Promise<void> {\n const installed = tools.getInstalledInfo();\n const adapters = Object.keys(sources).sort();\n\n for (const name of adapters) {\n let updatable = false;\n if (name === 'repoInfo') {\n continue;\n }\n const adapter = sources[name] as ioBroker.RepositoryJsonAdapterContent;\n let text = adapter.controller ? 'Controller ' : 'Adapter ';\n text += `\"${name}\"`;\n text = text.padEnd(11 + 15);\n\n if (adapter.version) {\n text += `: ${adapter.version}`;\n }\n text = text.padEnd(11 + 15 + 11);\n\n if (!(flags.all || flags.a) && !installed[name]) {\n continue;\n }\n\n if (installed[name]?.version) {\n text += `, installed ${installed[name].version}`;\n try {\n // tools.upToDate can throw if a version is invalid\n if (\n adapter.version !== installed[name].version &&\n adapter.version &&\n !tools.upToDate(adapter.version, installed[name].version)\n ) {\n updatable = true;\n text = text.padEnd(11 + 15 + 11 + 18);\n const isIgnored = await isVersionIgnored({\n adapterName: name,\n objects: this.objects,\n version: adapter.version,\n });\n\n text += isIgnored ? ' [Ignored]' : ' [Updatable]';\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n if ((flags.updatable || flags.u) && !updatable) {\n continue;\n }\n console.log(text);\n }\n }\n\n /**\n * Update Admin info states with number of updates\n *\n * @param sources the repository object\n */\n private async updateInfo(sources: ioBroker.RepositoryJson): Promise<void> {\n const installed = tools.getInstalledInfo();\n const list: string[] = [];\n\n for (const name in sources) {\n if (name === 'repoInfo') {\n continue;\n }\n const adapter = sources[name] as ioBroker.RepositoryJsonAdapterContent;\n if (installed[name]?.version && adapter.version) {\n try {\n // tools.upToDate can throw if a version is invalid\n if (\n adapter.version !== installed[name].version &&\n !tools.upToDate(adapter.version, installed[name].version)\n ) {\n // remove the first part of the name\n const n = name.indexOf('.');\n list.push(n === -1 ? name : name.substring(n + 1));\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n }\n\n const objs = await this.objects.getObjectViewAsync('system', 'instance', {\n startkey: 'system.adapter.admin',\n endkey: 'system.adapter.admin\\u9999',\n });\n\n if (objs?.rows?.length) {\n const listStr = list.join(', ');\n for (const row of objs.rows) {\n if (row?.value?.type === 'instance') {\n await this.states.setState(`${row.id}.info.updatesNumber`, { val: list.length, ack: true });\n await this.states.setState(`${row.id}.info.updatesList`, { val: listStr, ack: true });\n }\n }\n }\n }\n\n /**\n * Show the current status of Repo on CLI\n */\n async showRepoStatus(): Promise<number> {\n try {\n const obj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const objCfg = await this.objects.getObject(SYSTEM_CONFIG_ID);\n\n if (!obj) {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n } else if (obj.native.repositories) {\n console.table(\n Object.entries(obj.native.repositories).map(([key, value]) => {\n return {\n name: key,\n url: value.link,\n 'auto upgrade': objCfg?.common.adapterAutoUpgrade?.repositories[key] ?? false,\n };\n }),\n );\n\n if (objCfg?.common) {\n let activeRepo = objCfg.common.activeRepo;\n if (typeof activeRepo === 'string') {\n activeRepo = [activeRepo];\n }\n console.log(`\\nActive repo(s): ${activeRepo.join(', ')}`);\n console.log(`Upgrade policy: ${objCfg.common.adapterAutoUpgrade?.defaultPolicy ?? 'none'}`);\n }\n } else {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n } catch (err) {\n console.error(`Cannot get list: ${err}`);\n }\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n\n /**\n * Add new repo\n *\n * @param repoName name of new repo\n * @param repoUrl url of new repo\n */\n async add(repoName: string, repoUrl: string): Promise<void> {\n const sysRepoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" yet exists: ${obj.native.repositories[repoName].link}`);\n } else {\n if (isIntegerLikeInput(repoName)) {\n throw new Error(\n `Invalid name \"${repoName}\"! A repository name is not allowed to contain only numbers.`,\n );\n }\n\n obj.native.repositories[repoName] = {\n link: repoUrl,\n json: null,\n };\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, obj);\n }\n }\n\n /**\n * Remove repository from sources\n *\n * @param repoName name of repository to remove\n */\n async del(repoName: string): Promise<void> {\n const obj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n if (\n (obj?.common.activeRepo &&\n typeof obj.common.activeRepo === 'string' &&\n obj.common.activeRepo === repoName) ||\n (obj?.common.activeRepo && Array.isArray(obj.common.activeRepo) && obj.common.activeRepo.includes(repoName))\n ) {\n throw new Error(`Cannot delete active repository: ${repoName}`);\n } else {\n const repoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (repoObj) {\n if (!repoObj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n } else {\n delete repoObj.native.repositories[repoName];\n repoObj.from = `system.host.${tools.getHostName()}.cli`;\n repoObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, repoObj);\n }\n }\n }\n }\n\n /**\n * Checks if stable repo is active\n *\n * @param options the system config object and the repository object\n */\n private getRepoActiveInfo(options: RepoActiveOptions): RepoActiveInfo {\n const { repoObj, sysConfObj, url } = options;\n\n const name = sysConfObj.common.activeRepo.find(\n activeRepo => repoObj.native.repositories[activeRepo].link === url,\n );\n\n return name ? { isActive: true, name } : { isActive: false };\n }\n\n /**\n * Set specific repo as active one\n *\n * @param repoName name of the repository to activate\n */\n async setActive(repoName: string): Promise<void> {\n const sysRepoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (!obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n }\n\n const confObj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n if (!confObj || confObj.common.activeRepo.includes(repoName)) {\n return;\n }\n\n confObj.common.activeRepo.push(repoName);\n\n const stableInfo = this.getRepoActiveInfo({\n url: STABLE_REPO_URL,\n sysConfObj: confObj,\n repoObj: obj,\n });\n\n const betaInfo = this.getRepoActiveInfo({\n url: BETA_REPO_URL,\n sysConfObj: confObj,\n repoObj: obj,\n });\n\n if (stableInfo.isActive && betaInfo.isActive) {\n const posStable = confObj.common.activeRepo.indexOf(stableInfo.name);\n const posBeta = confObj.common.activeRepo.indexOf(betaInfo.name);\n\n if (posStable < posBeta) {\n // put beta in front of stable, so stable will override adapters\n confObj.common.activeRepo.splice(posBeta, 1);\n confObj.common.activeRepo.splice(posStable, 0, betaInfo.name);\n console.info(\n `Ensured that stable repository \"${stableInfo.name}\" has priority over beta repository \"${betaInfo.name}\"`,\n );\n }\n }\n\n if (confObj.common.activeRepo.length > 1) {\n console.info('More than one repository is active. Please be sure, that this is a desired constellation!');\n }\n\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_CONFIG_ID, confObj);\n }\n\n /**\n * Set given repo as inactive\n *\n * @param repoName name of the repository\n */\n async setInactive(repoName: string): Promise<void> {\n const confObj = (await this.objects.getObject(SYSTEM_CONFIG_ID))!;\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n const pos = confObj.common.activeRepo.indexOf(repoName);\n if (pos !== -1) {\n confObj.common.activeRepo.splice(pos, 1);\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_CONFIG_ID, confObj);\n }\n }\n\n /**\n * Renames existing repository if old name and link matches, renaming will not be performed if a repo with the new name already exists\n *\n * @param oldName - name of the current repository\n * @param newName - target name\n * @param repoUrl - hyperlink of the repository\n */\n async rename(oldName: string, newName: string, repoUrl: string): Promise<void> {\n let repoObj;\n let sysConfigObj;\n try {\n sysConfigObj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n repoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n if (isIntegerLikeInput(newName)) {\n throw new Error(`Invalid name \"${newName}\"! A repository name is not allowed to contain only numbers.`);\n }\n\n if (!repoObj) {\n return;\n }\n\n if (\n repoObj.native.repositories[oldName] &&\n repoObj.native.repositories[oldName].link === repoUrl &&\n !repoObj.native.repositories[newName]\n ) {\n repoObj.native.repositories[newName] = repoObj.native.repositories[oldName];\n delete repoObj.native.repositories[oldName];\n\n try {\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, repoObj);\n console.log(`Renamed repository \"${oldName} to \"${newName}\"`);\n } catch (e) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${e.message}`);\n }\n\n // if we changed the name of the activeRepo, we should set newName as active repo\n if (\n sysConfigObj?.common &&\n ((typeof sysConfigObj.common.activeRepo === 'string' && sysConfigObj.common.activeRepo === oldName) ||\n (Array.isArray(sysConfigObj.common.activeRepo) && sysConfigObj.common.activeRepo.includes(oldName)))\n ) {\n if (typeof sysConfigObj.common.activeRepo === 'string') {\n sysConfigObj.common.activeRepo = [sysConfigObj.common.activeRepo];\n }\n const pos = sysConfigObj.common.activeRepo.indexOf(oldName);\n sysConfigObj.common.activeRepo.splice(pos, 1, newName);\n\n try {\n await this.objects.setObject(SYSTEM_CONFIG_ID, sysConfigObj);\n } catch (e) {\n throw new Error(`Could not set \"${newName}\" as active repository: ${e.message}`);\n }\n }\n }\n }\n}\n\n/**\n * Handles the `update` CLI command\n *\n * @param options the process command options\n */\nexport function processCommandUpdate(options: ProcessCommandOptions): void {\n const { args, params, callback } = options;\n\n const repoUrl = args[0]; // Repo url or name\n dbConnect(params, async ({ objects, states }) => {\n const repo = new Repo({\n objects,\n states,\n });\n\n await repo.showRepo(repoUrl, params);\n setTimeout(callback, 1_000);\n });\n}\n\n/**\n * Handles the `repo` CLI command\n *\n * @param options the process command options\n */\nexport async function processCommandRepo(options: ProcessCommandOptions): Promise<void> {\n const { args, params, callback } = options;\n\n let repoUrlOrCommand: string | undefined = args[0]; // Repo url or name or \"add\" / \"del\" / \"set\" / \"show\" / \"addset\" / \"unset\"\n let repoName: string | undefined = args[1]; // Repo url or name\n let repoUrl: string | undefined = args[2]; // Repo url or name\n if (\n repoUrlOrCommand !== 'add' &&\n repoUrlOrCommand !== 'del' &&\n repoUrlOrCommand !== 'set' &&\n repoUrlOrCommand !== 'show' &&\n repoUrlOrCommand !== 'addset' &&\n repoUrlOrCommand !== 'unset'\n ) {\n repoUrl = repoUrlOrCommand;\n repoUrlOrCommand = 'show';\n }\n\n const { objects, states } = await dbConnectAsync(false, params);\n const repo = new Repo({\n objects,\n states,\n });\n\n if (repoUrlOrCommand === 'show') {\n try {\n await repo.showRepoStatus();\n return void callback();\n } catch (e) {\n console.error(`Cannot show repository status: ${e.message}`);\n return void callback(EXIT_CODES.INVALID_REPO);\n }\n }\n\n if (\n repoUrlOrCommand === 'add' ||\n repoUrlOrCommand === 'del' ||\n repoUrlOrCommand === 'set' ||\n repoUrlOrCommand === 'addset' ||\n repoUrlOrCommand === 'unset'\n ) {\n if (!repoName || !repoName.match(/[-_\\w]+/)) {\n console.error(`Invalid repository name: \"${repoName}\"`);\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n\n if (isIntegerLikeInput(repoName)) {\n try {\n repoName = await repo.getNameByIndex(parseInt(repoName));\n } catch (e) {\n console.error(e.message);\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n }\n\n if (repoUrlOrCommand === 'add' || repoUrlOrCommand === 'addset') {\n if (!repoUrl) {\n console.warn(\n `Please define repository URL or path: ${tools.appName.toLowerCase()} add <repoName> <repoUrlOrPath>`,\n );\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n try {\n await repo.add(repoName, repoUrl);\n\n if (repoUrlOrCommand === 'addset') {\n await repo.setActive(repoName);\n console.log(`Repository \"${repoName}\" set as active: \"${repoUrl}\"`);\n await repo.showRepoStatus();\n return void callback();\n }\n console.log(`Repository \"${repoName}\" added as \"${repoUrl}\"`);\n await repo.showRepoStatus();\n return void callback();\n } catch (e) {\n console.error(`Cannot add repository location: ${e.message}`);\n return void callback(EXIT_CODES.INVALID_REPO);\n }\n } else if (repoUrlOrCommand === 'set') {\n try {\n await repo.setActive(repoName);\n console.log(`Repository \"${repoName}\" set as active.`);\n await repo.showRepoStatus();\n return void callback();\n } catch (e) {\n console.error(`Cannot activate repository: ${e.message}`);\n return void callback(EXIT_CODES.INVALID_REPO);\n }\n } else if (repoUrlOrCommand === 'del') {\n try {\n await repo.del(repoName);\n console.log(`Repository \"${repoName}\" deleted.`);\n await repo.showRepoStatus();\n return void callback();\n } catch (e) {\n console.error(`Cannot remove repository: ${e.message}`);\n return void callback(EXIT_CODES.INVALID_REPO);\n }\n } else if (repoUrlOrCommand === 'unset') {\n try {\n await repo.setInactive(repoName);\n console.log(`Repository \"${repoName}\" deactivated.`);\n await repo.showRepoStatus();\n return void callback();\n } catch (e) {\n console.error(`Cannot deactivate repository: ${e.message}`);\n return void callback(EXIT_CODES.INVALID_REPO);\n }\n } else {\n console.warn(`Unknown repo command: ${repoUrlOrCommand as string}`);\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["fs", "path", "axios"]
7
7
  }
@@ -1,11 +1,18 @@
1
1
  import type { CleanDatabaseHandler, IoPackage, ProcessExitCallback, RestartController } from '../../lib/_Types.js';
2
+ import type { ProcessCommandOptions } from '../../lib/cli/cliCommand.js';
2
3
  import { EXIT_CODES } from '@iobroker/js-controller-common';
4
+ /** Options for the setup command */
3
5
  export interface CLISetupOptions {
6
+ /** Handler to clean the database */
4
7
  cleanDatabase: CleanDatabaseHandler;
8
+ /** Callback to exit the process with an exit code */
5
9
  processExit: ProcessExitCallback;
10
+ /** Parsed CLI parameters */
6
11
  params: Record<string, any>;
12
+ /** Handler to restart the controller */
7
13
  restartController: RestartController;
8
14
  }
15
+ /** Options for running the setup command */
9
16
  export interface SetupCommandOptions {
10
17
  /** Callback called afterward */
11
18
  callback: (isCreated?: boolean) => void;
@@ -14,6 +21,9 @@ export interface SetupCommandOptions {
14
21
  /** If redis should be setup */
15
22
  useRedis: boolean;
16
23
  }
24
+ /**
25
+ * CLI command that performs the initial ioBroker setup (databases, config and objects)
26
+ */
17
27
  export declare class Setup {
18
28
  /** Object IDs which are not allowed to exist but could be generated due to errors in the past */
19
29
  private readonly KNOWN_GARBAGE_OBJECT_IDS;
@@ -25,7 +35,15 @@ export declare class Setup {
25
35
  private readonly params;
26
36
  private readonly cleanDatabase;
27
37
  private readonly restartController;
38
+ /**
39
+ * @param options Handlers for cleaning the DB, exiting and restarting, plus the CLI parameters
40
+ */
28
41
  constructor(options: CLISetupOptions);
42
+ /**
43
+ * Print information about the plugins configured for the controller
44
+ *
45
+ * @param systemConfig The system.config object, used to read the active repository
46
+ */
29
47
  informAboutPlugins(systemConfig?: ioBroker.SystemConfigObject | null): Promise<void>;
30
48
  /**
31
49
  * Called after io-package objects are created (hence object view functionalities are now available)
@@ -34,6 +52,13 @@ export declare class Setup {
34
52
  * @param callback callback function
35
53
  */
36
54
  setupReady(systemConfig: ioBroker.SystemConfigObject | undefined | null, callback: () => void): Promise<void>;
55
+ /**
56
+ * Create the initial set of objects and design documents in the database
57
+ *
58
+ * @param iopkg The io-package.json of the controller
59
+ * @param ignoreExisting Whether to proceed even if the config already exists
60
+ * @param callback Called once the database has been set up
61
+ */
37
62
  dbSetup(iopkg: IoPackage, ignoreExisting: boolean, callback: () => void): Promise<void>;
38
63
  /**
39
64
  * Fix the config object if existing
@@ -55,6 +80,9 @@ export declare class Setup {
55
80
  * @param oldConfig - previous config
56
81
  */
57
82
  migrateObjects(newConfig: ioBroker.IoBrokerJson, oldConfig: ioBroker.IoBrokerJson): Promise<EXIT_CODES>;
83
+ /**
84
+ * Interactively configure the databases and write the configuration file
85
+ */
58
86
  setupCustom(): Promise<EXIT_CODES>;
59
87
  /**
60
88
  * Checks if single host setup and if so migrates and activates Redis Sets Usage
@@ -107,4 +135,10 @@ export declare class Setup {
107
135
  */
108
136
  setup(options: SetupCommandOptions): void;
109
137
  }
138
+ /**
139
+ * Process the `setup` command
140
+ *
141
+ * @param options the command options
142
+ */
143
+ export declare function processCommandSetup(options: ProcessCommandOptions): Promise<void>;
110
144
  //# sourceMappingURL=setupSetup.d.ts.map
@@ -5,6 +5,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
9
  var __export = (target, all) => {
9
10
  for (var name in all)
10
11
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -28,26 +29,29 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
30
  var setupSetup_exports = {};
30
31
  __export(setupSetup_exports, {
31
- Setup: () => Setup
32
+ Setup: () => Setup,
33
+ processCommandSetup: () => processCommandSetup
32
34
  });
33
35
  module.exports = __toCommonJS(setupSetup_exports);
34
36
  var __import_meta_url = typeof document === "undefined" ? new (require("url".replace("", ""))).URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
35
37
  var import_fs_extra = __toESM(require("fs-extra"), 1);
36
38
  var import_node_path = __toESM(require("node:path"), 1);
37
- var import_js_controller_common = require("@iobroker/js-controller-common");
38
- var import_js_controller_common2 = require("@iobroker/js-controller-common");
39
- var import_dbConnection = require("../../lib/setup/dbConnection.js");
40
- var import_setupBackup = require("../../lib/setup/setupBackup.js");
39
+ var import_node_os = __toESM(require("node:os"), 1);
41
40
  var import_node_crypto = __toESM(require("node:crypto"), 1);
42
41
  var import_deep_clone = __toESM(require("deep-clone"), 1);
43
- var pluginInfos = __toESM(require("../../lib/setup/pluginInfos.js"), 1);
42
+ var url = __toESM(require("node:url"), 1);
43
+ var import_node_module = require("node:module");
44
+ var import_node_util = require("node:util");
44
45
  var import_readline_sync = __toESM(require("readline-sync"), 1);
46
+ var import_cliCert = require("../../lib/cli/cliCert.js");
47
+ var import_js_controller_common = require("@iobroker/js-controller-common");
45
48
  var import_tools = require("@iobroker/js-controller-common-db/tools");
46
- var import_node_os = __toESM(require("node:os"), 1);
47
49
  var import_constants = require("@iobroker/js-controller-common-db/constants");
50
+ var import_dbConnection = require("../../lib/setup/dbConnection.js");
51
+ var import_utils = require("../../lib/setup/utils.js");
52
+ var import_setupBackup = require("../../lib/setup/setupBackup.js");
53
+ var pluginInfos = __toESM(require("../../lib/setup/pluginInfos.js"), 1);
48
54
  var import_setupUpload = require("../../lib/setup/setupUpload.js");
49
- var import_node_module = require("node:module");
50
- var url = __toESM(require("node:url"), 1);
51
55
  const thisDir = url.fileURLToPath(new URL(".", __import_meta_url || `file://${__filename}`));
52
56
  const require2 = (0, import_node_module.createRequire)(__import_meta_url || `file://${__filename}`);
53
57
  const COLOR_RED = "\x1B[31m";
@@ -56,6 +60,9 @@ const COLOR_RESET = "\x1B[0m";
56
60
  const COLOR_GREEN = "\x1B[32m";
57
61
  const CONTROLLER_DIR = import_js_controller_common.tools.getControllerDir();
58
62
  class Setup {
63
+ static {
64
+ __name(this, "Setup");
65
+ }
59
66
  /** Object IDs which are not allowed to exist but could be generated due to errors in the past */
60
67
  KNOWN_GARBAGE_OBJECT_IDS = ["null", "undefined"];
61
68
  /** Default name for redis sentinels */
@@ -66,6 +73,9 @@ class Setup {
66
73
  params;
67
74
  cleanDatabase;
68
75
  restartController;
76
+ /**
77
+ * @param options Handlers for cleaning the DB, exiting and restarting, plus the CLI parameters
78
+ */
69
79
  constructor(options) {
70
80
  this.processExit = options.processExit;
71
81
  this.params = options.params;
@@ -73,6 +83,11 @@ class Setup {
73
83
  this.restartController = options.restartController;
74
84
  this.dbSetup = this.dbSetup.bind(this);
75
85
  }
86
+ /**
87
+ * Print information about the plugins configured for the controller
88
+ *
89
+ * @param systemConfig The system.config object, used to read the active repository
90
+ */
76
91
  async informAboutPlugins(systemConfig) {
77
92
  if (!this.states) {
78
93
  throw new Error("States not set up, call setupObjects first");
@@ -204,6 +219,13 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
204
219
  return void callback();
205
220
  }
206
221
  }
222
+ /**
223
+ * Create the initial set of objects and design documents in the database
224
+ *
225
+ * @param iopkg The io-package.json of the controller
226
+ * @param ignoreExisting Whether to proceed even if the config already exists
227
+ * @param callback Called once the database has been set up
228
+ */
207
229
  async dbSetup(iopkg, ignoreExisting, callback) {
208
230
  if (!this.objects) {
209
231
  throw new Error("Objects not set up, call setupObjects first");
@@ -328,17 +350,14 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
328
350
  console.log(`object ${obj._id} updated`);
329
351
  } catch {
330
352
  }
331
- this.dbSetup(iopkg, true, callback);
332
- return;
353
+ return this.dbSetup(iopkg, true, callback);
333
354
  }
334
355
  }
335
- this.dbSetup(iopkg, true, callback);
336
- } else {
337
- this.dbSetup(iopkg, true, callback);
356
+ return this.dbSetup(iopkg, true, callback);
338
357
  }
339
- } else {
340
- this.dbSetup(iopkg, false, callback);
358
+ return this.dbSetup(iopkg, true, callback);
341
359
  }
360
+ return this.dbSetup(iopkg, false, callback);
342
361
  }
343
362
  /**
344
363
  * Asks the user if he wants to migrate objects if it makes sense and performs migration according to input
@@ -347,14 +366,14 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
347
366
  * @param oldConfig - previous config
348
367
  */
349
368
  async migrateObjects(newConfig, oldConfig) {
350
- const oldStatesHasServer = await (0, import_js_controller_common2.statesDbHasServer)(oldConfig.states.type);
351
- const oldObjectsHasServer = await (0, import_js_controller_common2.statesDbHasServer)(oldConfig.objects.type);
352
- const newStatesHasServer = await (0, import_js_controller_common2.statesDbHasServer)(newConfig.states.type);
353
- const newObjectsHasServer = await (0, import_js_controller_common2.statesDbHasServer)(newConfig.objects.type);
354
- const oldStatesLocalServer = await (0, import_js_controller_common2.isLocalStatesDbServer)(oldConfig.states.type, oldConfig.states.host);
355
- const oldObjectsLocalServer = await (0, import_js_controller_common2.isLocalObjectsDbServer)(oldConfig.objects.type, oldConfig.objects.host);
356
- const newStatesLocalServer = await (0, import_js_controller_common2.isLocalStatesDbServer)(newConfig.states.type, newConfig.states.host);
357
- const newObjectsLocalServer = await (0, import_js_controller_common2.isLocalObjectsDbServer)(newConfig.objects.type, newConfig.objects.host);
369
+ const oldStatesHasServer = await (0, import_js_controller_common.statesDbHasServer)(oldConfig.states.type);
370
+ const oldObjectsHasServer = await (0, import_js_controller_common.statesDbHasServer)(oldConfig.objects.type);
371
+ const newStatesHasServer = await (0, import_js_controller_common.statesDbHasServer)(newConfig.states.type);
372
+ const newObjectsHasServer = await (0, import_js_controller_common.statesDbHasServer)(newConfig.objects.type);
373
+ const oldStatesLocalServer = await (0, import_js_controller_common.isLocalStatesDbServer)(oldConfig.states.type, oldConfig.states.host);
374
+ const oldObjectsLocalServer = await (0, import_js_controller_common.isLocalObjectsDbServer)(oldConfig.objects.type, oldConfig.objects.host);
375
+ const newStatesLocalServer = await (0, import_js_controller_common.isLocalStatesDbServer)(newConfig.states.type, newConfig.states.host);
376
+ const newObjectsLocalServer = await (0, import_js_controller_common.isLocalObjectsDbServer)(newConfig.objects.type, newConfig.objects.host);
358
377
  if (oldConfig && (oldConfig.states.type !== newConfig.states.type || oldConfig.objects.type !== newConfig.objects.type || !oldStatesHasServer && oldConfig.states.host !== newConfig.states.host || !oldObjectsHasServer && oldConfig.objects.host !== newConfig.objects.host)) {
359
378
  let fromMaster = oldStatesLocalServer || oldObjectsLocalServer;
360
379
  let toMaster = newStatesLocalServer || newObjectsLocalServer;
@@ -525,6 +544,9 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
525
544
  import_fs_extra.default.writeFileSync(import_js_controller_common.tools.getConfigFileName(), JSON.stringify(newConfig, null, 2));
526
545
  return import_js_controller_common.EXIT_CODES.NO_ERROR;
527
546
  }
547
+ /**
548
+ * Interactively configure the databases and write the configuration file
549
+ */
528
550
  async setupCustom() {
529
551
  let config;
530
552
  try {
@@ -554,8 +576,8 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
554
576
  if (Array.isArray(originalConfig.states.host)) {
555
577
  console.log(` - Sentinel-Master-Name: ${originalConfig.states.sentinelName ? originalConfig.states.sentinelName : this.DEFAULT_SENTINEL_NAME}`);
556
578
  }
557
- const hasObjectsServer = await (0, import_js_controller_common2.objectsDbHasServer)(originalConfig.objects.type);
558
- const hasStatesServer = await (0, import_js_controller_common2.statesDbHasServer)(originalConfig.states.type);
579
+ const hasObjectsServer = await (0, import_js_controller_common.objectsDbHasServer)(originalConfig.objects.type);
580
+ const hasStatesServer = await (0, import_js_controller_common.statesDbHasServer)(originalConfig.states.type);
559
581
  if (hasObjectsServer || hasStatesServer) {
560
582
  console.log(`- Data Directory: ${import_js_controller_common.tools.getDefaultDataDir()}`);
561
583
  }
@@ -634,7 +656,7 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
634
656
  return import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS;
635
657
  }
636
658
  }
637
- config.objects = await (0, import_js_controller_common2.performObjectsInterview)({ dbType: oType, config: config.objects });
659
+ config.objects = await (0, import_js_controller_common.performObjectsInterview)({ dbType: oType, config: config.objects });
638
660
  let oSentinelName = null;
639
661
  if (oSentinel) {
640
662
  const defaultSentinelName = originalConfig.objects.sentinelName ? originalConfig.objects.sentinelName : this.DEFAULT_SENTINEL_NAME;
@@ -694,7 +716,7 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
694
716
  sHost = sHost.split(",").map((host) => host.trim());
695
717
  }
696
718
  let defaultStatesPort = sType === originalConfig.states.type && sHost === originalConfig.states.host ? originalConfig.states.port : sp;
697
- const statesHasServer = await (0, import_js_controller_common2.statesDbHasServer)(sType);
719
+ const statesHasServer = await (0, import_js_controller_common.statesDbHasServer)(sType);
698
720
  if (sType === oType && !statesHasServer && sHost === oHost) {
699
721
  defaultStatesPort = oPort;
700
722
  }
@@ -725,7 +747,7 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
725
747
  return import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS;
726
748
  }
727
749
  }
728
- config.states = await (0, import_js_controller_common2.performStatesInterview)({ dbType: sType, config: config.states });
750
+ config.states = await (0, import_js_controller_common.performStatesInterview)({ dbType: sType, config: config.states });
729
751
  let sSentinelName = null;
730
752
  if (sSentinel) {
731
753
  const defaultSentinelName = originalConfig.states.sentinelName ? originalConfig.states.sentinelName : oSentinelName && oPort === sPort ? oSentinelName : this.DEFAULT_SENTINEL_NAME;
@@ -735,8 +757,8 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
735
757
  }
736
758
  let dir;
737
759
  let hname;
738
- const hasLocalObjectsServer = await (0, import_js_controller_common2.isLocalObjectsDbServer)(oType, oHost);
739
- const hasLocalStatesServer = await (0, import_js_controller_common2.isLocalStatesDbServer)(sType, sHost);
760
+ const hasLocalObjectsServer = await (0, import_js_controller_common.isLocalObjectsDbServer)(oType, oHost);
761
+ const hasLocalStatesServer = await (0, import_js_controller_common.isLocalStatesDbServer)(sType, sHost);
740
762
  if (hasLocalStatesServer || hasLocalObjectsServer) {
741
763
  let validDataDir = false;
742
764
  while (!validDataDir) {
@@ -908,7 +930,8 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
908
930
  * Replace the `controller.js` file in the root directory to work with ESM
909
931
  */
910
932
  async _fixWindowsControllerJs() {
911
- const content = `import('./node_modules/iobroker.js-controller/controller.js');`;
933
+ const content = `import('./node_modules/iobroker.js-controller/controller.js');
934
+ `;
912
935
  const filePath = import_node_path.default.join(import_js_controller_common.tools.getRootDir(), "controller.js");
913
936
  try {
914
937
  await import_fs_extra.default.writeFile(filePath, content, { encoding: "utf-8" });
@@ -1213,14 +1236,165 @@ require('${import_node_path.default.normalize(`${thisDir}/..`)}/setup').execute(
1213
1236
  console.log(`Non-critical error: ${e.message}`);
1214
1237
  }
1215
1238
  } else if (ignoreIfExist) {
1216
- this.setupObjects(() => callback?.(), true);
1239
+ this.setupObjects(() => callback?.(), true).catch((e) => console.error(`Cannot setup objects: ${e.message}`));
1217
1240
  return;
1218
1241
  }
1219
- this.setupObjects(() => callback?.(isCreated));
1242
+ this.setupObjects(() => callback?.(isCreated)).catch((e) => console.error(`Cannot setup objects: ${e.message}`));
1243
+ }
1244
+ }
1245
+ async function processCommandSetup(options) {
1246
+ const { args, params, callback, commandOptions, cleanDatabase, restartController } = options;
1247
+ const setup = new Setup({
1248
+ processExit: callback,
1249
+ cleanDatabase,
1250
+ restartController,
1251
+ params
1252
+ });
1253
+ if (args[0] === "custom" || params.custom) {
1254
+ const exitCode = await setup.setupCustom();
1255
+ callback(exitCode);
1256
+ return;
1257
+ }
1258
+ let isFirst = false;
1259
+ let isRedis = false;
1260
+ for (const arg of args) {
1261
+ if (arg === "first") {
1262
+ isFirst = true;
1263
+ } else if (arg === "redis") {
1264
+ isRedis = true;
1265
+ }
1220
1266
  }
1267
+ isRedis = params.redis || isRedis;
1268
+ isFirst = params.first || isFirst;
1269
+ setup.setup({
1270
+ callback: /* @__PURE__ */ __name(async () => {
1271
+ const { states, objects } = await (0, import_dbConnection.dbConnectAsync)(false, params);
1272
+ if (isFirst) {
1273
+ const { Install } = await import("../../lib/setup/setupInstall.js");
1274
+ const install = new Install({
1275
+ objects,
1276
+ states,
1277
+ processExit: callback,
1278
+ params
1279
+ });
1280
+ const initialInstances = ["admin", "discovery", "backitup"];
1281
+ for (const instance of initialInstances) {
1282
+ try {
1283
+ const adapterInstalled = !!require2.resolve(`${import_js_controller_common.tools.appName.toLowerCase()}.${instance}`);
1284
+ if (adapterInstalled) {
1285
+ let otherInstanceExists = false;
1286
+ try {
1287
+ const res = await objects.getObjectViewAsync("system", "instance", {
1288
+ startkey: `system.adapter.${instance}`,
1289
+ endkey: `system.adapter.${instance}\u9999`
1290
+ });
1291
+ otherInstanceExists = !!res.rows.length;
1292
+ } catch {
1293
+ }
1294
+ if (!otherInstanceExists) {
1295
+ await install.createInstance(instance, {
1296
+ enabled: true,
1297
+ ignoreIfExists: true
1298
+ });
1299
+ }
1300
+ }
1301
+ } catch {
1302
+ }
1303
+ }
1304
+ await new Promise((resolve) => {
1305
+ const cert = new import_cliCert.CLICert({ ...commandOptions, callback: resolve });
1306
+ cert.create().catch((e) => console.error(`Cannot create certificate: ${e.message}`));
1307
+ });
1308
+ }
1309
+ const { Repo } = await import("../../lib/setup/setupRepo.js");
1310
+ const repo = new Repo({ objects, states });
1311
+ try {
1312
+ await repo.rename("default", "stable", import_utils.STABLE_REPO_URL);
1313
+ await repo.rename("latest", "beta", import_utils.BETA_REPO_URL);
1314
+ } catch (err) {
1315
+ console.warn(`Cannot rename: ${err.message}`);
1316
+ }
1317
+ try {
1318
+ await objects.delObjectAsync("system.adapter.js-controller");
1319
+ } catch {
1320
+ }
1321
+ try {
1322
+ const configFile = import_js_controller_common.tools.getConfigFileName();
1323
+ const configOrig = import_fs_extra.default.readJSONSync(configFile);
1324
+ const config = (0, import_deep_clone.default)(configOrig);
1325
+ config.objects.options = config.objects.options || {
1326
+ auth_pass: null,
1327
+ retry_max_delay: 5e3
1328
+ };
1329
+ if (config.objects.options.retry_max_delay === 15e3 || !config.objects.options.retry_max_delay) {
1330
+ config.objects.options.retry_max_delay = 5e3;
1331
+ }
1332
+ config.states.options = config.states.options || {
1333
+ auth_pass: null,
1334
+ retry_max_delay: 5e3
1335
+ };
1336
+ if (config.states.options.retry_max_delay === 15e3 || !config.states.options.retry_max_delay) {
1337
+ config.states.options.retry_max_delay = 5e3;
1338
+ }
1339
+ let migrated = "";
1340
+ if (config.states.type === "file") {
1341
+ config.states.type = "jsonl";
1342
+ const hasLocalStatesServer = await (0, import_js_controller_common.isLocalStatesDbServer)("file", config.states.host);
1343
+ if (hasLocalStatesServer) {
1344
+ console.log('States DB type migrated from "file" to "jsonl"');
1345
+ migrated += "States";
1346
+ }
1347
+ }
1348
+ if (config.objects.type === "file") {
1349
+ config.objects.type = "jsonl";
1350
+ const hasLocalObjectsServer = await (0, import_js_controller_common.isLocalObjectsDbServer)("file", config.objects.host);
1351
+ if (hasLocalObjectsServer) {
1352
+ console.log('Objects DB type migrated from "file" to "jsonl"');
1353
+ migrated += migrated ? " and Objects" : "Objects";
1354
+ }
1355
+ }
1356
+ if (migrated) {
1357
+ const { NotificationHandler } = await import("@iobroker/js-controller-common");
1358
+ const hostname = import_js_controller_common.tools.getHostName();
1359
+ const notificationSettings = {
1360
+ states,
1361
+ objects,
1362
+ log: console,
1363
+ logPrefix: "",
1364
+ host: hostname
1365
+ };
1366
+ const notificationHandler = new NotificationHandler(notificationSettings);
1367
+ try {
1368
+ const ioPackage = import_fs_extra.default.readJsonSync(import_node_path.default.join(import_js_controller_common.tools.getControllerDir(), "io-package.json"));
1369
+ await notificationHandler.addConfig(ioPackage.notifications);
1370
+ await notificationHandler.addMessage({
1371
+ scope: "system",
1372
+ category: "fileToJsonl",
1373
+ message: `Migrated: ${migrated}`,
1374
+ instance: `system.host.${hostname}`
1375
+ });
1376
+ notificationHandler.storeNotifications();
1377
+ } catch (e) {
1378
+ console.warn(`Could not add File-to-JSONL notification: ${e.message}`);
1379
+ }
1380
+ }
1381
+ if (!(0, import_node_util.isDeepStrictEqual)(config, configOrig)) {
1382
+ import_fs_extra.default.writeFileSync(configFile, JSON.stringify(config, null, 2));
1383
+ console.log("ioBroker configuration updated");
1384
+ }
1385
+ } catch (err) {
1386
+ console.log(`Could not update ioBroker configuration: ${err.message}`);
1387
+ }
1388
+ return void callback();
1389
+ }, "callback"),
1390
+ ignoreIfExist: isFirst,
1391
+ useRedis: isRedis
1392
+ });
1221
1393
  }
1394
+ __name(processCommandSetup, "processCommandSetup");
1222
1395
  // Annotate the CommonJS export names for ESM import in node:
1223
1396
  0 && (module.exports = {
1224
- Setup
1397
+ Setup,
1398
+ processCommandSetup
1225
1399
  });
1226
1400
  //# sourceMappingURL=setupSetup.js.map