@iobroker/js-controller-cli 6.0.6 → 6.0.7

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.
@@ -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 { isVersionIgnored } from '@/lib/setup/utils.js';\nimport path from 'node:path';\n\nexport interface CLIRepoOptions {\n objects: ObjectsRedisClient;\n states: StatesRedisClient;\n}\n\nexport interface RepoFlags {\n /** Also list not installed adapters */\n a?: boolean;\n all?: boolean;\n /** Only list updatable adapters */\n u?: boolean;\n updatable?: boolean;\n /** Force update even if hash hasn't changed */\n f?: boolean;\n force?: boolean;\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: 'http://download.iobroker.net/sources-dist.json',\n json: null\n },\n beta: {\n link: 'http://download.iobroker.net/sources-dist-latest.json',\n json: null\n }\n }\n },\n _id: 'system.repositories',\n type: 'config'\n };\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.getObjectAsync('system.config'));\n repoName = sysConfig!.common.activeRepo;\n }\n\n const oldRepos = systemRepos || (await this.objects.getObjectAsync('system.repositories'));\n if (!oldRepos?.native.repositories?.[repoName]) {\n console.log(`Error: repository \"${repoName}\" not found in the \"system.repositories`);\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: 10000 });\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.setObjectAsync('system.repositories', 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.getObjectAsync('system.config');\n const systemRepos = await this.objects.getObjectAsync('system.repositories');\n if (!systemConfig) {\n console.error('Error: Object \"system.config\" not found');\n } else if (!systemRepos) {\n console.error('Error: Object \"system.repositories\" not found');\n } else if (!systemRepos.native || !systemRepos.native.repositories) {\n console.error('Error: no repositories found in the \"system.config');\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 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 version is invalid\n if (\n sources[name].version !== installed[name].version &&\n !tools.upToDate(sources[name].version, installed[name].version)\n ) {\n // remove 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.setStateAsync(`${row.id}.info.updatesNumber`, { val: list.length, ack: true });\n await this.states.setStateAsync(`${row.id}.info.updatesList`, { val: listStr, ack: true });\n }\n }\n }\n }\n\n /**\n * Show current status of Repo on CLI\n */\n async showRepoStatus(): Promise<number> {\n try {\n const obj = await this.objects.getObjectAsync('system.repositories');\n if (!obj) {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n } else if (obj.native.repositories) {\n Object.keys(obj.native.repositories).forEach(r =>\n console.log(`${r.padEnd(14)}: ${obj.native.repositories[r].link}`)\n );\n\n const objCfg = await this.objects.getObjectAsync('system.config');\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 }\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.getObjectAsync('system.repositories');\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 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.setObjectAsync('system.repositories', 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.getObjectAsync('system.config');\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.getObjectAsync('system.repositories');\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.setObjectAsync('system.repositories', repoObj);\n }\n }\n }\n }\n\n /**\n * Set specific repo as active one\n *\n * @param repoName name of the respository to activate\n */\n async setActive(repoName: string): Promise<void> {\n const sysRepoObj = await this.objects.getObjectAsync('system.repositories');\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (!obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n } else {\n const confObj = await this.objects.getObjectAsync('system.config');\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 confObj.common.activeRepo.push(repoName);\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObjectAsync('system.config', confObj);\n }\n }\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.getObjectAsync('system.config'))!;\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.setObjectAsync('system.config', confObj);\n }\n }\n\n /**\n * Renames existing repository if old name and link matches, renaming will not be performed if an 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.getObjectAsync('system.config');\n repoObj = await this.objects.getObjectAsync('system.repositories');\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n if (repoObj && repoObj.native && repoObj.native.repositories) {\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.setObjectAsync('system.repositories', repoObj);\n console.log(`Renamed repository \"${oldName} to \"${newName}\"`);\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n // if we changed the name of the activeRepo, we should set newName as active repo\n if (\n sysConfigObj &&\n sysConfigObj.common &&\n ((typeof sysConfigObj.common.activeRepo === 'string' &&\n sysConfigObj.common.activeRepo === oldName) ||\n (Array.isArray(sysConfigObj.common.activeRepo) &&\n 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.setObjectAsync('system.config', sysConfigObj);\n } catch (err) {\n throw new Error(`Could not set \"${newName}\" as active repository: ${err.message}`);\n }\n }\n }\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;kCAAkC;AAClC,mBAAkB;AAClB,sBAAe;AAGf,mBAAiC;AACjC,uBAAiB;AAmBX,MAAO,KAAI;EACI;EACA;EACA;EACA;EAEjB,YAAY,SAAuB;AAC/B,QAAI,CAAC,SAAS,SAAS;AACnB,YAAM,IAAI,MAAM,uCAAuC;IAC3D;AACA,QAAI,CAAC,SAAS,QAAQ;AAClB,YAAM,IAAI,MAAM,sCAAsC;IAC1D;AAEA,UAAM,YAAY,gBAAAA,QAAG,aAAa,iBAAAC,QAAK,KAAK,kCAAM,iBAAgB,GAAI,iBAAiB,CAAC;AACxF,SAAK,oBAAoB,UAAU,OAAO;AAE1C,SAAK,UAAU,QAAQ;AACvB,SAAK,SAAS,QAAQ;AAEtB,SAAK,oBAAoB;MACrB,QAAQ;QACJ,MAAM;QACN,YAAY;;MAEhB,QAAQ;QACJ,cAAc;UACV,QAAQ;YACJ,MAAM;YACN,MAAM;;UAEV,MAAM;YACF,MAAM;YACN,MAAM;;;;MAIlB,KAAK;MACL,MAAM;;EAEd;EAUQ,MAAM,WACV,UACA,OACA,cACA,aAAuC;AAEvC,QAAI,CAAC,UAAU;AACX,YAAM,YAAY,gBAAiB,MAAM,KAAK,QAAQ,eAAe,eAAe;AACpF,iBAAW,UAAW,OAAO;IACjC;AAEA,UAAM,WAAW,eAAgB,MAAM,KAAK,QAAQ,eAAe,qBAAqB;AACxF,QAAI,CAAC,UAAU,OAAO,eAAe,WAAW;AAC5C,cAAQ,IAAI,sBAAsB,iDAAiD;AACnF,aAAO;IACX;AAEA,UAAM,YAAY,SAAS,OAAO,aAAa,UAAU;AACzD,UAAM,UAAU,UAAU,QAAQ,WAAW,YAAY;AACzD,QAAI;AAEJ,QACI,CAAC,SACD,SAAS,OAAO,aAAa,UAAU,QACvC,SAAS,OAAO,aAAa,UAAU,SACtC,UAAU,WAAW,SAAS,KAAK,UAAU,WAAW,UAAU,IACrE;AACE,UAAI;AACA,eAAO,UAAM,aAAAC,SAAM,EAAE,KAAK,SAAS,SAAS,IAAK,CAAE;MACvD,SAAS,GAAP;AACE,gBAAQ,MAAM,8CAA8C,aAAa,EAAE,SAAS;MACxF;AACA,UAAI,MAAM,QAAQ,SAAS,OAAO,aAAa,UAAU,SAAS,KAAK,KAAK,MAAM;AAC9E,eAAO,SAAS,OAAO,aAAa,UAAU;MAClD;IACJ;AAEA,QAAI;AAEJ,QAAI,UAAU,WAAW,SAAS,KAAK,UAAU,WAAW,UAAU,GAAG;AACrE,UAAI,CAAC,MAAM;AACP,YAAI;AACA,iBAAO,UAAM,aAAAA,SAAM,EAAE,KAAK,SAAS,SAAS,IAAK,CAAE;QACvD,SAAS,GAAP;AACE,kBAAQ,MAAM,8CAA8C,aAAa,EAAE,SAAS;QACxF;MACJ;AAEA,YAAM,QAAQ,GAAG,kCAAM,2BAA2B,QAAQ,cAAc,KAAK;AAC7E,UAAI;AACA,eAAO,UAAM,aAAAA,SAAM;UACf,KAAK;UACL,SAAS;UACT,SAAS,EAAE,cAAc,MAAK;SACjC;AACD,YAAI,KAAK,MAAM;AACX,iBAAO,KAAK;QAChB,OAAO;AACH,iBAAO;QACX;MACJ,SAAS,GAAP;AACE,gBAAQ,MAAM,yCAAyC,eAAe,EAAE,SAAS;AACjF,eAAO;MACX;IACJ,OAAO;AACH,UAAI,gBAAAF,QAAG,WAAW,SAAS,GAAG;AAC1B,YAAI;AACA,iBAAO,KAAK,MAAM,gBAAAA,QAAG,aAAa,SAAS,EAAE,SAAS,MAAM,CAAC;QACjE,SAAS,KAAP;AACE,kBAAQ,MAAM,qCAAqC,eAAe,IAAI,SAAS;QACnF;MACJ,OAAO;AACH,gBAAQ,MAAM,4BAA4B,YAAY;MAC1D;IACJ;AAEA,QAAI;AACJ,QAAI,MAAM;AACN,eAAS,OAAO,aAAa,UAAU,OAAO;AAC9C,gBAAU;IACd;AACA,QAAI,MAAM,MAAM;AACZ,eAAS,OAAO,aAAa,UAAU,OAAO,KAAK,KAAK;AACxD,gBAAU;IACd;AACA,QAAI,SAAS;AACT,eAAS,OAAO,eAAe,kCAAM,YAAW;AAChD,eAAS,KAAK,KAAK,IAAG;AACtB,YAAM,KAAK,QAAQ,eAAe,uBAAuB,QAAQ;IACrE;AAEA,WAAO,SAAS,OAAO,aAAa,UAAU;EAClD;EAQA,MAAM,SAAS,SAA4B,OAAgB;AAEvD,UAAM,eAAe,MAAM,KAAK,QAAQ,eAAe,eAAe;AACtE,UAAM,cAAc,MAAM,KAAK,QAAQ,eAAe,qBAAqB;AAC3E,QAAI,CAAC,cAAc;AACf,cAAQ,MAAM,yCAAyC;IAC3D,WAAW,CAAC,aAAa;AACrB,cAAQ,MAAM,+CAA+C;IACjE,WAAW,CAAC,YAAY,UAAU,CAAC,YAAY,OAAO,cAAc;AAChE,cAAQ,MAAM,oDAAoD;IACtE,OAAO;AACH,gBAAU,WAAW,aAAa,OAAO;AAEzC,UAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AACzB,kBAAU,CAAC,OAAO;MACtB;AAEA,cAAQ,IAAI,QAAQ,QAAQ,SAAS,IAAI,iBAAiB,iBAAiB,QAAQ,KAAK,IAAI,GAAG;AAE/F,YAAM,aAAa,CAAA;AAEnB,iBAAW,OAAO,SAAS;AACvB,cAAM,OAAO,YAAY,OAAO,aAAa;AAE7C,YAAI,MAAM;AACN,cAAI,OAAO,SAAS,UAAU;AAC1B,wBAAY,OAAO,aAAa,OAAO;cACnC,MAAM;cACN,MAAM;cACN,MAAM;;UAEd;AAEA,gBAAM,UAAU,MAAM,KAAK,WAAW,KAAK,MAAM,SAAS,MAAM,GAAG,cAAc,WAAW;AAC5F,qBAAW,OAAO,OAAO,YAAY,OAAO;QAChD,OAAO;AACH,kBAAQ,MACJ,0CAA0C,gBAAgB,OAAO,KAC7D,YAAY,OAAO,YAAY,EACjC,KAAK,IAAI,GAAG;QAEtB;MACJ;AAEA,UAAI;AAEA,cAAM,KAAK,WAAW,UAAU;MACpC,QAAE;MAEF;AAEA,aAAO,KAAK,eAAe,YAAY,KAAK;IAChD;EACJ;EAQQ,MAAM,eAAe,SAA8B,OAAgB;AACvE,UAAM,YAAY,kCAAM,iBAAgB;AACxC,UAAM,WAAW,OAAO,KAAK,OAAO,EAAE,KAAI;AAE1C,eAAW,QAAQ,UAAU;AACzB,UAAI,YAAY;AAChB,UAAI,OAAO,QAAQ,MAAM,aAAa,gBAAgB;AACtD,cAAQ,IAAI;AACZ,aAAO,KAAK,OAAO,KAAK,EAAE;AAE1B,UAAI,QAAQ,MAAM,SAAS;AACvB,gBAAQ,OAAO,QAAQ,MAAM;MACjC;AACA,aAAO,KAAK,OAAO,KAAK,KAAK,EAAE;AAE/B,UAAI,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC,UAAU,OAAO;AAC7C;MACJ;AAEA,UAAI,UAAU,OAAO,SAAS;AAC1B,gBAAQ,eAAe,UAAU,MAAM;AACvC,YAAI;AAEA,cACI,QAAQ,MAAM,YAAY,UAAU,MAAM,WAC1C,QAAQ,MAAM,WACd,CAAC,kCAAM,SAAS,QAAQ,MAAM,SAAS,UAAU,MAAM,OAAO,GAChE;AACE,wBAAY;AACZ,mBAAO,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE;AACpC,kBAAM,YAAY,UAAM,+BAAiB;cACrC,aAAa;cACb,SAAS,KAAK;cACd,SAAS,QAAQ,MAAM;aAC1B;AAED,oBAAQ,YAAY,eAAe;UACvC;QACJ,SAAS,GAAP;AACE,kBAAQ,MAAM,oCAAoC,UAAU,EAAE,SAAS;QAC3E;MACJ;AACA,WAAK,MAAM,aAAa,MAAM,MAAM,CAAC,WAAW;AAC5C;MACJ;AACA,cAAQ,IAAI,IAAI;IACpB;EACJ;EAOQ,MAAM,WAAW,SAA4B;AACjD,UAAM,YAAY,kCAAM,iBAAgB;AACxC,UAAM,OAAiB,CAAA;AAEvB,eAAW,QAAQ,OAAO,KAAK,OAAO,GAAG;AACrC,UAAI,UAAU,SAAS,UAAU,MAAM,WAAW,QAAQ,MAAM,SAAS;AACrE,YAAI;AAEA,cACI,QAAQ,MAAM,YAAY,UAAU,MAAM,WAC1C,CAAC,kCAAM,SAAS,QAAQ,MAAM,SAAS,UAAU,MAAM,OAAO,GAChE;AAEE,kBAAM,IAAI,KAAK,QAAQ,GAAG;AAC1B,iBAAK,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU,IAAI,CAAC,CAAC;UACrD;QACJ,SAAS,GAAP;AACE,kBAAQ,MAAM,oCAAoC,UAAU,EAAE,SAAS;QAC3E;MACJ;IACJ;AAEA,UAAM,OAAO,MAAM,KAAK,QAAQ,mBAAmB,UAAU,YAAY;MACrE,UAAU;MACV,QAAQ;KACX;AAED,QAAI,MAAM,MAAM,QAAQ;AACpB,YAAM,UAAU,KAAK,KAAK,IAAI;AAC9B,iBAAW,OAAO,KAAK,MAAM;AACzB,YAAI,KAAK,OAAO,SAAS,YAAY;AACjC,gBAAM,KAAK,OAAO,cAAc,GAAG,IAAI,yBAAyB,EAAE,KAAK,KAAK,QAAQ,KAAK,KAAI,CAAE;AAC/F,gBAAM,KAAK,OAAO,cAAc,GAAG,IAAI,uBAAuB,EAAE,KAAK,SAAS,KAAK,KAAI,CAAE;QAC7F;MACJ;IACJ;EACJ;EAKA,MAAM,iBAAc;AAChB,QAAI;AACA,YAAM,MAAM,MAAM,KAAK,QAAQ,eAAe,qBAAqB;AACnE,UAAI,CAAC,KAAK;AACN,gBAAQ,MAAM,eAAe;AAC7B,eAAO,uCAAW;MACtB,WAAW,IAAI,OAAO,cAAc;AAChC,eAAO,KAAK,IAAI,OAAO,YAAY,EAAE,QAAQ,OACzC,QAAQ,IAAI,GAAG,EAAE,OAAO,EAAE,MAAM,IAAI,OAAO,aAAa,GAAG,MAAM,CAAC;AAGtE,cAAM,SAAS,MAAM,KAAK,QAAQ,eAAe,eAAe;AAChE,YAAI,QAAQ,QAAQ;AAChB,cAAI,aAAa,OAAO,OAAO;AAC/B,cAAI,OAAO,eAAe,UAAU;AAChC,yBAAa,CAAC,UAAU;UAC5B;AACA,kBAAQ,IAAI;kBAAqB,WAAW,KAAK,IAAI,GAAG;QAC5D;MACJ,OAAO;AACH,gBAAQ,MAAM,eAAe;AAC7B,eAAO,uCAAW;MACtB;IACJ,SAAS,KAAP;AACE,cAAQ,MAAM,oBAAoB,KAAK;IAC3C;AACA,WAAO,uCAAW;EACtB;EAQA,MAAM,IAAI,UAAkB,SAAe;AACvC,UAAM,aAAa,MAAM,KAAK,QAAQ,eAAe,qBAAqB;AAC1E,UAAM,MAAM,cAAc,KAAK;AAE/B,QAAI,IAAI,OAAO,aAAa,WAAW;AACnC,YAAM,IAAI,MAAM,eAAe,yBAAyB,IAAI,OAAO,aAAa,UAAU,MAAM;IACpG,OAAO;AACH,UAAI,OAAO,aAAa,YAAY;QAChC,MAAM;QACN,MAAM;;AAEV,UAAI,OAAO,eAAe,kCAAM,YAAW;AAC3C,UAAI,KAAK,KAAK,IAAG;AACjB,YAAM,KAAK,QAAQ,eAAe,uBAAuB,GAAG;IAChE;EACJ;EAOA,MAAM,IAAI,UAAgB;AACtB,UAAM,MAAM,MAAM,KAAK,QAAQ,eAAe,eAAe;AAC7D,QACK,KAAK,OAAO,cACT,OAAO,IAAI,OAAO,eAAe,YACjC,IAAI,OAAO,eAAe,YAC7B,KAAK,OAAO,cAAc,MAAM,QAAQ,IAAI,OAAO,UAAU,KAAK,IAAI,OAAO,WAAW,SAAS,QAAQ,GAC5G;AACE,YAAM,IAAI,MAAM,oCAAoC,UAAU;IAClE,OAAO;AACH,YAAM,UAAU,MAAM,KAAK,QAAQ,eAAe,qBAAqB;AACvE,UAAI,SAAS;AACT,YAAI,CAAC,QAAQ,OAAO,aAAa,WAAW;AACxC,gBAAM,IAAI,MAAM,eAAe,sBAAsB;QACzD,OAAO;AACH,iBAAO,QAAQ,OAAO,aAAa;AACnC,kBAAQ,OAAO,eAAe,kCAAM,YAAW;AAC/C,kBAAQ,KAAK,KAAK,IAAG;AACrB,gBAAM,KAAK,QAAQ,eAAe,uBAAuB,OAAO;QACpE;MACJ;IACJ;EACJ;EAOA,MAAM,UAAU,UAAgB;AAC5B,UAAM,aAAa,MAAM,KAAK,QAAQ,eAAe,qBAAqB;AAC1E,UAAM,MAAM,cAAc,KAAK;AAE/B,QAAI,CAAC,IAAI,OAAO,aAAa,WAAW;AACpC,YAAM,IAAI,MAAM,eAAe,sBAAsB;IACzD,OAAO;AACH,YAAM,UAAU,MAAM,KAAK,QAAQ,eAAe,eAAe;AACjE,UAAI,OAAO,SAAS,OAAO,eAAe,UAAU;AAChD,gBAAQ,OAAO,aAAa,CAAC,QAAQ,OAAO,UAAU;MAC1D;AAEA,UAAI,WAAW,CAAC,QAAQ,OAAO,WAAW,SAAS,QAAQ,GAAG;AAC1D,gBAAQ,OAAO,WAAW,KAAK,QAAQ;AACvC,gBAAQ,OAAO,eAAe,kCAAM,YAAW;AAC/C,gBAAQ,KAAK,KAAK,IAAG;AACrB,cAAM,KAAK,QAAQ,eAAe,iBAAiB,OAAO;MAC9D;IACJ;EACJ;EAOA,MAAM,YAAY,UAAgB;AAC9B,UAAM,UAAW,MAAM,KAAK,QAAQ,eAAe,eAAe;AAClE,QAAI,OAAO,SAAS,OAAO,eAAe,UAAU;AAChD,cAAQ,OAAO,aAAa,CAAC,QAAQ,OAAO,UAAU;IAC1D;AAEA,UAAM,MAAM,QAAQ,OAAO,WAAW,QAAQ,QAAQ;AACtD,QAAI,QAAQ,IAAI;AACZ,cAAQ,OAAO,WAAW,OAAO,KAAK,CAAC;AACvC,cAAQ,OAAO,eAAe,kCAAM,YAAW;AAC/C,cAAQ,KAAK,KAAK,IAAG;AACrB,YAAM,KAAK,QAAQ,eAAe,iBAAiB,OAAO;IAC9D;EACJ;EASA,MAAM,OAAO,SAAiB,SAAiB,SAAe;AAC1D,QAAI;AACJ,QAAI;AACJ,QAAI;AACA,qBAAe,MAAM,KAAK,QAAQ,eAAe,eAAe;AAChE,gBAAU,MAAM,KAAK,QAAQ,eAAe,qBAAqB;IACrE,SAAS,KAAP;AACE,YAAM,IAAI,MAAM,gCAAgC,gBAAgB,aAAa,IAAI,SAAS;IAC9F;AAEA,QAAI,WAAW,QAAQ,UAAU,QAAQ,OAAO,cAAc;AAC1D,UACI,QAAQ,OAAO,aAAa,YAC5B,QAAQ,OAAO,aAAa,SAAS,SAAS,WAC9C,CAAC,QAAQ,OAAO,aAAa,UAC/B;AACE,gBAAQ,OAAO,aAAa,WAAW,QAAQ,OAAO,aAAa;AACnE,eAAO,QAAQ,OAAO,aAAa;AAEnC,YAAI;AACA,gBAAM,KAAK,QAAQ,eAAe,uBAAuB,OAAO;AAChE,kBAAQ,IAAI,uBAAuB,eAAe,UAAU;QAChE,SAAS,KAAP;AACE,gBAAM,IAAI,MAAM,gCAAgC,gBAAgB,aAAa,IAAI,SAAS;QAC9F;AAGA,YACI,gBACA,aAAa,WACX,OAAO,aAAa,OAAO,eAAe,YACxC,aAAa,OAAO,eAAe,WAClC,MAAM,QAAQ,aAAa,OAAO,UAAU,KACzC,aAAa,OAAO,WAAW,SAAS,OAAO,IACzD;AACE,cAAI,OAAO,aAAa,OAAO,eAAe,UAAU;AACpD,yBAAa,OAAO,aAAa,CAAC,aAAa,OAAO,UAAU;UACpE;AACA,gBAAM,MAAM,aAAa,OAAO,WAAW,QAAQ,OAAO;AAC1D,uBAAa,OAAO,WAAW,OAAO,KAAK,GAAG,OAAO;AAErD,cAAI;AACA,kBAAM,KAAK,QAAQ,eAAe,iBAAiB,YAAY;UACnE,SAAS,KAAP;AACE,kBAAM,IAAI,MAAM,kBAAkB,kCAAkC,IAAI,SAAS;UACrF;QACJ;MACJ;IACJ;EACJ;;",
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 { isVersionIgnored } from '@/lib/setup/utils.js';\nimport path from 'node:path';\n\nexport interface CLIRepoOptions {\n objects: ObjectsRedisClient;\n states: StatesRedisClient;\n}\n\nexport interface RepoFlags {\n /** Also list not installed adapters */\n a?: boolean;\n all?: boolean;\n /** Only list updatable adapters */\n u?: boolean;\n updatable?: boolean;\n /** Force update even if hash hasn't changed */\n f?: boolean;\n force?: boolean;\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: 'http://download.iobroker.net/sources-dist.json',\n json: null\n },\n beta: {\n link: 'http://download.iobroker.net/sources-dist-latest.json',\n json: null\n }\n }\n },\n _id: 'system.repositories',\n type: 'config'\n };\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.getObjectAsync('system.config'));\n repoName = sysConfig!.common.activeRepo;\n }\n\n const oldRepos = systemRepos || (await this.objects.getObjectAsync('system.repositories'));\n if (!oldRepos?.native.repositories?.[repoName]) {\n console.log(`Error: repository \"${repoName}\" not found in the \"system.repositories`);\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: 10000 });\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.setObjectAsync('system.repositories', 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');\n const systemRepos = await this.objects.getObject('system.repositories');\n if (!systemConfig) {\n console.error('Error: Object \"system.config\" not found');\n } else if (!systemRepos) {\n console.error('Error: Object \"system.repositories\" not found');\n } else if (!systemRepos.native || !systemRepos.native.repositories) {\n console.error('Error: no repositories found in the \"system.config');\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 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 version is invalid\n if (\n sources[name].version !== installed[name].version &&\n !tools.upToDate(sources[name].version, installed[name].version)\n ) {\n // remove 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.setStateAsync(`${row.id}.info.updatesNumber`, { val: list.length, ack: true });\n await this.states.setStateAsync(`${row.id}.info.updatesList`, { val: listStr, ack: true });\n }\n }\n }\n }\n\n /**\n * Show current status of Repo on CLI\n */\n async showRepoStatus(): Promise<number> {\n try {\n const obj = await this.objects.getObject('system.repositories');\n const objCfg = await this.objects.getObject('system.config');\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.getObjectAsync('system.repositories');\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 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.setObjectAsync('system.repositories', 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.getObjectAsync('system.config');\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.getObjectAsync('system.repositories');\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.setObjectAsync('system.repositories', repoObj);\n }\n }\n }\n }\n\n /**\n * Set specific repo as active one\n *\n * @param repoName name of the respository to activate\n */\n async setActive(repoName: string): Promise<void> {\n const sysRepoObj = await this.objects.getObjectAsync('system.repositories');\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (!obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n } else {\n const confObj = await this.objects.getObjectAsync('system.config');\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 confObj.common.activeRepo.push(repoName);\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObjectAsync('system.config', confObj);\n }\n }\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.getObjectAsync('system.config'))!;\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.setObjectAsync('system.config', confObj);\n }\n }\n\n /**\n * Renames existing repository if old name and link matches, renaming will not be performed if an 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.getObjectAsync('system.config');\n repoObj = await this.objects.getObjectAsync('system.repositories');\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n if (repoObj && repoObj.native && repoObj.native.repositories) {\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.setObjectAsync('system.repositories', repoObj);\n console.log(`Renamed repository \"${oldName} to \"${newName}\"`);\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n // if we changed the name of the activeRepo, we should set newName as active repo\n if (\n sysConfigObj &&\n sysConfigObj.common &&\n ((typeof sysConfigObj.common.activeRepo === 'string' &&\n sysConfigObj.common.activeRepo === oldName) ||\n (Array.isArray(sysConfigObj.common.activeRepo) &&\n 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.setObjectAsync('system.config', sysConfigObj);\n } catch (err) {\n throw new Error(`Could not set \"${newName}\" as active repository: ${err.message}`);\n }\n }\n }\n }\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;kCAAkC;AAClC,mBAAkB;AAClB,sBAAe;AAGf,mBAAiC;AACjC,uBAAiB;AAmBX,MAAO,KAAI;EACI;EACA;EACA;EACA;EAEjB,YAAY,SAAuB;AAC/B,QAAI,CAAC,SAAS,SAAS;AACnB,YAAM,IAAI,MAAM,uCAAuC;IAC3D;AACA,QAAI,CAAC,SAAS,QAAQ;AAClB,YAAM,IAAI,MAAM,sCAAsC;IAC1D;AAEA,UAAM,YAAY,gBAAAA,QAAG,aAAa,iBAAAC,QAAK,KAAK,kCAAM,iBAAgB,GAAI,iBAAiB,CAAC;AACxF,SAAK,oBAAoB,UAAU,OAAO;AAE1C,SAAK,UAAU,QAAQ;AACvB,SAAK,SAAS,QAAQ;AAEtB,SAAK,oBAAoB;MACrB,QAAQ;QACJ,MAAM;QACN,YAAY;;MAEhB,QAAQ;QACJ,cAAc;UACV,QAAQ;YACJ,MAAM;YACN,MAAM;;UAEV,MAAM;YACF,MAAM;YACN,MAAM;;;;MAIlB,KAAK;MACL,MAAM;;EAEd;EAUQ,MAAM,WACV,UACA,OACA,cACA,aAAuC;AAEvC,QAAI,CAAC,UAAU;AACX,YAAM,YAAY,gBAAiB,MAAM,KAAK,QAAQ,eAAe,eAAe;AACpF,iBAAW,UAAW,OAAO;IACjC;AAEA,UAAM,WAAW,eAAgB,MAAM,KAAK,QAAQ,eAAe,qBAAqB;AACxF,QAAI,CAAC,UAAU,OAAO,eAAe,WAAW;AAC5C,cAAQ,IAAI,sBAAsB,iDAAiD;AACnF,aAAO;IACX;AAEA,UAAM,YAAY,SAAS,OAAO,aAAa,UAAU;AACzD,UAAM,UAAU,UAAU,QAAQ,WAAW,YAAY;AACzD,QAAI;AAEJ,QACI,CAAC,SACD,SAAS,OAAO,aAAa,UAAU,QACvC,SAAS,OAAO,aAAa,UAAU,SACtC,UAAU,WAAW,SAAS,KAAK,UAAU,WAAW,UAAU,IACrE;AACE,UAAI;AACA,eAAO,UAAM,aAAAC,SAAM,EAAE,KAAK,SAAS,SAAS,IAAK,CAAE;MACvD,SAAS,GAAP;AACE,gBAAQ,MAAM,8CAA8C,aAAa,EAAE,SAAS;MACxF;AACA,UAAI,MAAM,QAAQ,SAAS,OAAO,aAAa,UAAU,SAAS,KAAK,KAAK,MAAM;AAC9E,eAAO,SAAS,OAAO,aAAa,UAAU;MAClD;IACJ;AAEA,QAAI;AAEJ,QAAI,UAAU,WAAW,SAAS,KAAK,UAAU,WAAW,UAAU,GAAG;AACrE,UAAI,CAAC,MAAM;AACP,YAAI;AACA,iBAAO,UAAM,aAAAA,SAAM,EAAE,KAAK,SAAS,SAAS,IAAK,CAAE;QACvD,SAAS,GAAP;AACE,kBAAQ,MAAM,8CAA8C,aAAa,EAAE,SAAS;QACxF;MACJ;AAEA,YAAM,QAAQ,GAAG,kCAAM,2BAA2B,QAAQ,cAAc,KAAK;AAC7E,UAAI;AACA,eAAO,UAAM,aAAAA,SAAM;UACf,KAAK;UACL,SAAS;UACT,SAAS,EAAE,cAAc,MAAK;SACjC;AACD,YAAI,KAAK,MAAM;AACX,iBAAO,KAAK;QAChB,OAAO;AACH,iBAAO;QACX;MACJ,SAAS,GAAP;AACE,gBAAQ,MAAM,yCAAyC,eAAe,EAAE,SAAS;AACjF,eAAO;MACX;IACJ,OAAO;AACH,UAAI,gBAAAF,QAAG,WAAW,SAAS,GAAG;AAC1B,YAAI;AACA,iBAAO,KAAK,MAAM,gBAAAA,QAAG,aAAa,SAAS,EAAE,SAAS,MAAM,CAAC;QACjE,SAAS,KAAP;AACE,kBAAQ,MAAM,qCAAqC,eAAe,IAAI,SAAS;QACnF;MACJ,OAAO;AACH,gBAAQ,MAAM,4BAA4B,YAAY;MAC1D;IACJ;AAEA,QAAI;AACJ,QAAI,MAAM;AACN,eAAS,OAAO,aAAa,UAAU,OAAO;AAC9C,gBAAU;IACd;AACA,QAAI,MAAM,MAAM;AACZ,eAAS,OAAO,aAAa,UAAU,OAAO,KAAK,KAAK;AACxD,gBAAU;IACd;AACA,QAAI,SAAS;AACT,eAAS,OAAO,eAAe,kCAAM,YAAW;AAChD,eAAS,KAAK,KAAK,IAAG;AACtB,YAAM,KAAK,QAAQ,eAAe,uBAAuB,QAAQ;IACrE;AAEA,WAAO,SAAS,OAAO,aAAa,UAAU;EAClD;EAQA,MAAM,SAAS,SAA4B,OAAgB;AAEvD,UAAM,eAAe,MAAM,KAAK,QAAQ,UAAU,eAAe;AACjE,UAAM,cAAc,MAAM,KAAK,QAAQ,UAAU,qBAAqB;AACtE,QAAI,CAAC,cAAc;AACf,cAAQ,MAAM,yCAAyC;IAC3D,WAAW,CAAC,aAAa;AACrB,cAAQ,MAAM,+CAA+C;IACjE,WAAW,CAAC,YAAY,UAAU,CAAC,YAAY,OAAO,cAAc;AAChE,cAAQ,MAAM,oDAAoD;IACtE,OAAO;AACH,gBAAU,WAAW,aAAa,OAAO;AAEzC,UAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AACzB,kBAAU,CAAC,OAAO;MACtB;AAEA,cAAQ,IAAI,QAAQ,QAAQ,SAAS,IAAI,iBAAiB,iBAAiB,QAAQ,KAAK,IAAI,GAAG;AAE/F,YAAM,aAAa,CAAA;AAEnB,iBAAW,OAAO,SAAS;AACvB,cAAM,OAAO,YAAY,OAAO,aAAa;AAE7C,YAAI,MAAM;AACN,cAAI,OAAO,SAAS,UAAU;AAC1B,wBAAY,OAAO,aAAa,OAAO;cACnC,MAAM;cACN,MAAM;cACN,MAAM;;UAEd;AAEA,gBAAM,UAAU,MAAM,KAAK,WAAW,KAAK,MAAM,SAAS,MAAM,GAAG,cAAc,WAAW;AAC5F,qBAAW,OAAO,OAAO,YAAY,OAAO;QAChD,OAAO;AACH,kBAAQ,MACJ,0CAA0C,gBAAgB,OAAO,KAC7D,YAAY,OAAO,YAAY,EACjC,KAAK,IAAI,GAAG;QAEtB;MACJ;AAEA,UAAI;AAEA,cAAM,KAAK,WAAW,UAAU;MACpC,QAAE;MAEF;AAEA,aAAO,KAAK,eAAe,YAAY,KAAK;IAChD;EACJ;EAQQ,MAAM,eAAe,SAA8B,OAAgB;AACvE,UAAM,YAAY,kCAAM,iBAAgB;AACxC,UAAM,WAAW,OAAO,KAAK,OAAO,EAAE,KAAI;AAE1C,eAAW,QAAQ,UAAU;AACzB,UAAI,YAAY;AAChB,UAAI,OAAO,QAAQ,MAAM,aAAa,gBAAgB;AACtD,cAAQ,IAAI;AACZ,aAAO,KAAK,OAAO,KAAK,EAAE;AAE1B,UAAI,QAAQ,MAAM,SAAS;AACvB,gBAAQ,OAAO,QAAQ,MAAM;MACjC;AACA,aAAO,KAAK,OAAO,KAAK,KAAK,EAAE;AAE/B,UAAI,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC,UAAU,OAAO;AAC7C;MACJ;AAEA,UAAI,UAAU,OAAO,SAAS;AAC1B,gBAAQ,eAAe,UAAU,MAAM;AACvC,YAAI;AAEA,cACI,QAAQ,MAAM,YAAY,UAAU,MAAM,WAC1C,QAAQ,MAAM,WACd,CAAC,kCAAM,SAAS,QAAQ,MAAM,SAAS,UAAU,MAAM,OAAO,GAChE;AACE,wBAAY;AACZ,mBAAO,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE;AACpC,kBAAM,YAAY,UAAM,+BAAiB;cACrC,aAAa;cACb,SAAS,KAAK;cACd,SAAS,QAAQ,MAAM;aAC1B;AAED,oBAAQ,YAAY,eAAe;UACvC;QACJ,SAAS,GAAP;AACE,kBAAQ,MAAM,oCAAoC,UAAU,EAAE,SAAS;QAC3E;MACJ;AACA,WAAK,MAAM,aAAa,MAAM,MAAM,CAAC,WAAW;AAC5C;MACJ;AACA,cAAQ,IAAI,IAAI;IACpB;EACJ;EAOQ,MAAM,WAAW,SAA4B;AACjD,UAAM,YAAY,kCAAM,iBAAgB;AACxC,UAAM,OAAiB,CAAA;AAEvB,eAAW,QAAQ,OAAO,KAAK,OAAO,GAAG;AACrC,UAAI,UAAU,SAAS,UAAU,MAAM,WAAW,QAAQ,MAAM,SAAS;AACrE,YAAI;AAEA,cACI,QAAQ,MAAM,YAAY,UAAU,MAAM,WAC1C,CAAC,kCAAM,SAAS,QAAQ,MAAM,SAAS,UAAU,MAAM,OAAO,GAChE;AAEE,kBAAM,IAAI,KAAK,QAAQ,GAAG;AAC1B,iBAAK,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU,IAAI,CAAC,CAAC;UACrD;QACJ,SAAS,GAAP;AACE,kBAAQ,MAAM,oCAAoC,UAAU,EAAE,SAAS;QAC3E;MACJ;IACJ;AAEA,UAAM,OAAO,MAAM,KAAK,QAAQ,mBAAmB,UAAU,YAAY;MACrE,UAAU;MACV,QAAQ;KACX;AAED,QAAI,MAAM,MAAM,QAAQ;AACpB,YAAM,UAAU,KAAK,KAAK,IAAI;AAC9B,iBAAW,OAAO,KAAK,MAAM;AACzB,YAAI,KAAK,OAAO,SAAS,YAAY;AACjC,gBAAM,KAAK,OAAO,cAAc,GAAG,IAAI,yBAAyB,EAAE,KAAK,KAAK,QAAQ,KAAK,KAAI,CAAE;AAC/F,gBAAM,KAAK,OAAO,cAAc,GAAG,IAAI,uBAAuB,EAAE,KAAK,SAAS,KAAK,KAAI,CAAE;QAC7F;MACJ;IACJ;EACJ;EAKA,MAAM,iBAAc;AAChB,QAAI;AACA,YAAM,MAAM,MAAM,KAAK,QAAQ,UAAU,qBAAqB;AAC9D,YAAM,SAAS,MAAM,KAAK,QAAQ,UAAU,eAAe;AAE3D,UAAI,CAAC,KAAK;AACN,gBAAQ,MAAM,eAAe;AAC7B,eAAO,uCAAW;MACtB,WAAW,IAAI,OAAO,cAAc;AAChC,gBAAQ,MACJ,OAAO,QAAQ,IAAI,OAAO,YAAY,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAK;AACzD,iBAAO;YACH,MAAM;YACN,KAAK,MAAM;YACX,gBAAgB,QAAQ,OAAO,oBAAoB,aAAa,QAAQ;;QAEhF,CAAC,CAAC;AAGN,YAAI,QAAQ,QAAQ;AAChB,cAAI,aAAa,OAAO,OAAO;AAC/B,cAAI,OAAO,eAAe,UAAU;AAChC,yBAAa,CAAC,UAAU;UAC5B;AACA,kBAAQ,IAAI;kBAAqB,WAAW,KAAK,IAAI,GAAG;AACxD,kBAAQ,IAAI,mBAAmB,OAAO,OAAO,oBAAoB,iBAAiB,QAAQ;QAC9F;MACJ,OAAO;AACH,gBAAQ,MAAM,eAAe;AAC7B,eAAO,uCAAW;MACtB;IACJ,SAAS,KAAP;AACE,cAAQ,MAAM,oBAAoB,KAAK;IAC3C;AACA,WAAO,uCAAW;EACtB;EAQA,MAAM,IAAI,UAAkB,SAAe;AACvC,UAAM,aAAa,MAAM,KAAK,QAAQ,eAAe,qBAAqB;AAC1E,UAAM,MAAM,cAAc,KAAK;AAE/B,QAAI,IAAI,OAAO,aAAa,WAAW;AACnC,YAAM,IAAI,MAAM,eAAe,yBAAyB,IAAI,OAAO,aAAa,UAAU,MAAM;IACpG,OAAO;AACH,UAAI,OAAO,aAAa,YAAY;QAChC,MAAM;QACN,MAAM;;AAEV,UAAI,OAAO,eAAe,kCAAM,YAAW;AAC3C,UAAI,KAAK,KAAK,IAAG;AACjB,YAAM,KAAK,QAAQ,eAAe,uBAAuB,GAAG;IAChE;EACJ;EAOA,MAAM,IAAI,UAAgB;AACtB,UAAM,MAAM,MAAM,KAAK,QAAQ,eAAe,eAAe;AAC7D,QACK,KAAK,OAAO,cACT,OAAO,IAAI,OAAO,eAAe,YACjC,IAAI,OAAO,eAAe,YAC7B,KAAK,OAAO,cAAc,MAAM,QAAQ,IAAI,OAAO,UAAU,KAAK,IAAI,OAAO,WAAW,SAAS,QAAQ,GAC5G;AACE,YAAM,IAAI,MAAM,oCAAoC,UAAU;IAClE,OAAO;AACH,YAAM,UAAU,MAAM,KAAK,QAAQ,eAAe,qBAAqB;AACvE,UAAI,SAAS;AACT,YAAI,CAAC,QAAQ,OAAO,aAAa,WAAW;AACxC,gBAAM,IAAI,MAAM,eAAe,sBAAsB;QACzD,OAAO;AACH,iBAAO,QAAQ,OAAO,aAAa;AACnC,kBAAQ,OAAO,eAAe,kCAAM,YAAW;AAC/C,kBAAQ,KAAK,KAAK,IAAG;AACrB,gBAAM,KAAK,QAAQ,eAAe,uBAAuB,OAAO;QACpE;MACJ;IACJ;EACJ;EAOA,MAAM,UAAU,UAAgB;AAC5B,UAAM,aAAa,MAAM,KAAK,QAAQ,eAAe,qBAAqB;AAC1E,UAAM,MAAM,cAAc,KAAK;AAE/B,QAAI,CAAC,IAAI,OAAO,aAAa,WAAW;AACpC,YAAM,IAAI,MAAM,eAAe,sBAAsB;IACzD,OAAO;AACH,YAAM,UAAU,MAAM,KAAK,QAAQ,eAAe,eAAe;AACjE,UAAI,OAAO,SAAS,OAAO,eAAe,UAAU;AAChD,gBAAQ,OAAO,aAAa,CAAC,QAAQ,OAAO,UAAU;MAC1D;AAEA,UAAI,WAAW,CAAC,QAAQ,OAAO,WAAW,SAAS,QAAQ,GAAG;AAC1D,gBAAQ,OAAO,WAAW,KAAK,QAAQ;AACvC,gBAAQ,OAAO,eAAe,kCAAM,YAAW;AAC/C,gBAAQ,KAAK,KAAK,IAAG;AACrB,cAAM,KAAK,QAAQ,eAAe,iBAAiB,OAAO;MAC9D;IACJ;EACJ;EAOA,MAAM,YAAY,UAAgB;AAC9B,UAAM,UAAW,MAAM,KAAK,QAAQ,eAAe,eAAe;AAClE,QAAI,OAAO,SAAS,OAAO,eAAe,UAAU;AAChD,cAAQ,OAAO,aAAa,CAAC,QAAQ,OAAO,UAAU;IAC1D;AAEA,UAAM,MAAM,QAAQ,OAAO,WAAW,QAAQ,QAAQ;AACtD,QAAI,QAAQ,IAAI;AACZ,cAAQ,OAAO,WAAW,OAAO,KAAK,CAAC;AACvC,cAAQ,OAAO,eAAe,kCAAM,YAAW;AAC/C,cAAQ,KAAK,KAAK,IAAG;AACrB,YAAM,KAAK,QAAQ,eAAe,iBAAiB,OAAO;IAC9D;EACJ;EASA,MAAM,OAAO,SAAiB,SAAiB,SAAe;AAC1D,QAAI;AACJ,QAAI;AACJ,QAAI;AACA,qBAAe,MAAM,KAAK,QAAQ,eAAe,eAAe;AAChE,gBAAU,MAAM,KAAK,QAAQ,eAAe,qBAAqB;IACrE,SAAS,KAAP;AACE,YAAM,IAAI,MAAM,gCAAgC,gBAAgB,aAAa,IAAI,SAAS;IAC9F;AAEA,QAAI,WAAW,QAAQ,UAAU,QAAQ,OAAO,cAAc;AAC1D,UACI,QAAQ,OAAO,aAAa,YAC5B,QAAQ,OAAO,aAAa,SAAS,SAAS,WAC9C,CAAC,QAAQ,OAAO,aAAa,UAC/B;AACE,gBAAQ,OAAO,aAAa,WAAW,QAAQ,OAAO,aAAa;AACnE,eAAO,QAAQ,OAAO,aAAa;AAEnC,YAAI;AACA,gBAAM,KAAK,QAAQ,eAAe,uBAAuB,OAAO;AAChE,kBAAQ,IAAI,uBAAuB,eAAe,UAAU;QAChE,SAAS,KAAP;AACE,gBAAM,IAAI,MAAM,gCAAgC,gBAAgB,aAAa,IAAI,SAAS;QAC9F;AAGA,YACI,gBACA,aAAa,WACX,OAAO,aAAa,OAAO,eAAe,YACxC,aAAa,OAAO,eAAe,WAClC,MAAM,QAAQ,aAAa,OAAO,UAAU,KACzC,aAAa,OAAO,WAAW,SAAS,OAAO,IACzD;AACE,cAAI,OAAO,aAAa,OAAO,eAAe,UAAU;AACpD,yBAAa,OAAO,aAAa,CAAC,aAAa,OAAO,UAAU;UACpE;AACA,gBAAM,MAAM,aAAa,OAAO,WAAW,QAAQ,OAAO;AAC1D,uBAAa,OAAO,WAAW,OAAO,KAAK,GAAG,OAAO;AAErD,cAAI;AACA,kBAAM,KAAK,QAAQ,eAAe,iBAAiB,YAAY;UACnE,SAAS,KAAP;AACE,kBAAM,IAAI,MAAM,kBAAkB,kCAAkC,IAAI,SAAS;UACrF;QACJ;MACJ;IACJ;EACJ;;",
6
6
  "names": ["fs", "path", "axios"]
7
7
  }
@@ -363,7 +363,7 @@ class Users {
363
363
  import_prompt.default.get(schema, (err, result) => {
364
364
  this.checkPassword(result.username, result.password, (err2, res) => {
365
365
  if (err2 || !res) {
366
- return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${result.username}" does not match${err2 ? ": " + err2 : ""}`);
366
+ return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${result.username}" does not match${err2 ? `: ${err2.message}` : ""}`);
367
367
  } else {
368
368
  return import_js_controller_common.tools.maybeCallbackWithError(callback, null);
369
369
  }
@@ -386,7 +386,7 @@ class Users {
386
386
  import_prompt.default.get(schema, (err, result) => {
387
387
  this.checkPassword(username, result.password, (err2, res) => {
388
388
  if (err2 || !res) {
389
- return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${username}" does not matched${err2 ? ": " + err2 : ""}`);
389
+ return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${username}" does not match${err2 ? `: ${err2.message}` : ""}`);
390
390
  } else {
391
391
  return import_js_controller_common.tools.maybeCallbackWithError(callback, null);
392
392
  }
@@ -395,7 +395,7 @@ class Users {
395
395
  } else {
396
396
  this.checkPassword(username, password2, (err, res) => {
397
397
  if (err || !res) {
398
- return import_js_controller_common.tools.maybeCallbackWithError(callback, 'Password for user "' + username + '" does not matched' + (err ? ": " + err : ""));
398
+ return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${username}" does not match${err ? `: ${err.message}` : ""}`);
399
399
  } else {
400
400
  return import_js_controller_common.tools.maybeCallbackWithError(callback, null);
401
401
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/setup/setupUsers.ts"],
4
- "sourcesContent": ["import { password, tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { ProcessExitCallback } from '../_Types.js';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport prompt from 'prompt';\n\nexport interface CLIUsersOptions {\n processExit: ProcessExitCallback;\n objects: ObjectsRedisClient;\n}\n\nexport class Users {\n private readonly objects: ObjectsRedisClient;\n private readonly processExit: ProcessExitCallback;\n\n constructor(options: CLIUsersOptions) {\n if (!options.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options.processExit) {\n throw new Error('Invalid arguments: processExit is missing');\n }\n\n this.objects = options.objects;\n this.processExit = options.processExit;\n }\n\n /**\n * Adds new user to system\n *\n * @param username name of the user which will be added\n * @param pw password\n * @param callback\n */\n addUser(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n // user id's should be case insensitive\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (obj) {\n return tools.maybeCallbackWithError(callback, 'User yet exists');\n } else {\n this.objects.setObject(\n `system.user.${_user}`,\n {\n type: 'user',\n common: {\n name: username,\n enabled: true,\n password: ''\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n },\n err => {\n if (!err) {\n this.setPassword(username, pw, callback);\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n });\n }\n\n /**\n * Checks if user exists\n *\n * @param username name of the user to check existence of\n */\n async isUser(username: string): Promise<boolean> {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n let isExisting = false;\n try {\n isExisting = await this.objects.objectExists(`system.user.${_user}`);\n } catch {\n // ignore\n }\n\n return isExisting;\n }\n\n /**\n * Set password for specific user\n *\n * @param username name of the user to set password for\n * @param pw password\n * @param callback\n */\n setPassword(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).hash(null, null, (err, res) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n obj.common.password = res ?? '';\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(`system.user.${_user}`, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n });\n });\n }\n\n /**\n * Checks if password is correct for given user\n *\n * @param username name of the user to check password\n * @param pw password\n * @param callback\n */\n checkPassword(username: string, pw: string, callback: (err?: Error | null, isOk?: boolean) => void): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).check(obj.common.password, (err, res) => {\n return tools.maybeCallbackWithError(callback, err, res);\n });\n });\n }\n\n /**\n * Deletes user from system\n *\n * @param username name of the user to delete\n * @param callback\n */\n delUser(username: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"userdel user\"');\n }\n\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n } else {\n if (obj.common.dontDelete) {\n return tools.maybeCallbackWithError(callback, 'Cannot delete user, while is system user');\n } else {\n this.objects.delObject('system.user.' + _user, err => {\n // Remove this user from all groups\n if (!err) {\n this.objects.getObjectList(\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err, groups) => {\n if (!groups) {\n return tools.maybeCallback(callback);\n }\n\n let count = 0;\n for (let i = 0; i < groups.rows.length; i++) {\n if (groups.rows[i].value.type !== 'group') {\n continue;\n }\n // find all groups\n if (\n groups.rows[i].value.common.members &&\n groups.rows[i].value.common.members.indexOf('system.user.' + _user) !== -1\n ) {\n const pos = groups.rows[i].value.common.members.indexOf(\n 'system.user.' + _user\n );\n groups.rows[i].value.common.members.splice(pos, 1);\n count++;\n groups.rows[i].value.from = 'system.host.' + tools.getHostName() + '.cli';\n groups.rows[i].value.ts = Date.now();\n this.objects.setObject(\n groups.rows[i].value._id,\n groups.rows[i].value,\n err => {\n if (!--count) {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n }\n if (!count) {\n return tools.maybeCallback(callback);\n }\n }\n );\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n }\n }\n });\n }\n\n /**\n * Adds user to given group\n *\n * @param username user which will be added to the group\n * @param groupName name of the group where the user will be added to\n * @param callback\n */\n addUserToGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n let _user = username.replace(/\\s/g, '_').toLowerCase();\n if (!groupName.startsWith('system.group.')) {\n groupName = `system.group.${groupName}`;\n }\n if (!_user.startsWith('system.user.')) {\n _user = `system.user.${_user}`;\n }\n\n this.objects.getObject(_user, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n this.objects.getObject(groupName, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exist');\n }\n obj.common = obj.common || {};\n obj.common.members = obj.common.members || [];\n\n if (obj.common.members.indexOf(_user) === -1) {\n obj.common.members.push(_user);\n obj.from = 'system.host.' + tools.getHostName() + '.cli';\n obj.ts = Date.now();\n this.objects.setObject(groupName, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n } else {\n return tools.maybeCallback(callback);\n }\n });\n });\n }\n\n /**\n * Add user via CLI prompt\n *\n * @param username user which sohuld be created\n * @param groupName default group for the new user\n * @param password user password\n * @param callback\n */\n addUserPrompt(username: string, groupName: string, password: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"adduser newUser\"');\n }\n\n // Check group\n if (groupName.substring(0, 13) !== 'system.group.') {\n groupName = `system.group.${groupName}`;\n }\n\n this.objects.getObject(groupName, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Unknown group: ${groupName}`);\n }\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n console.log('Passwords are not identical!');\n return void this.processExit(EXIT_CODES.INVALID_PASSWORD);\n }\n // @ts-expect-error external types problem?\n this.addUser(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n } else {\n this.addUser(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n }\n });\n }\n\n /**\n * Set password of user\n *\n * @param username name of the user to set password for\n * @param password password of user\n * @param callback\n */\n async setUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): Promise<void> {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"passwd username\"');\n }\n\n const isExisting = await this.isUser(username);\n if (!isExisting) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" does not exist.`);\n } else {\n // Check group\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n return tools.maybeCallbackWithError(callback, 'Passwords are not identical!');\n }\n // @ts-expect-error external types problem?\n this.setPassword(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, 'No password entered!');\n }\n });\n } else {\n this.setPassword(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n }\n }\n\n /**\n * Enable user\n *\n * @param username name of the user which will be activated\n * @param enable true if it should be enabled else false\n * @param callback\n */\n enableUser(username: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"enable username\"');\n }\n if (username.startsWith('system.user.')) {\n username = username.substring('system.user.'.length);\n }\n\n if (username === 'admin' && !enable) {\n return tools.maybeCallbackWithError(callback, 'User admin cannot be disabled');\n }\n\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Check if user password is valid\n *\n * @param username name of the user to check password for\n * @param password password to check\n * @param callback\n */\n checkUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): void {\n let schema;\n if (!username && !password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n username: {\n description: 'Enter username to check password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: false\n },\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n this.checkPassword(result.username as string, result.password as string, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${result.username as string}\" does not match${err ? ': ' + err : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n // @ts-expect-error external types problem?\n this.checkPassword(username, result.password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${username}\" does not matched${err ? ': ' + err : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else {\n this.checkPassword(username, password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n 'Password for user \"' + username + '\" does not matched' + (err ? ': ' + err : '')\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n }\n }\n\n /**\n * Get user object\n *\n * @param username name of the user to get object of\n * @param callback\n */\n getUser(username: string, callback: (err?: Error | null, enabled?: boolean) => void): void {\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled);\n }\n });\n }\n\n /**\n * Get group object\n *\n * @param group groupname\n * @param callback\n */\n getGroup(group: string, callback: (err?: Error | null, enabled?: boolean, members?: string[]) => void): void {\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled, obj.common.members);\n }\n });\n }\n\n /**\n * Enable or disable group by name\n *\n * @param group groupname\n * @param enable if enable or disable\n * @param callback\n */\n enableGroup(group: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!group) {\n return tools.maybeCallbackWithError(callback, 'Please define group name, like: \"enable groupname\"');\n }\n if (group.startsWith('system.group.')) {\n group = group.substring('system.group.'.length);\n }\n\n if (group === 'administrator' && !enable) {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be disabled');\n }\n\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Add new group\n *\n * @param group groupname\n */\n async addGroup(group: string): Promise<void> {\n const _group = group.replace(/\\s/g, '_');\n const obj = await this.objects.getObject(`system.group.${_group}`);\n if (obj) {\n throw new Error('Group yet exists');\n } else {\n // TODO: shoudln't it have some default acl? TS is worrying\n await this.objects.setObject(`system.group.${_group}`, {\n type: 'group',\n common: {\n name: group,\n enabled: true,\n members: []\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n } as any);\n }\n }\n\n /**\n * Remove group\n *\n * @param group groupname\n * @param callback\n */\n delGroup(group: string, callback: ioBroker.ErrorCallback): void {\n const _group = group.replace(/\\s/g, '_');\n\n if (group === 'administrator') {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be deleted');\n } else {\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n this.objects.delObject(`system.group.${_group}`, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n }\n\n /**\n * Remove user from given group\n *\n * @param username name of the user which will be removed from group\n * @param groupName name of the group user will be removed from\n * @param callback\n */\n removeUserFromGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n const _group = groupName.replace(/\\s/g, '_');\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n const pos = obj.common.members.indexOf(`system.user.${username}`);\n if (pos === -1) {\n return tools.maybeCallbackWithError(callback, 'User not in group');\n } else {\n obj.common.members.splice(pos, 1);\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n }\n });\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;kCAA4C;AAG5C,oBAAmB;AAOb,MAAO,MAAK;EACG;EACA;EAEjB,YAAY,SAAwB;AAChC,QAAI,CAAC,QAAQ,SAAS;AAClB,YAAM,IAAI,MAAM,uCAAuC;IAC3D;AACA,QAAI,CAAC,QAAQ,aAAa;AACtB,YAAM,IAAI,MAAM,2CAA2C;IAC/D;AAEA,SAAK,UAAU,QAAQ;AACvB,SAAK,cAAc,QAAQ;EAC/B;EASA,QAAQ,UAAkB,IAAY,UAAgC;AAElE,UAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AACtD,SAAK,QAAQ,UAAU,eAAe,SAAS,CAAC,KAAK,QAAO;AACxD,UAAI,KAAK;AACL,eAAO,kCAAM,uBAAuB,UAAU,iBAAiB;MACnE,OAAO;AACH,aAAK,QAAQ,UACT,eAAe,SACf;UACI,MAAM;UACN,QAAQ;YACJ,MAAM;YACN,SAAS;YACT,UAAU;;UAEd,MAAM,eAAe,kCAAM,YAAW;UACtC,IAAI,KAAK,IAAG;UACZ,QAAQ,CAAA;WAEZ,CAAAA,SAAM;AACF,cAAI,CAACA,MAAK;AACN,iBAAK,YAAY,UAAU,IAAI,QAAQ;UAC3C,OAAO;AACH,mBAAO,kCAAM,uBAAuB,UAAUA,IAAG;UACrD;QACJ,CAAC;MAET;IACJ,CAAC;EACL;EAOA,MAAM,OAAO,UAAgB;AACzB,UAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AACtD,QAAI,aAAa;AACjB,QAAI;AACA,mBAAa,MAAM,KAAK,QAAQ,aAAa,eAAe,OAAO;IACvE,QAAE;IAEF;AAEA,WAAO;EACX;EASA,YAAY,UAAkB,IAAY,UAAgC;AACtE,UAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AAEtD,SAAK,QAAQ,UAAU,eAAe,SAAS,CAAC,KAAK,QAAO;AACxD,UAAI,OAAO,CAAC,KAAK;AACb,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB;MACvE;AAEA,gDAAS,EAAE,EAAE,KAAK,MAAM,MAAM,CAACA,MAAK,QAAO;AACvC,YAAIA,MAAK;AACL,iBAAO,kCAAM,uBAAuB,UAAUA,IAAG;QACrD;AACA,YAAI,OAAO,WAAW,OAAO;AAC7B,YAAI,OAAO,eAAe,kCAAM,YAAW;AAC3C,YAAI,KAAK,KAAK,IAAG;AACjB,aAAK,QAAQ,UAAU,eAAe,SAAS,KAAK,CAAAA,SAAM;AACtD,iBAAO,kCAAM,uBAAuB,UAAUA,IAAG;QACrD,CAAC;MACL,CAAC;IACL,CAAC;EACL;EASA,cAAc,UAAkB,IAAY,UAAsD;AAC9F,UAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AAEtD,SAAK,QAAQ,UAAU,eAAe,SAAS,CAAC,KAAK,QAAO;AACxD,UAAI,OAAO,CAAC,KAAK;AACb,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB;MACvE;AAEA,gDAAS,EAAE,EAAE,MAAM,IAAI,OAAO,UAAU,CAACA,MAAK,QAAO;AACjD,eAAO,kCAAM,uBAAuB,UAAUA,MAAK,GAAG;MAC1D,CAAC;IACL,CAAC;EACL;EAQA,QAAQ,UAAkB,UAAgC;AACtD,QAAI,CAAC,UAAU;AACX,aAAO,kCAAM,uBAAuB,UAAU,+CAA+C;IACjG;AAEA,UAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AAEtD,SAAK,QAAQ,UAAU,eAAe,SAAS,CAAC,KAAK,QAAO;AACxD,UAAI,OAAO,CAAC,KAAK;AACb,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB;MACvE,OAAO;AACH,YAAI,IAAI,OAAO,YAAY;AACvB,iBAAO,kCAAM,uBAAuB,UAAU,0CAA0C;QAC5F,OAAO;AACH,eAAK,QAAQ,UAAU,iBAAiB,OAAO,CAAAA,SAAM;AAEjD,gBAAI,CAACA,MAAK;AACN,mBAAK,QAAQ,cACT,EAAE,UAAU,iBAAiB,QAAQ,sBAAqB,GAC1D,CAACA,MAAK,WAAU;AACZ,oBAAI,CAAC,QAAQ;AACT,yBAAO,kCAAM,cAAc,QAAQ;gBACvC;AAEA,oBAAI,QAAQ;AACZ,yBAAS,IAAI,GAAG,IAAI,OAAO,KAAK,QAAQ,KAAK;AACzC,sBAAI,OAAO,KAAK,GAAG,MAAM,SAAS,SAAS;AACvC;kBACJ;AAEA,sBACI,OAAO,KAAK,GAAG,MAAM,OAAO,WAC5B,OAAO,KAAK,GAAG,MAAM,OAAO,QAAQ,QAAQ,iBAAiB,KAAK,MAAM,IAC1E;AACE,0BAAM,MAAM,OAAO,KAAK,GAAG,MAAM,OAAO,QAAQ,QAC5C,iBAAiB,KAAK;AAE1B,2BAAO,KAAK,GAAG,MAAM,OAAO,QAAQ,OAAO,KAAK,CAAC;AACjD;AACA,2BAAO,KAAK,GAAG,MAAM,OAAO,iBAAiB,kCAAM,YAAW,IAAK;AACnE,2BAAO,KAAK,GAAG,MAAM,KAAK,KAAK,IAAG;AAClC,yBAAK,QAAQ,UACT,OAAO,KAAK,GAAG,MAAM,KACrB,OAAO,KAAK,GAAG,OACf,CAAAA,SAAM;AACF,0BAAI,CAAC,EAAE,OAAO;AACV,+BAAO,kCAAM,uBAAuB,UAAUA,IAAG;sBACrD;oBACJ,CAAC;kBAET;gBACJ;AACA,oBAAI,CAAC,OAAO;AACR,yBAAO,kCAAM,cAAc,QAAQ;gBACvC;cACJ,CAAC;YAET,OAAO;AACH,qBAAO,kCAAM,uBAAuB,UAAUA,IAAG;YACrD;UACJ,CAAC;QACL;MACJ;IACJ,CAAC;EACL;EASA,eAAe,UAAkB,WAAmB,UAAgC;AAChF,QAAI,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,YAAW;AACpD,QAAI,CAAC,UAAU,WAAW,eAAe,GAAG;AACxC,kBAAY,gBAAgB;IAChC;AACA,QAAI,CAAC,MAAM,WAAW,cAAc,GAAG;AACnC,cAAQ,eAAe;IAC3B;AAEA,SAAK,QAAQ,UAAU,OAAO,CAAC,KAAK,QAAO;AACvC,UAAI,OAAO,CAAC,KAAK;AACb,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB;MACvE;AACA,WAAK,QAAQ,UAAU,WAAW,CAACA,MAAKC,SAAO;AAC3C,YAAID,QAAO,CAACC,MAAK;AACb,iBAAO,kCAAM,uBAAuB,UAAU,sBAAsB;QACxE;AACA,QAAAA,KAAI,SAASA,KAAI,UAAU,CAAA;AAC3B,QAAAA,KAAI,OAAO,UAAUA,KAAI,OAAO,WAAW,CAAA;AAE3C,YAAIA,KAAI,OAAO,QAAQ,QAAQ,KAAK,MAAM,IAAI;AAC1C,UAAAA,KAAI,OAAO,QAAQ,KAAK,KAAK;AAC7B,UAAAA,KAAI,OAAO,iBAAiB,kCAAM,YAAW,IAAK;AAClD,UAAAA,KAAI,KAAK,KAAK,IAAG;AACjB,eAAK,QAAQ,UAAU,WAAWA,MAAK,CAAAD,SAAM;AACzC,mBAAO,kCAAM,uBAAuB,UAAUA,IAAG;UACrD,CAAC;QACL,OAAO;AACH,iBAAO,kCAAM,cAAc,QAAQ;QACvC;MACJ,CAAC;IACL,CAAC;EACL;EAUA,cAAc,UAAkB,WAAmBE,WAAkB,UAAgC;AACjG,QAAI,CAAC,UAAU;AACX,aAAO,kCAAM,uBAAuB,UAAU,kDAAkD;IACpG;AAGA,QAAI,UAAU,UAAU,GAAG,EAAE,MAAM,iBAAiB;AAChD,kBAAY,gBAAgB;IAChC;AAEA,SAAK,QAAQ,UAAU,WAAW,CAAC,KAAK,QAAO;AAC3C,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,kBAAkB,WAAW;MAC/E;AACA,UAAI,CAACA,WAAU;AACX,sBAAAC,QAAO,UAAU;AACjB,sBAAAA,QAAO,YAAY;AACnB,cAAM,SAAS;UACX,YAAY;YACR,UAAU;cACN,aAAa;cACb,SAAS;cACT,SAAS;cACT,QAAQ;;YAEZ,gBAAgB;cACZ,aAAa;cACb,SAAS;cACT,SAAS;cACT,QAAQ;;;;AAIpB,sBAAAA,QAAO,MAAK;AAEZ,sBAAAA,QAAO,IAAI,QAAQ,CAACH,MAAK,WAAU;AAC/B,cAAI,QAAQ;AACR,gBAAI,OAAO,aAAa,OAAO,gBAAgB;AAC3C,sBAAQ,IAAI,8BAA8B;AAC1C,qBAAO,KAAK,KAAK,YAAY,uCAAW,gBAAgB;YAC5D;AAEA,iBAAK,QAAQ,UAAU,OAAO,UAAU,CAAAA,SAAM;AAC1C,kBAAIA,MAAK;AACL,uBAAO,kCAAM,uBAAuB,UAAUA,IAAG;cACrD,OAAO;AACH,qBAAK,eAAe,UAAU,WAAW,CAAAA,SAAM;AAC3C,sBAAIA,MAAK;AACL,2BAAO,kCAAM,uBAAuB,UAAUA,IAAG;kBACrD,OAAO;AACH,2BAAO,kCAAM,cAAc,QAAQ;kBACvC;gBACJ,CAAC;cACL;YACJ,CAAC;UACL,OAAO;AACH,mBAAO,kCAAM,uBAAuB,UAAUA,IAAG;UACrD;QACJ,CAAC;MACL,OAAO;AACH,aAAK,QAAQ,UAAUE,WAAU,CAAAF,SAAM;AACnC,cAAIA,MAAK;AACL,mBAAO,kCAAM,uBAAuB,UAAUA,IAAG;UACrD,OAAO;AACH,iBAAK,eAAe,UAAU,WAAW,CAAAA,SAAM;AAC3C,kBAAIA,MAAK;AACL,uBAAO,kCAAM,uBAAuB,UAAUA,IAAG;cACrD,OAAO;AACH,uBAAO,kCAAM,cAAc,QAAQ;cACvC;YACJ,CAAC;UACL;QACJ,CAAC;MACL;IACJ,CAAC;EACL;EASA,MAAM,gBAAgB,UAAkBE,WAAkB,UAAgC;AACtF,QAAI,CAAC,UAAU;AACX,aAAO,kCAAM,uBAAuB,UAAU,kDAAkD;IACpG;AAEA,UAAM,aAAa,MAAM,KAAK,OAAO,QAAQ;AAC7C,QAAI,CAAC,YAAY;AACb,aAAO,kCAAM,uBAAuB,UAAU,SAAS,2BAA2B;IACtF,OAAO;AAEH,UAAI,CAACA,WAAU;AACX,sBAAAC,QAAO,UAAU;AACjB,sBAAAA,QAAO,YAAY;AACnB,cAAM,SAAS;UACX,YAAY;YACR,UAAU;cACN,aAAa;cACb,SAAS;cACT,SAAS;cACT,QAAQ;;YAEZ,gBAAgB;cACZ,aAAa;cACb,SAAS;cACT,SAAS;cACT,QAAQ;;;;AAIpB,sBAAAA,QAAO,MAAK;AAEZ,sBAAAA,QAAO,IAAI,QAAQ,CAAC,KAAK,WAAU;AAC/B,cAAI,QAAQ;AACR,gBAAI,OAAO,aAAa,OAAO,gBAAgB;AAC3C,qBAAO,kCAAM,uBAAuB,UAAU,8BAA8B;YAChF;AAEA,iBAAK,YAAY,UAAU,OAAO,UAAU,CAAAH,SAAM;AAC9C,kBAAIA,MAAK;AACL,uBAAO,kCAAM,uBAAuB,UAAUA,IAAG;cACrD,OAAO;AACH,uBAAO,kCAAM,cAAc,QAAQ;cACvC;YACJ,CAAC;UACL,OAAO;AACH,mBAAO,kCAAM,uBAAuB,UAAU,sBAAsB;UACxE;QACJ,CAAC;MACL,OAAO;AACH,aAAK,YAAY,UAAUE,WAAU,SAAM;AACvC,cAAI,KAAK;AACL,mBAAO,kCAAM,uBAAuB,UAAU,GAAG;UACrD,OAAO;AACH,mBAAO,kCAAM,cAAc,QAAQ;UACvC;QACJ,CAAC;MACL;IACJ;EACJ;EASA,WAAW,UAAkB,QAAiB,UAAgC;AAC1E,QAAI,CAAC,UAAU;AACX,aAAO,kCAAM,uBAAuB,UAAU,kDAAkD;IACpG;AACA,QAAI,SAAS,WAAW,cAAc,GAAG;AACrC,iBAAW,SAAS,UAAU,eAAe,MAAM;IACvD;AAEA,QAAI,aAAa,WAAW,CAAC,QAAQ;AACjC,aAAO,kCAAM,uBAAuB,UAAU,+BAA+B;IACjF;AAEA,SAAK,QAAQ,UAAU,eAAe,YAAY,CAAC,KAAK,QAAO;AAC3D,UAAI,KAAK;AACL,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB,IAAI,SAAS;MACpF;AACA,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,SAAS,qBAAqB;MAChF,OAAO;AACH,YAAI,OAAO,UAAU;AACrB,YAAI,OAAO,eAAe,kCAAM,YAAW;AAC3C,YAAI,KAAK,KAAK,IAAG;AACjB,aAAK,QAAQ,UAAU,IAAI,KAAK,KAAK,CAAAF,SAAM;AACvC,iBAAO,kCAAM,uBAAuB,UAAUA,IAAG;QACrD,CAAC;MACL;IACJ,CAAC;EACL;EASA,kBAAkB,UAAkBE,WAAkB,UAAgC;AAClF,QAAI;AACJ,QAAI,CAAC,YAAY,CAACA,WAAU;AACxB,oBAAAC,QAAO,UAAU;AACjB,oBAAAA,QAAO,YAAY;AACnB,eAAS;QACL,YAAY;UACR,UAAU;YACN,aAAa;YACb,SAAS;YACT,SAAS;YACT,QAAQ;;UAEZ,UAAU;YACN,aAAa;YACb,SAAS;YACT,SAAS;YACT,QAAQ;;;;AAIpB,oBAAAA,QAAO,MAAK;AAEZ,oBAAAA,QAAO,IAAI,QAAQ,CAAC,KAAK,WAAU;AAC/B,aAAK,cAAc,OAAO,UAAoB,OAAO,UAAoB,CAACH,MAAK,QAAO;AAClF,cAAIA,QAAO,CAAC,KAAK;AACb,mBAAO,kCAAM,uBACT,UACA,sBAAsB,OAAO,2BAAqCA,OAAM,OAAOA,OAAM,IAAI;UAEjG,OAAO;AACH,mBAAO,kCAAM,uBAAuB,UAAU,IAAI;UACtD;QACJ,CAAC;MACL,CAAC;IACL,WAAW,CAACE,WAAU;AAClB,oBAAAC,QAAO,UAAU;AACjB,oBAAAA,QAAO,YAAY;AACnB,eAAS;QACL,YAAY;UACR,UAAU;YACN,aAAa;YACb,SAAS;YACT,SAAS;YACT,QAAQ;;;;AAIpB,oBAAAA,QAAO,MAAK;AAEZ,oBAAAA,QAAO,IAAI,QAAQ,CAAC,KAAK,WAAU;AAE/B,aAAK,cAAc,UAAU,OAAO,UAAU,CAACH,MAAK,QAAO;AACvD,cAAIA,QAAO,CAAC,KAAK;AACb,mBAAO,kCAAM,uBACT,UACA,sBAAsB,6BAA6BA,OAAM,OAAOA,OAAM,IAAI;UAElF,OAAO;AACH,mBAAO,kCAAM,uBAAuB,UAAU,IAAI;UACtD;QACJ,CAAC;MACL,CAAC;IACL,OAAO;AACH,WAAK,cAAc,UAAUE,WAAU,CAAC,KAAK,QAAO;AAChD,YAAI,OAAO,CAAC,KAAK;AACb,iBAAO,kCAAM,uBACT,UACA,wBAAwB,WAAW,wBAAwB,MAAM,OAAO,MAAM,GAAG;QAEzF,OAAO;AACH,iBAAO,kCAAM,uBAAuB,UAAU,IAAI;QACtD;MACJ,CAAC;IACL;EACJ;EAQA,QAAQ,UAAkB,UAAyD;AAC/E,SAAK,QAAQ,UAAU,eAAe,YAAY,CAAC,KAAK,QAAO;AAC3D,UAAI,KAAK;AACL,eAAO,kCAAM,uBAAuB,UAAU,qBAAqB,IAAI,SAAS;MACpF;AACA,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,SAAS,qBAAqB;MAChF,OAAO;AACH,eAAO,kCAAM,uBAAuB,UAAU,MAAM,IAAI,OAAO,OAAO;MAC1E;IACJ,CAAC;EACL;EAQA,SAAS,OAAe,UAA6E;AACjG,SAAK,QAAQ,UAAU,gBAAgB,SAAS,CAAC,KAAK,QAAO;AACzD,UAAI,KAAK;AACL,eAAO,kCAAM,uBAAuB,UAAU,sBAAsB,IAAI,SAAS;MACrF;AACA,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,UAAU,kBAAkB;MAC9E,OAAO;AACH,eAAO,kCAAM,uBAAuB,UAAU,MAAM,IAAI,OAAO,SAAS,IAAI,OAAO,OAAO;MAC9F;IACJ,CAAC;EACL;EASA,YAAY,OAAe,QAAiB,UAAgC;AACxE,QAAI,CAAC,OAAO;AACR,aAAO,kCAAM,uBAAuB,UAAU,oDAAoD;IACtG;AACA,QAAI,MAAM,WAAW,eAAe,GAAG;AACnC,cAAQ,MAAM,UAAU,gBAAgB,MAAM;IAClD;AAEA,QAAI,UAAU,mBAAmB,CAAC,QAAQ;AACtC,aAAO,kCAAM,uBAAuB,UAAU,0CAA0C;IAC5F;AAEA,SAAK,QAAQ,UAAU,gBAAgB,SAAS,CAAC,KAAK,QAAO;AACzD,UAAI,KAAK;AACL,eAAO,kCAAM,uBAAuB,UAAU,sBAAsB,IAAI,SAAS;MACrF;AACA,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,UAAU,kBAAkB;MAC9E,OAAO;AACH,YAAI,OAAO,UAAU;AACrB,YAAI,OAAO,eAAe,kCAAM,YAAW;AAC3C,YAAI,KAAK,KAAK,IAAG;AACjB,aAAK,QAAQ,UAAU,IAAI,KAAK,KAAK,CAAAF,SAAM;AACvC,iBAAO,kCAAM,uBAAuB,UAAUA,IAAG;QACrD,CAAC;MACL;IACJ,CAAC;EACL;EAOA,MAAM,SAAS,OAAa;AACxB,UAAM,SAAS,MAAM,QAAQ,OAAO,GAAG;AACvC,UAAM,MAAM,MAAM,KAAK,QAAQ,UAAU,gBAAgB,QAAQ;AACjE,QAAI,KAAK;AACL,YAAM,IAAI,MAAM,kBAAkB;IACtC,OAAO;AAEH,YAAM,KAAK,QAAQ,UAAU,gBAAgB,UAAU;QACnD,MAAM;QACN,QAAQ;UACJ,MAAM;UACN,SAAS;UACT,SAAS,CAAA;;QAEb,MAAM,eAAe,kCAAM,YAAW;QACtC,IAAI,KAAK,IAAG;QACZ,QAAQ,CAAA;OACJ;IACZ;EACJ;EAQA,SAAS,OAAe,UAAgC;AACpD,UAAM,SAAS,MAAM,QAAQ,OAAO,GAAG;AAEvC,QAAI,UAAU,iBAAiB;AAC3B,aAAO,kCAAM,uBAAuB,UAAU,yCAAyC;IAC3F,OAAO;AACH,WAAK,QAAQ,UAAU,gBAAgB,UAAU,CAAC,KAAK,QAAO;AAC1D,YAAI,CAAC,KAAK;AACN,iBAAO,kCAAM,uBAAuB,UAAU,uBAAuB;QACzE,OAAO;AACH,eAAK,QAAQ,UAAU,gBAAgB,UAAU,CAAAA,SAAM;AACnD,mBAAO,kCAAM,uBAAuB,UAAUA,IAAG;UACrD,CAAC;QACL;MACJ,CAAC;IACL;EACJ;EASA,oBAAoB,UAAkB,WAAmB,UAAgC;AACrF,UAAM,SAAS,UAAU,QAAQ,OAAO,GAAG;AAC3C,SAAK,QAAQ,UAAU,gBAAgB,UAAU,CAAC,KAAK,QAAO;AAC1D,UAAI,CAAC,KAAK;AACN,eAAO,kCAAM,uBAAuB,UAAU,uBAAuB;MACzE,OAAO;AACH,cAAM,MAAM,IAAI,OAAO,QAAQ,QAAQ,eAAe,UAAU;AAChE,YAAI,QAAQ,IAAI;AACZ,iBAAO,kCAAM,uBAAuB,UAAU,mBAAmB;QACrE,OAAO;AACH,cAAI,OAAO,QAAQ,OAAO,KAAK,CAAC;AAChC,cAAI,OAAO,eAAe,kCAAM,YAAW;AAC3C,cAAI,KAAK,KAAK,IAAG;AACjB,eAAK,QAAQ,UAAU,IAAI,KAAK,KAAK,CAAAA,SAAM;AACvC,mBAAO,kCAAM,uBAAuB,UAAUA,IAAG;UACrD,CAAC;QACL;MACJ;IACJ,CAAC;EACL;;",
4
+ "sourcesContent": ["import { password, tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { ProcessExitCallback } from '../_Types.js';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport prompt from 'prompt';\n\nexport interface CLIUsersOptions {\n processExit: ProcessExitCallback;\n objects: ObjectsRedisClient;\n}\n\n/** Return type of prompt.get() for user */\ntype UsernamePromptProps = { password: string; username: string };\n\nexport class Users {\n private readonly objects: ObjectsRedisClient;\n private readonly processExit: ProcessExitCallback;\n\n constructor(options: CLIUsersOptions) {\n if (!options.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options.processExit) {\n throw new Error('Invalid arguments: processExit is missing');\n }\n\n this.objects = options.objects;\n this.processExit = options.processExit;\n }\n\n /**\n * Adds new user to system\n *\n * @param username name of the user which will be added\n * @param pw password\n * @param callback\n */\n addUser(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n // user id's should be case insensitive\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (obj) {\n return tools.maybeCallbackWithError(callback, 'User yet exists');\n } else {\n this.objects.setObject(\n `system.user.${_user}`,\n {\n type: 'user',\n common: {\n name: username,\n enabled: true,\n password: ''\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n },\n err => {\n if (!err) {\n this.setPassword(username, pw, callback);\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n });\n }\n\n /**\n * Checks if user exists\n *\n * @param username name of the user to check existence of\n */\n async isUser(username: string): Promise<boolean> {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n let isExisting = false;\n try {\n isExisting = await this.objects.objectExists(`system.user.${_user}`);\n } catch {\n // ignore\n }\n\n return isExisting;\n }\n\n /**\n * Set password for specific user\n *\n * @param username name of the user to set password for\n * @param pw password\n * @param callback\n */\n setPassword(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).hash(null, null, (err, res) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n obj.common.password = res ?? '';\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(`system.user.${_user}`, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n });\n });\n }\n\n /**\n * Checks if password is correct for given user\n *\n * @param username name of the user to check password\n * @param pw password\n * @param callback\n */\n checkPassword(username: string, pw: string, callback: (err?: Error | null, isOk?: boolean) => void): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).check(obj.common.password, (err, res) => {\n return tools.maybeCallbackWithError(callback, err, res);\n });\n });\n }\n\n /**\n * Deletes user from system\n *\n * @param username name of the user to delete\n * @param callback\n */\n delUser(username: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"userdel user\"');\n }\n\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n } else {\n if (obj.common.dontDelete) {\n return tools.maybeCallbackWithError(callback, 'Cannot delete user, while is system user');\n } else {\n this.objects.delObject('system.user.' + _user, err => {\n // Remove this user from all groups\n if (!err) {\n this.objects.getObjectList(\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err, groups) => {\n if (!groups) {\n return tools.maybeCallback(callback);\n }\n\n let count = 0;\n for (let i = 0; i < groups.rows.length; i++) {\n if (groups.rows[i].value.type !== 'group') {\n continue;\n }\n // find all groups\n if (\n groups.rows[i].value.common.members &&\n groups.rows[i].value.common.members.indexOf('system.user.' + _user) !== -1\n ) {\n const pos = groups.rows[i].value.common.members.indexOf(\n 'system.user.' + _user\n );\n groups.rows[i].value.common.members.splice(pos, 1);\n count++;\n groups.rows[i].value.from = 'system.host.' + tools.getHostName() + '.cli';\n groups.rows[i].value.ts = Date.now();\n this.objects.setObject(\n groups.rows[i].value._id,\n groups.rows[i].value,\n err => {\n if (!--count) {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n }\n if (!count) {\n return tools.maybeCallback(callback);\n }\n }\n );\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n }\n }\n });\n }\n\n /**\n * Adds user to given group\n *\n * @param username user which will be added to the group\n * @param groupName name of the group where the user will be added to\n * @param callback\n */\n addUserToGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n let _user = username.replace(/\\s/g, '_').toLowerCase();\n if (!groupName.startsWith('system.group.')) {\n groupName = `system.group.${groupName}`;\n }\n if (!_user.startsWith('system.user.')) {\n _user = `system.user.${_user}`;\n }\n\n this.objects.getObject(_user, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n this.objects.getObject(groupName, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exist');\n }\n obj.common = obj.common || {};\n obj.common.members = obj.common.members || [];\n\n if (obj.common.members.indexOf(_user) === -1) {\n obj.common.members.push(_user);\n obj.from = 'system.host.' + tools.getHostName() + '.cli';\n obj.ts = Date.now();\n this.objects.setObject(groupName, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n } else {\n return tools.maybeCallback(callback);\n }\n });\n });\n }\n\n /**\n * Add user via CLI prompt\n *\n * @param username user which sohuld be created\n * @param groupName default group for the new user\n * @param password user password\n * @param callback\n */\n addUserPrompt(username: string, groupName: string, password: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"adduser newUser\"');\n }\n\n // Check group\n if (groupName.substring(0, 13) !== 'system.group.') {\n groupName = `system.group.${groupName}`;\n }\n\n this.objects.getObject(groupName, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Unknown group: ${groupName}`);\n }\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n console.log('Passwords are not identical!');\n return void this.processExit(EXIT_CODES.INVALID_PASSWORD);\n }\n // @ts-expect-error external types problem?\n this.addUser(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n } else {\n this.addUser(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n }\n });\n }\n\n /**\n * Set password of user\n *\n * @param username name of the user to set password for\n * @param password password of user\n * @param callback\n */\n async setUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): Promise<void> {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"passwd username\"');\n }\n\n const isExisting = await this.isUser(username);\n if (!isExisting) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" does not exist.`);\n } else {\n // Check group\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n return tools.maybeCallbackWithError(callback, 'Passwords are not identical!');\n }\n // @ts-expect-error external types problem?\n this.setPassword(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, 'No password entered!');\n }\n });\n } else {\n this.setPassword(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n }\n }\n\n /**\n * Enable user\n *\n * @param username name of the user which will be activated\n * @param enable true if it should be enabled else false\n * @param callback\n */\n enableUser(username: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"enable username\"');\n }\n if (username.startsWith('system.user.')) {\n username = username.substring('system.user.'.length);\n }\n\n if (username === 'admin' && !enable) {\n return tools.maybeCallbackWithError(callback, 'User admin cannot be disabled');\n }\n\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Check if user password is valid\n *\n * @param username name of the user to check password for\n * @param password password to check\n * @param callback\n */\n checkUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): void {\n let schema;\n if (!username && !password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n username: {\n description: 'Enter username to check password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: false\n },\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get<UsernamePromptProps>(schema, (err, result) => {\n this.checkPassword(result.username, result.password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${result.username as string}\" does not match${err ? `: ${err.message}` : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get<UsernamePromptProps>(schema, (err, result) => {\n this.checkPassword(username, result.password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${username}\" does not match${err ? `: ${err.message}` : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else {\n this.checkPassword(username, password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${username}\" does not match${err ? `: ${err.message}` : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n }\n }\n\n /**\n * Get user object\n *\n * @param username name of the user to get object of\n * @param callback\n */\n getUser(username: string, callback: (err?: Error | null, enabled?: boolean) => void): void {\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled);\n }\n });\n }\n\n /**\n * Get group object\n *\n * @param group groupname\n * @param callback\n */\n getGroup(group: string, callback: (err?: Error | null, enabled?: boolean, members?: string[]) => void): void {\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled, obj.common.members);\n }\n });\n }\n\n /**\n * Enable or disable group by name\n *\n * @param group groupname\n * @param enable if enable or disable\n * @param callback\n */\n enableGroup(group: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!group) {\n return tools.maybeCallbackWithError(callback, 'Please define group name, like: \"enable groupname\"');\n }\n if (group.startsWith('system.group.')) {\n group = group.substring('system.group.'.length);\n }\n\n if (group === 'administrator' && !enable) {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be disabled');\n }\n\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Add new group\n *\n * @param group groupname\n */\n async addGroup(group: string): Promise<void> {\n const _group = group.replace(/\\s/g, '_');\n const obj = await this.objects.getObject(`system.group.${_group}`);\n if (obj) {\n throw new Error('Group yet exists');\n } else {\n // TODO: shoudln't it have some default acl? TS is worrying\n await this.objects.setObject(`system.group.${_group}`, {\n type: 'group',\n common: {\n name: group,\n enabled: true,\n members: []\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n } as any);\n }\n }\n\n /**\n * Remove group\n *\n * @param group groupname\n * @param callback\n */\n delGroup(group: string, callback: ioBroker.ErrorCallback): void {\n const _group = group.replace(/\\s/g, '_');\n\n if (group === 'administrator') {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be deleted');\n } else {\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n this.objects.delObject(`system.group.${_group}`, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n }\n\n /**\n * Remove user from given group\n *\n * @param username name of the user which will be removed from group\n * @param groupName name of the group user will be removed from\n * @param callback\n */\n removeUserFromGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n const _group = groupName.replace(/\\s/g, '_');\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n const pos = obj.common.members.indexOf(`system.user.${username}`);\n if (pos === -1) {\n return tools.maybeCallbackWithError(callback, 'User not in group');\n } else {\n obj.common.members.splice(pos, 1);\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n }\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["err", "obj", "password", "prompt"]
7
7
  }
@@ -1382,7 +1382,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
1382
1382
  } else if (command2 === "check") {
1383
1383
  users.checkUserPassword(user, password, (err) => {
1384
1384
  if (err) {
1385
- console.error(err);
1385
+ console.error(err.message);
1386
1386
  return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
1387
1387
  } else {
1388
1388
  console.log(`Password for user "${user}" matches.`);
@@ -1392,7 +1392,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
1392
1392
  } else if (command2 === "set" || command2 === "passwd") {
1393
1393
  users.setUserPassword(user, password, (err) => {
1394
1394
  if (err) {
1395
- console.error(err);
1395
+ console.error(err.message);
1396
1396
  return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
1397
1397
  } else {
1398
1398
  console.log(`Password for "${user}" was successfully set.`);
@@ -1402,7 +1402,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
1402
1402
  } else if (command2 === "enable" || command2 === "e") {
1403
1403
  users.enableUser(user, true, (err) => {
1404
1404
  if (err) {
1405
- console.error(err);
1405
+ console.error(err.message);
1406
1406
  return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
1407
1407
  } else {
1408
1408
  console.log(`User "${user}" was successfully enabled.`);
@@ -1412,7 +1412,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
1412
1412
  } else if (command2 === "disable" || command2 === "d") {
1413
1413
  users.enableUser(user, false, (err) => {
1414
1414
  if (err) {
1415
- console.error(err);
1415
+ console.error(err.message);
1416
1416
  return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
1417
1417
  } else {
1418
1418
  console.log(`User "${user}" was successfully disabled.`);
@@ -1422,7 +1422,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
1422
1422
  } else if (command2 === "get") {
1423
1423
  users.getUser(user, (err, isEnabled) => {
1424
1424
  if (err) {
1425
- console.error(err);
1425
+ console.error(err.message);
1426
1426
  return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
1427
1427
  } else {
1428
1428
  console.log(`User "${user}" is ${isEnabled ? "enabled" : "disabled"}`);