iobroker.admin 7.7.1 → 7.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -11
- package/admin/admin.png +0 -0
- package/admin/i18n/de.json +1 -1
- package/admin/i18n/es.json +1 -1
- package/admin/i18n/fr.json +1 -1
- package/admin/i18n/it.json +1 -1
- package/admin/i18n/nl.json +1 -1
- package/admin/i18n/pl.json +1 -1
- package/admin/i18n/pt.json +1 -1
- package/admin/i18n/ru.json +1 -1
- package/admin/i18n/uk.json +1 -1
- package/admin/i18n/zh-cn.json +1 -1
- package/admin/jsonConfig.json5 +1 -2
- package/adminWww/assets/{AdapterUpdateDialog-Bgswiqs9.js → AdapterUpdateDialog-BQUTMe7v.js} +1 -1
- package/adminWww/assets/Adapters-KuMqwfzU.js +9 -0
- package/adminWww/assets/Config-LH40Fzyp.js +1 -0
- package/adminWww/assets/CustomModal-UQ6ICKdg.js +1 -0
- package/adminWww/assets/CustomTab-CE2qvngn.js +1 -0
- package/adminWww/assets/DefaultPropsProvider-BxjOYH1h.js +30 -0
- package/adminWww/assets/EasyMode-XXQKZmWs.js +1 -0
- package/adminWww/assets/{Enums-8m252lzC.js → Enums-Ddmi-fYo.js} +3 -3
- package/adminWww/assets/{Fields-lI3YkIzQ.js → Fields-CQNdUYkd.js} +1 -1
- package/adminWww/assets/{Files-fQpSPYWI.js → Files-DgOiCRiN.js} +2 -2
- package/adminWww/assets/FilledInput-B9JSi0Ta.js +2 -0
- package/adminWww/assets/Hosts-BgDpLhdl.js +121 -0
- package/adminWww/assets/Instances-DikJwBl0.js +2 -0
- package/adminWww/assets/Intro-vxIHtYzr.js +2 -0
- package/adminWww/assets/Logs-DZUWTbJn.js +1 -0
- package/adminWww/assets/Objects-Dm1_4aGR.js +60 -0
- package/adminWww/assets/{State-nZ6sjU9_.js → State-CrcWiBdx.js} +1 -1
- package/adminWww/assets/TextField-j-uewRwI.js +138 -0
- package/adminWww/assets/ThemeProvider-DHntAcOp.js +29 -0
- package/adminWww/assets/Users-GcWjwa7A.js +1 -0
- package/adminWww/assets/ace-1DqSbvTN.js +985 -0
- package/adminWww/assets/bootstrap-B3ZI_-0g.js +2024 -0
- package/adminWww/assets/{createSvgIcon-DuKI6CvW.js → createSvgIcon-Ds12z7B3.js} +1 -1
- package/adminWww/assets/emotion-cache.browser.esm-BgJfNZJN.js +1 -0
- package/adminWww/assets/emotion-react.browser.esm-CBtpmfsG.js +8 -0
- package/adminWww/assets/emotion-serialize.esm-Q4o_CgeF.js +1 -0
- package/adminWww/assets/emotion-styled.browser.esm-BeD8nBzN.js +1 -0
- package/adminWww/assets/emotion-use-insertion-effect-with-fallbacks.browser.esm-BIy6Leuu.js +1 -0
- package/adminWww/assets/geosearch.module-B6h9BuIR.js +1 -0
- package/adminWww/assets/hostInit-fzxL8JAx.js +1 -1
- package/adminWww/assets/iconBase-BAOnvyiQ.js +1 -0
- package/adminWww/assets/{index-BP5kWU3L.js → index-BOnh7es7.js} +1 -1
- package/adminWww/assets/{index-BmWdDCX_.js → index-BSfwmoAE.js} +4 -4
- package/adminWww/assets/{index-gHyOgbGJ.js → index-BVgYaw7t.js} +1 -1
- package/adminWww/assets/{index-D7Rlw-5R.js → index-C9i3HTsG.js} +1 -1
- package/adminWww/assets/{index-DH1kmwK1.js → index-CELb-gCK.js} +2 -2
- package/adminWww/assets/{index-HOidq_rM.js → index-CU6eZCem.js} +1 -1
- package/adminWww/assets/{index-Bsv_DXxB.js → index-DZ0MncEz.js} +2 -2
- package/adminWww/assets/index-Dg-s3k0-.js +10 -0
- package/adminWww/assets/index-tS5iCAF7.js +55 -0
- package/adminWww/assets/iobroker_admin__loadShare___mf_0_emotion_mf_1_react__loadShare__-CXogaIXO.js +1 -0
- package/adminWww/assets/{iobroker_admin__loadShare__leaflet__loadShare__-B1OZ7tj-.js → iobroker_admin__loadShare__leaflet__loadShare__-DIpcqFbm.js} +1 -1
- package/adminWww/assets/iobroker_admin__loadShare__prop_mf_2_types__loadShare__-pDONiJUe.js +1 -0
- package/adminWww/assets/{iobroker_admin__loadShare__react__loadShare__-DtlEM_52.js → iobroker_admin__loadShare__react__loadShare__-CuzHmAOj.js} +1 -1
- package/adminWww/assets/iobroker_admin__mf_v__runtimeInit__mf_v__-CHE4rLsT.js +5 -0
- package/adminWww/assets/leaflet-src-BRBM-1HK.js +4 -0
- package/adminWww/assets/{sentry-CNy_SQq1.js → sentry-B6yHtsbd.js} +1 -1
- package/adminWww/assets/{zh-cn-DZTx1vAh.js → zh-cn-heTcsLnU.js} +15 -15
- package/adminWww/img/admin.png +0 -0
- package/adminWww/index.html +2 -2
- package/adminWww/mf-manifest.json +1 -1
- package/adminWww/remoteEntry.js +2 -2
- package/adminWww/static/js/worker-javascript.js +1 -1
- package/adminWww/static/js/worker-yaml.js +1 -1
- package/build/i18n/de.json +18 -0
- package/build/i18n/es.json +18 -0
- package/build/i18n/fr.json +18 -0
- package/build/i18n/it.json +18 -0
- package/build/i18n/nl.json +18 -0
- package/build/i18n/pl.json +18 -0
- package/build/i18n/pt.json +18 -0
- package/build/i18n/ru.json +18 -0
- package/build/i18n/uk.json +18 -0
- package/build/i18n/zh-cn.json +18 -0
- package/build/lib/DockerManager.js +1315 -0
- package/build/lib/DockerManager.js.map +1 -0
- package/build/lib/dockerManager.types.js +3 -0
- package/build/lib/dockerManager.types.js.map +1 -0
- package/{build-backend → build}/lib/testPassword.js +1 -1
- package/{build-backend → build}/lib/testPassword.js.map +1 -1
- package/{build-backend/src → build}/lib/translations.js +16 -1
- package/build/lib/translations.js.map +1 -0
- package/{build-backend → build}/main.js +58 -5
- package/build/main.js.map +1 -0
- package/io-package.json +27 -27
- package/package.json +13 -12
- package/adminWww/assets/Adapters-yQiEeoh8.js +0 -7
- package/adminWww/assets/Config-C1Gjt8DC.js +0 -1
- package/adminWww/assets/CustomModal-CgEtkfCG.js +0 -1
- package/adminWww/assets/CustomTab-CwioFUor.js +0 -1
- package/adminWww/assets/DefaultPropsProvider-DxsXuIyE.js +0 -30
- package/adminWww/assets/EasyMode-CN-reJVI.js +0 -1
- package/adminWww/assets/FilledInput-CKswrNd5.js +0 -2
- package/adminWww/assets/Hosts-BPdUlXV5.js +0 -121
- package/adminWww/assets/Instances-BStmfz4r.js +0 -2
- package/adminWww/assets/Intro-Dr1-aqO9.js +0 -2
- package/adminWww/assets/Logs-xCCrWV30.js +0 -1
- package/adminWww/assets/Objects-BF8brXaf.js +0 -60
- package/adminWww/assets/Tabs-BJ1rL35Z.js +0 -138
- package/adminWww/assets/Users-B0iasrSG.js +0 -1
- package/adminWww/assets/ace-CFIUQz8j.js +0 -970
- package/adminWww/assets/blueGrey-D-KQaGde.js +0 -29
- package/adminWww/assets/bootstrap-DDrI3lVl.js +0 -2036
- package/adminWww/assets/emotion-cache.browser.esm-B8BFze5o.js +0 -1
- package/adminWww/assets/emotion-react.browser.esm-DApPKwaj.js +0 -8
- package/adminWww/assets/emotion-serialize.esm-BUa21YfQ.js +0 -1
- package/adminWww/assets/emotion-styled.browser.esm-Dc05hmeu.js +0 -1
- package/adminWww/assets/emotion-utils.browser.esm-DOjH6Olm.js +0 -1
- package/adminWww/assets/geosearch.module-CWfRtxrN.js +0 -1
- package/adminWww/assets/iconBase-CgxZ5MMC.js +0 -1
- package/adminWww/assets/index-BjVqnwqt.js +0 -10
- package/adminWww/assets/index-RvHSqeMD.js +0 -55
- package/adminWww/assets/iobroker_admin__loadShare___mf_0_emotion_mf_1_react__loadShare__-gw2iqPBS.js +0 -1
- package/adminWww/assets/iobroker_admin__loadShare__prop_mf_2_types__loadShare__-BGyJCibC.js +0 -1
- package/adminWww/assets/iobroker_admin__mf_v__runtimeInit__mf_v__-VDoBF19b.js +0 -10
- package/adminWww/assets/leaflet-src-A2ZHl6nF.js +0 -4
- package/build-backend/i18n/de.json +0 -18
- package/build-backend/i18n/es.json +0 -18
- package/build-backend/i18n/fr.json +0 -18
- package/build-backend/i18n/it.json +0 -18
- package/build-backend/i18n/nl.json +0 -18
- package/build-backend/i18n/pl.json +0 -18
- package/build-backend/i18n/pt.json +0 -18
- package/build-backend/i18n/ru.json +0 -18
- package/build-backend/i18n/uk.json +0 -18
- package/build-backend/i18n/zh-cn.json +0 -18
- package/build-backend/lib/translations.js +0 -27
- package/build-backend/lib/translations.js.map +0 -1
- package/build-backend/main.js.map +0 -1
- package/build-backend/src/lib/checkLinuxPass.js +0 -280
- package/build-backend/src/lib/checkLinuxPass.js.map +0 -1
- package/build-backend/src/lib/testPassword.js +0 -58
- package/build-backend/src/lib/testPassword.js.map +0 -1
- package/build-backend/src/lib/translations.js.map +0 -1
- package/build-backend/src/lib/utils.js +0 -344
- package/build-backend/src/lib/utils.js.map +0 -1
- package/build-backend/src/lib/web.js +0 -1165
- package/build-backend/src/lib/web.js.map +0 -1
- package/build-backend/src/main.js +0 -1704
- package/build-backend/src/main.js.map +0 -1
- package/build-backend/src-admin/src/components/Adapters/Utils.js +0 -39
- package/build-backend/src-admin/src/components/Adapters/Utils.js.map +0 -1
- /package/{build-backend → build}/i18n/en.json +0 -0
- /package/{build-backend → build}/lib/checkLinuxPass.js +0 -0
- /package/{build-backend → build}/lib/checkLinuxPass.js.map +0 -0
- /package/{build-backend → build}/lib/utils.js +0 -0
- /package/{build-backend → build}/lib/utils.js.map +0 -0
- /package/{build-backend → build}/lib/web.js +0 -0
- /package/{build-backend → build}/lib/web.js.map +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockerManager.js","sourceRoot":"","sources":["../../src/lib/DockerManager.ts"],"names":[],"mappings":"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","sourcesContent":["// This class implements docker commands using CLI and\n// it monitors periodically the docker daemon status.\n// It manages containers defined in adapter.config.containers and monitors other containers\n\nimport { promisify } from 'node:util';\nimport { exec } from 'node:child_process';\nimport type {\n ContainerConfig,\n ContainerInfo,\n ContainerStats,\n ContainerStatus,\n DiskUsage,\n DockerContainerInspect,\n DockerImageInspect,\n ImageInfo,\n ContainerName,\n ImageName,\n NetworkInfo,\n NetworkDriver,\n} from './dockerManager.types';\n\nconst execPromise = promisify(exec);\n\nconst dockerDefaults: Record<string, any> = {\n tty: false,\n stdinOpen: false,\n attachStdin: false,\n attachStdout: false,\n attachStderr: false,\n openStdin: false,\n publishAllPorts: false,\n readOnly: false,\n user: '',\n workdir: '',\n domainname: '',\n macAddress: '',\n networkMode: 'bridge',\n};\n\nfunction isDefault(value: any, def: any): boolean {\n return JSON.stringify(value) === JSON.stringify(def);\n}\n\nfunction deepCompare(object1: any, object2: any): boolean {\n if (typeof object1 === 'number') {\n object1 = object1.toString();\n }\n if (typeof object2 === 'number') {\n object2 = object2.toString();\n }\n if (typeof object1 !== typeof object2) {\n return false;\n }\n if (typeof object1 !== 'object' || object1 === null || object2 === null) {\n return object1 === object2;\n }\n if (Array.isArray(object1)) {\n if (!Array.isArray(object2) || object1.length !== object2.length) {\n return false;\n }\n for (let i = 0; i < object1.length; i++) {\n if (!deepCompare(object1[i], object2[i])) {\n return false;\n }\n }\n return true;\n }\n const keys1 = Object.keys(object1);\n const keys2 = Object.keys(object2);\n if (keys1.length !== keys2.length) {\n return false;\n }\n for (const key of keys1) {\n if (!deepCompare(object1[key], object2[key])) {\n return false;\n }\n }\n return true;\n}\n\nfunction compareConfigs(desired: ContainerConfig, existing: ContainerConfig): string[] {\n const diffs: string[] = [];\n\n const keys: (keyof ContainerConfig)[] = Object.keys(desired) as Array<keyof ContainerConfig>;\n\n // We only compare keys that are in the desired config\n for (const key of keys) {\n // ignore iob* properties as they belong to ioBroker configuration\n if (key.startsWith('iob')) {\n continue;\n }\n // ignore hostname\n if (key === 'hostname') {\n continue;\n }\n if (typeof desired[key] === 'object' && desired[key] !== null) {\n if (Array.isArray(desired[key])) {\n if (!Array.isArray(existing[key]) || desired[key].length !== existing[key].length) {\n diffs.push(key);\n } else {\n for (let i = 0; i < desired[key].length; i++) {\n if (!deepCompare(desired[key][i], existing[key][i])) {\n diffs.push(`${key}[${i}]`);\n }\n }\n }\n } else {\n Object.keys(desired[key]).forEach((subKey: string) => {\n if (!deepCompare((desired as any)[key][subKey], (existing as any)[key][subKey])) {\n diffs.push(`${key}.${subKey}`);\n }\n });\n }\n } else if (desired[key] !== existing[key]) {\n diffs.push(key);\n }\n }\n\n return diffs;\n}\n\n// remove undefined entries recursively\nfunction removeUndefined(obj: any): any {\n if (Array.isArray(obj)) {\n const arr = obj.map(v => (v && typeof v === 'object' ? removeUndefined(v) : v)).filter(v => v !== undefined);\n if (!arr.length) {\n return undefined;\n }\n return arr;\n }\n if (obj && typeof obj === 'object') {\n const _obj = Object.fromEntries(\n Object.entries(obj)\n .map(([k, v]) => [k, v && typeof v === 'object' ? removeUndefined(v) : v])\n .filter(\n ([_, v]) =>\n v !== undefined &&\n v !== null &&\n v !== '' &&\n !(Array.isArray(v) && v.length === 0) &&\n !(typeof v === 'object' && Object.keys(v).length === 0),\n ),\n );\n if (Object.keys(_obj).length === 0) {\n return undefined;\n }\n return _obj;\n }\n if (obj === '') {\n return undefined;\n }\n return obj;\n}\n\nfunction cleanContainerConfig(obj: ContainerConfig): ContainerConfig {\n obj = removeUndefined(obj);\n\n Object.keys(obj).forEach(name => {\n if (isDefault((obj as any)[name], (dockerDefaults as any)[name])) {\n delete (obj as any)[name];\n }\n if (name === 'mounts') {\n if (!obj.mounts) {\n delete obj.mounts;\n return;\n }\n obj.mounts = obj.mounts.map((mount: any) => {\n const m = { ...mount };\n delete m.readOnly;\n return m;\n });\n if (!obj.mounts.length) {\n delete obj.mounts;\n return;\n }\n obj.mounts?.sort((a, b) => a.target.localeCompare(b.target));\n }\n if (name === 'ports') {\n if (!obj.ports) {\n delete obj.ports;\n return;\n }\n obj.ports = obj.ports.map((port: any) => {\n const p = { ...port };\n if (p.protocol === 'tcp') {\n delete p.protocol;\n }\n return p;\n });\n if (!obj.ports.length) {\n delete obj.ports;\n return;\n }\n obj.ports?.sort((a, b) => {\n if (a.hostPort !== b.hostPort) {\n return parseInt(a.containerPort as string, 10) - parseInt(b.containerPort as string, 10);\n }\n if (a.hostIP !== b.hostIP && a.hostIP && b.hostIP) {\n return a.hostIP?.localeCompare(b.hostIP);\n }\n return 0;\n });\n }\n if (name === 'environment') {\n if (!obj.environment) {\n delete obj.environment;\n return;\n }\n const env = obj.environment as { [key: string]: string };\n if (Object.keys(env).length) {\n obj.environment = {};\n Object.keys(env)\n .sort()\n .forEach(key => {\n if (key && env[key]) {\n (obj.environment as any)[key] = env[key];\n }\n });\n } else {\n delete obj.environment;\n }\n }\n });\n\n obj.volumes?.sort();\n return obj;\n}\n\nexport default class DockerManager {\n protected installed: boolean = false;\n protected dockerVersion: string = '';\n protected needSudo: boolean = false;\n readonly #waitReady: Promise<void>;\n readonly adapter: ioBroker.Adapter;\n readonly #ownContainers: ContainerConfig[] = [];\n #monitoringInterval: NodeJS.Timeout | null = null;\n #ownContainersStats: { [name: string]: ContainerStatus } = {};\n\n constructor(adapter: ioBroker.Adapter, containers?: ContainerConfig[]) {\n this.adapter = adapter;\n this.#ownContainers = containers || [];\n this.#waitReady = new Promise<void>(resolve => this.#init().then(() => resolve()));\n }\n\n /** Wait till the check if docker is installed and the daemon is running is ready */\n isReady(): Promise<void> {\n return this.#waitReady;\n }\n\n /**\n * Convert information from inspect to docker configuration to start it\n *\n * @param inspect Inspect information\n */\n static mapInspectToConfig(inspect: DockerContainerInspect): ContainerConfig {\n const obj: ContainerConfig = {\n image: inspect.Config.Image,\n name: inspect.Name.replace(/^\\//, ''),\n command: inspect.Config.Cmd ?? undefined,\n entrypoint: inspect.Config.Entrypoint ?? undefined,\n user: inspect.Config.User ?? undefined,\n workdir: inspect.Config.WorkingDir ?? undefined,\n hostname: inspect.Config.Hostname ?? undefined,\n domainname: inspect.Config.Domainname ?? undefined,\n macAddress: inspect.NetworkSettings.MacAddress ?? undefined,\n environment: inspect.Config.Env\n ? Object.fromEntries(\n inspect.Config.Env.map(e => {\n const [key, ...rest] = e.split('=');\n return [key, rest.join('=')];\n }),\n )\n : undefined,\n labels: inspect.Config.Labels ?? undefined,\n tty: inspect.Config.Tty,\n stdinOpen: inspect.Config.OpenStdin,\n attachStdin: inspect.Config.AttachStdin,\n attachStdout: inspect.Config.AttachStdout,\n attachStderr: inspect.Config.AttachStderr,\n openStdin: inspect.Config.OpenStdin,\n publishAllPorts: inspect.HostConfig.PublishAllPorts,\n ports: inspect.HostConfig.PortBindings\n ? Object.entries(inspect.HostConfig.PortBindings).flatMap(([containerPort, bindings]) =>\n bindings.map(binding => ({\n containerPort: containerPort.split('/')[0],\n protocol: (containerPort.split('/')[1] as 'tcp' | 'udp') || 'tcp',\n hostPort: binding.HostPort,\n hostIP: binding.HostIp,\n })),\n )\n : undefined,\n mounts: inspect.Mounts?.map(mount => ({\n type: mount.Type,\n source: mount.Source,\n target: mount.Destination,\n readOnly: mount.RW,\n })),\n volumes: inspect.Config.Volumes ? Object.keys(inspect.Config.Volumes) : undefined,\n extraHosts: inspect.HostConfig.ExtraHosts ?? undefined,\n dns: {\n servers: inspect.HostConfig.Dns,\n search: inspect.HostConfig.DnsSearch,\n options: inspect.HostConfig.DnsOptions,\n },\n networkMode: inspect.HostConfig.NetworkMode,\n networks: inspect.NetworkSettings.Networks\n ? Object.entries(inspect.NetworkSettings.Networks).map(([name, net]) => ({\n name,\n aliases: net.Aliases ?? undefined,\n ipv4Address: net.IPAddress,\n ipv6Address: net.GlobalIPv6Address,\n driverOpts: net.DriverOpts ?? undefined,\n }))\n : undefined,\n restart: {\n policy: inspect.HostConfig.RestartPolicy.Name as any,\n maxRetries: inspect.HostConfig.RestartPolicy.MaximumRetryCount,\n },\n resources: {\n cpuShares: inspect.HostConfig.CpuShares,\n cpuQuota: inspect.HostConfig.CpuQuota,\n cpuPeriod: inspect.HostConfig.CpuPeriod,\n cpusetCpus: inspect.HostConfig.CpusetCpus,\n memory: inspect.HostConfig.Memory,\n memorySwap: inspect.HostConfig.MemorySwap,\n memoryReservation: inspect.HostConfig.MemoryReservation,\n pidsLimit: inspect.HostConfig.PidsLimit ?? undefined,\n shmSize: inspect.HostConfig.ShmSize,\n readOnlyRootFilesystem: inspect.HostConfig.ReadonlyRootfs,\n },\n logging: {\n driver: inspect.HostConfig.LogConfig.Type,\n options: inspect.HostConfig.LogConfig.Config,\n },\n security: {\n privileged: inspect.HostConfig.Privileged,\n capAdd: inspect.HostConfig.CapAdd ?? undefined,\n capDrop: inspect.HostConfig.CapDrop ?? undefined,\n usernsMode: inspect.HostConfig.UsernsMode ?? undefined,\n ipc: inspect.HostConfig.IpcMode,\n pid: inspect.HostConfig.PidMode,\n seccomp:\n inspect.HostConfig.SecurityOpt?.find(opt => opt.startsWith('seccomp='))?.split('=')[1] ?? undefined,\n apparmor: inspect.AppArmorProfile,\n groupAdd: inspect.HostConfig.GroupAdd ?? undefined,\n noNewPrivileges: undefined, // Nicht direkt verfügbar\n },\n sysctls: inspect.HostConfig.Sysctls ?? undefined,\n init: inspect.HostConfig.Init ?? undefined,\n stop: {\n signal: inspect.Config.StopSignal ?? undefined,\n gracePeriodSec: inspect.Config.StopTimeout ?? undefined,\n },\n readOnly: inspect.HostConfig.ReadonlyRootfs,\n timezone: undefined, // Nicht direkt verfügbar\n __meta: undefined, // Eigene Metadaten\n };\n\n return cleanContainerConfig(obj);\n }\n\n /**\n * Get information about the Docker daemon: is it running and which version\n *\n * @returns Object with version and daemonRunning\n */\n async getDockerDaemonInfo(): Promise<{\n version?: string;\n daemonRunning?: boolean;\n }> {\n await this.isReady();\n const daemonRunning = await this.#isDockerDaemonRunning();\n return {\n version: this.dockerVersion,\n daemonRunning,\n };\n }\n\n async #init(): Promise<void> {\n const version = await this.#isDockerInstalled();\n this.installed = !!version;\n if (version) {\n this.dockerVersion = version;\n } else {\n const daemonRunning = await this.#isDockerDaemonRunning();\n if (daemonRunning) {\n // Docker daemon is running, but docker command not found\n this.adapter.log.warn(\n 'Docker daemon is running, but docker command not found. May be \"iobroker\" user has no access to Docker. Run \"iob fix\" command to fix it.',\n );\n } else {\n this.adapter.log.warn('Docker is not installed. Please install Docker.');\n }\n }\n if (this.installed) {\n this.needSudo = await this.#isNeedSudo();\n await this.#checkOwnContainers();\n }\n }\n\n async #isDockerDaemonRunning(): Promise<boolean> {\n try {\n const { stdout, stderr } = await execPromise('systemctl status docker');\n // ● docker.service - Docker Application Container Engine\n // Loaded: loaded (/lib/systemd/system/docker.service; enabled; preset: enabled)\n // Active: active (running) since Fri 2025-08-15 08:37:22 CEST; 3 weeks 2 days ago\n // TriggeredBy: ● docker.socket\n // Docs: https://docs.docker.com\n // Main PID: 785 (dockerd)\n // Tasks: 30\n // CPU: 4min 17.003s\n // CGroup: /system.slice/docker.service\n // ├─ 785 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock\n // ├─97032 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5000 -container-ip 172.17.0.2 -container-port 5000 -use-listen-fd\n // └─97039 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 5000 -container-ip 172.17.0.2 -container-port 5000 -use-listen-fd\n if (stderr?.includes('could not be found') || stderr.includes('not-found')) {\n this.adapter.log.error(`Docker is not installed: ${stderr}`);\n return false;\n }\n\n return stdout.includes('(running)');\n } catch {\n return false;\n }\n }\n\n /**\n * Ensure that the given container is running with the actual configuration\n *\n * @param container Container configuration\n */\n async #ensureActualConfiguration(container: ContainerConfig): Promise<void> {\n // Check the configuration of the container\n const inspect = await this.containerInspect(container.name);\n if (inspect) {\n const existingConfig = DockerManager.mapInspectToConfig(inspect);\n console.log('Compare existing config', existingConfig, ' and', container);\n container = cleanContainerConfig(container);\n const diffs = compareConfigs(container, existingConfig);\n if (diffs.length) {\n this.adapter.log.info(\n `Configuration of own container ${container.name} has changed: ${diffs.join(\n ', ',\n )}. Restarting container...`,\n );\n const result = await this.containerReCreate(container);\n if (result.stderr) {\n this.adapter.log.warn(`Cannot recreate own container ${container.name}: ${result.stderr}`);\n }\n }\n\n // Check if container is running\n this.adapter.log.debug(`Configuration of own container ${container.name} is up to date`);\n const status = await this.containerList(true);\n const containerInfo = status.find(it => it.names === container.name);\n if (containerInfo) {\n if (containerInfo.status !== 'running' && containerInfo.status !== 'restarting') {\n // Start the container\n this.adapter.log.info(`Starting own container ${container.name}`);\n try {\n const result = await this.containerStart(containerInfo.id);\n if (result.stderr) {\n this.adapter.log.warn(`Cannot start own container ${container.name}: ${result.stderr}`);\n }\n } catch (e) {\n this.adapter.log.warn(`Cannot start own container ${container.name}: ${e.message}`);\n }\n } else {\n this.adapter.log.debug(`Own container ${container.name} is already running`);\n }\n } else {\n this.adapter.log.warn(`Own container ${container.name} not found in container list after recreation`);\n }\n }\n }\n\n async #checkOwnContainers(): Promise<void> {\n if (!this.#ownContainers.length) {\n return;\n }\n const status = await this.containerList(true);\n let images = await this.imageList();\n let anyStartedOrRunning = false;\n const networkChecked: string[] = [];\n for (let c = 0; c < this.#ownContainers.length; c++) {\n const container = this.#ownContainers[c];\n if (container.iobEnabled !== false) {\n if (!container.image.includes(':')) {\n container.image += ':latest';\n }\n\n try {\n // create iobroker network if necessary\n if (\n container.networkMode &&\n container.networkMode !== 'container' &&\n container.networkMode !== 'host' &&\n container.networkMode !== 'bridge' &&\n container.networkMode !== 'none'\n ) {\n if (!networkChecked.includes(container.networkMode)) {\n // check if the network exists\n const networks = await this.networkList();\n if (!networks.find(it => it.name === container.networkMode)) {\n this.adapter.log.info(`Creating docker network ${container.networkMode}`);\n await this.networkCreate(container.networkMode);\n }\n\n networkChecked.push(container.networkMode);\n }\n }\n let containerInfo = status.find(it => it.names === container.name);\n let image = images.find(it => `${it.repository}:${it.tag}` === container.image);\n if (container.iobAutoImageUpdate) {\n // ensure that the image is actual\n const newImage = await this.imageUpdate(container.image, true);\n if (newImage) {\n this.adapter.log.info(\n `Image ${container.image} for own container ${container.name} was updated`,\n );\n if (containerInfo) {\n // destroy current container\n await this.containerRemove(containerInfo.id);\n containerInfo = undefined;\n }\n image = newImage;\n }\n }\n if (!image) {\n this.adapter.log.info(`Pulling image ${container.image} for own container ${container.name}`);\n try {\n const result = await this.imagePull(container.image);\n if (result.stderr) {\n this.adapter.log.warn(`Cannot pull image ${container.image}: ${result.stderr}`);\n continue;\n }\n } catch (e) {\n this.adapter.log.warn(`Cannot pull image ${container.image}: ${e.message}`);\n continue;\n }\n // Check that image is available now\n images = await this.imageList();\n image = images.find(it => `${it.repository}:${it.tag}` === container.image);\n if (!image) {\n this.adapter.log.warn(\n `Image ${container.image} for own container ${container.name} not found after pull`,\n );\n continue;\n }\n }\n\n if (containerInfo) {\n await this.#ensureActualConfiguration(container);\n anyStartedOrRunning ||= !!container.iobMonitoringEnabled;\n } else {\n // Create and start the container, as the container was not found\n this.adapter.log.info(`Creating and starting own container ${container.name}`);\n\n try {\n const result = await this.containerRun(container);\n if (result.stderr) {\n this.adapter.log.warn(`Cannot start own container ${container.name}: ${result.stderr}`);\n } else {\n anyStartedOrRunning ||= !!container.iobMonitoringEnabled;\n }\n } catch (e) {\n this.adapter.log.warn(`Cannot start own container ${container.name}: ${e.message}`);\n }\n }\n } catch (e) {\n this.adapter.log.warn(`Cannot check own container ${container.name}: ${e.message}`);\n }\n }\n }\n\n if (anyStartedOrRunning) {\n this.#monitoringInterval ||= setInterval(() => this.#monitorOwnContainers(), 60000);\n }\n }\n\n async #monitorOwnContainers(): Promise<void> {\n // get the status of containers\n const containers = await this.containerList();\n // Check the status of own containers\n for (let c = 0; c < this.#ownContainers.length; c++) {\n const container = this.#ownContainers[c];\n if (container.iobEnabled !== false && container.iobMonitoringEnabled) {\n // Check if container is running\n const running = containers.find(it => it.names === container.name);\n if (!running || (running.status !== 'running' && running.status !== 'restarting')) {\n this.adapter.log.warn(`Own container ${container.name} is not running. Restarting...`);\n try {\n const result = await this.containerStart(container.name);\n if (result.stderr) {\n this.adapter.log.warn(`Cannot start own container ${container.name}: ${result.stderr}`);\n this.#ownContainersStats[container.name] = {\n ...this.#ownContainersStats[container.name],\n status: running?.status || 'unknown',\n statusTs: Date.now(),\n };\n continue;\n }\n } catch (e) {\n this.adapter.log.warn(`Cannot start own container ${container.name}: ${e.message}`);\n this.#ownContainersStats[container.name] = {\n ...this.#ownContainersStats[container.name],\n status: running?.status || 'unknown',\n statusTs: Date.now(),\n };\n continue;\n }\n }\n\n // check the stats\n this.#ownContainersStats[container.name] = {\n ...((await this.containerGetRamAndCpuUsage(container.name)) || ({} as ContainerStats)),\n status: running?.status || 'unknown',\n statusTs: Date.now(),\n };\n }\n }\n }\n\n /** Read own container stats */\n getOwnContainerStats(): { [name: string]: ContainerStatus } {\n return this.#ownContainersStats;\n }\n\n async containerGetRamAndCpuUsage(containerNameOrId: ContainerName): Promise<ContainerStats | null> {\n try {\n const { stdout } = await this.#exec(\n `stats ${containerNameOrId} --no-stream --format \"{{.CPUPerc}};{{.MemUsage}};{{.NetIO}};{{.BlockIO}};{{.PIDs}}\"`,\n );\n // Example: \"0.15%;12.34MiB / 512MiB;1.2kB / 2.3kB;0B / 0B;5\"\n const [cpuStr, memStr, netStr, blockIoStr, pid] = stdout.trim().split(';');\n const [memUsed, memMax] = memStr.split('/').map(it => it.trim());\n const [netRead, netWrite] = netStr.split('/').map(it => it.trim());\n const [blockIoRead, blockIoWrite] = blockIoStr.split('/').map(it => it.trim());\n\n return {\n ts: Date.now(),\n cpu: parseFloat(cpuStr.replace('%', '').replace(',', '.')),\n memUsed: this.#parseSize(memUsed.replace('iB', 'B')),\n memMax: this.#parseSize(memMax.replace('iB', 'B')),\n netRead: this.#parseSize(netRead.replace('iB', 'B')),\n netWrite: this.#parseSize(netWrite.replace('iB', 'B')),\n processes: parseInt(pid, 10),\n blockIoRead: this.#parseSize(blockIoRead.replace('iB', 'B')),\n blockIoWrite: this.#parseSize(blockIoWrite.replace('iB', 'B')),\n };\n } catch (e) {\n this.adapter.log.debug(`Cannot get stats: ${e.message}`);\n return null;\n }\n }\n\n /**\n * Update the image if a newer version is available\n *\n * @param image Image name with tag\n * @param ignoreIfNotExist If true, do not throw error if image does not exist\n * @returns New image info if image was updated, null if no update was necessary\n */\n async imageUpdate(image: ImageName, ignoreIfNotExist?: boolean): Promise<ImageInfo | null> {\n const list = await this.imageList();\n if (!image.includes(':')) {\n image += ':latest';\n }\n const existingImage = list.find(it => `${it.repository}:${it.tag}` === image);\n if (!existingImage && !ignoreIfNotExist) {\n throw new Error(`Image ${image} not found`);\n }\n // Pull the image\n const result = await this.imagePull(image);\n if (result.stderr) {\n throw new Error(`Cannot pull image ${image}: ${result.stderr}`);\n }\n const newList = await this.imageList();\n const newImage = newList.find(it => `${it.repository}:${it.tag}` === image);\n if (!newImage) {\n throw new Error(`Image ${image} not found after pull`);\n }\n // If image ID has changed, image was updated\n return !existingImage || existingImage.id !== newImage.id ? newImage : null;\n }\n\n #exec(command: string): Promise<{ stdout: string; stderr: string }> {\n if (!this.installed) {\n return Promise.reject(new Error('Docker is not installed'));\n }\n const finalCommand = this.needSudo ? `sudo docker ${command}` : `docker ${command}`;\n return execPromise(finalCommand);\n }\n\n async #isDockerInstalled(): Promise<string | false> {\n try {\n const result = await execPromise('docker --version');\n if (!result.stderr && result.stdout) {\n // \"Docker version 28.3.2, build 578ccf6\\n\"\n return result.stdout.split('\\n')[0].trim();\n }\n this.adapter.log.debug(`Docker not installed: ${result.stderr}`);\n } catch (e) {\n this.adapter.log.debug(`Docker not installed: ${e.message}`);\n }\n return false;\n }\n\n async #isNeedSudo(): Promise<boolean> {\n try {\n await execPromise('docker ps');\n return false;\n } catch {\n return true;\n }\n }\n\n /** Get disk usage information */\n async discUsage(): Promise<DiskUsage> {\n const { stdout } = await this.#exec(`system df`);\n const result: DiskUsage = { total: { size: 0, reclaimable: 0 } };\n // parse the output\n // TYPE TOTAL ACTIVE SIZE RECLAIMABLE\n // Images 2 1 2.715GB 2.715GB (99%)\n // Containers 1 1 26.22MB 0B (0%)\n // Local Volumes 0 0 0B 0B\n // Build Cache 0 0 0B 0B\n const lines = stdout.split('\\n');\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 5 && parts[0] !== 'TYPE') {\n let size: number | undefined;\n let reclaimable: number | undefined;\n\n if (parts[0] === 'Images') {\n const sizeStr = parts[3];\n const reclaimableStr = parts[4].split(' ')[0];\n size = this.#parseSize(sizeStr);\n reclaimable = this.#parseSize(reclaimableStr);\n result.images = {\n total: parseInt(parts[1], 10),\n active: parseInt(parts[2], 10),\n size,\n reclaimable: reclaimable,\n };\n } else if (parts[0] === 'Containers') {\n const sizeStr = parts[3];\n const reclaimableStr = parts[4].split(' ')[0];\n size = this.#parseSize(sizeStr);\n reclaimable = this.#parseSize(reclaimableStr);\n result.containers = {\n total: parseInt(parts[1], 10),\n active: parseInt(parts[2], 10),\n size,\n reclaimable: reclaimable,\n };\n } else if (parts[0] === 'Local' && parts[1] === 'Volumes') {\n const sizeStr = parts[4];\n const reclaimableStr = parts[5].split(' ')[0];\n size = this.#parseSize(sizeStr);\n reclaimable = this.#parseSize(reclaimableStr);\n result.volumes = {\n total: parseInt(parts[2], 10),\n active: parseInt(parts[3], 10),\n size,\n reclaimable: reclaimable,\n };\n } else if (parts[0] === 'Build' && parts[1] === 'Cache') {\n const sizeStr = parts[4];\n const reclaimableStr = parts[5].split(' ')[0];\n size = this.#parseSize(sizeStr);\n reclaimable = this.#parseSize(reclaimableStr);\n result.buildCache = {\n total: parseInt(parts[2], 10),\n active: parseInt(parts[3], 10),\n size,\n reclaimable: reclaimable,\n };\n }\n result.total.size += size || 0;\n result.total.reclaimable += reclaimable || 0;\n }\n }\n return result;\n }\n\n /** Pull an image from the registry */\n async imagePull(image: ImageName): Promise<{ stdout: string; stderr: string; images?: ImageInfo[] }> {\n try {\n if (!image.includes(':')) {\n image += ':latest';\n }\n const result = await this.#exec(`pull ${image}`);\n const images = await this.imageList();\n if (!images.find(it => `${it.repository}:${it.tag}` === image)) {\n throw new Error(`Image ${image} not found after pull`);\n }\n return { ...result, images };\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /** Autocomplete image names from Docker Hub */\n async imageNameAutocomplete(partialName: string): Promise<\n {\n name: string;\n description: string;\n isOfficial: boolean;\n starCount: number;\n }[]\n > {\n try {\n // Read stars and descriptions\n const { stdout } = await this.#exec(\n `search ${partialName} --format \"{{.Name}};{{.Description}};{{.IsOfficial}};{{.StarCount}}\" --limit 50`,\n );\n return stdout\n .split('\\n')\n .filter(line => line.trim() !== '')\n .map(line => {\n const [name, description, isOfficial, starCount] = line.split(';');\n return {\n name,\n description,\n isOfficial: isOfficial === 'true',\n starCount: parseInt(starCount, 10) || 0,\n };\n });\n } catch (e) {\n this.adapter.log.debug(`Cannot search images: ${e.message}`);\n return [];\n }\n }\n\n /**\n * Create and start a container with the given configuration. No checks are done.\n */\n async containerRun(config: ContainerConfig): Promise<{ stdout: string; stderr: string }> {\n try {\n return await this.#exec(`run ${this.#toDockerRun(config)}`);\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /**\n * Create a container with the given configuration without starting it. No checks are done.\n */\n async containerCreate(config: ContainerConfig): Promise<{ stdout: string; stderr: string }> {\n try {\n return await this.#exec(`create ${this.#toDockerRun(config, true)}`);\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /**\n * Recreate a container\n *\n * This function checks if a container is running, stops it if necessary,\n * removes it and creates a new one with the given configuration.\n *\n * @param config new configuration\n * @returns stdout and stderr of the create command\n */\n async containerReCreate(config: ContainerConfig): Promise<{ stdout: string; stderr: string }> {\n try {\n // Get if the container is running\n let containers = await this.containerList();\n // find ID of container\n const containerInfo = containers.find(it => it.names === config.name);\n if (containerInfo) {\n if (containerInfo.status === 'running' || containerInfo.status === 'restarting') {\n const stopResult = await this.#exec(`stop ${containerInfo.id}`);\n containers = await this.containerList();\n\n if (containers.find(it => it.id === containerInfo.id && it.status === 'running')) {\n this.adapter.log.warn(`Cannot remove container: ${stopResult.stderr || stopResult.stdout}`);\n throw new Error(`Container ${containerInfo.id} still running after stop`);\n }\n }\n // Remove container\n const rmResult = await this.#exec(`rm ${containerInfo.id}`);\n\n containers = await this.containerList();\n if (containers.find(it => it.id === containerInfo.id)) {\n this.adapter.log.warn(`Cannot remove container: ${rmResult.stderr || rmResult.stdout}`);\n throw new Error(`Container ${containerInfo.id} still found after stop`);\n }\n }\n return await this.#exec(`create ${this.#toDockerRun(config, true)}`);\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /** List all images */\n async imageList(): Promise<ImageInfo[]> {\n try {\n const { stdout } = await this.#exec(\n 'images --format \"{{.Repository}}:{{.Tag}};{{.ID}};{{.CreatedAt}};{{.Size}}\"',\n );\n return stdout\n .split('\\n')\n .filter(line => line.trim() !== '')\n .map(line => {\n const [repositoryTag, id, createdSince, size] = line.split(';');\n const [repository, tag] = repositoryTag.split(':');\n return {\n repository,\n tag,\n id,\n createdSince,\n size: this.#parseSize(size),\n };\n });\n } catch (e) {\n this.adapter.log.debug(`Cannot list images: ${e.message}`);\n return [];\n }\n }\n\n /** Build an image from a Dockerfile */\n async imageBuild(dockerfilePath: string, tag: string): Promise<{ stdout: string; stderr: string }> {\n try {\n return await this.#exec(`build -t ${tag} -f ${dockerfilePath} .`);\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /** Tag an image with a new tag */\n async imageTag(imageId: ImageName, newTag: string): Promise<{ stdout: string; stderr: string }> {\n try {\n return await this.#exec(`tag ${imageId} ${newTag}`);\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /** Remove an image */\n async imageRemove(imageId: ImageName): Promise<{ stdout: string; stderr: string; images?: ImageInfo[] }> {\n try {\n const result = await this.#exec(`rmi ${imageId}`);\n const images = await this.imageList();\n if (images.find(it => `${it.repository}:${it.tag}` === imageId)) {\n return { stdout: '', stderr: `Image ${imageId} still found after deletion`, images };\n }\n return { ...result, images };\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /** Inspect an image */\n async imageInspect(imageId: ImageName): Promise<DockerImageInspect | null> {\n try {\n const { stdout } = await this.#exec(`inspect ${imageId}`);\n return JSON.parse(stdout)[0];\n } catch (e) {\n this.adapter.log.debug(`Cannot inspect image: ${e.message.toString()}`);\n return null;\n }\n }\n\n #parseSize(sizeStr: string): number {\n const units: { [key: string]: number } = {\n B: 1,\n KB: 1024,\n MB: 1024 * 1024,\n GB: 1024 * 1024 * 1024,\n TB: 1024 * 1024 * 1024 * 1024,\n };\n const match = sizeStr.match(/^([\\d.]+)([KMGTP]?B)$/);\n if (match) {\n const value = parseFloat(match[1]);\n const unit = match[2];\n return value * (units[unit] || 1);\n }\n return 0;\n }\n\n /**\n * Stop a container\n *\n * @param container Container name or ID\n */\n async containerStop(\n container: ContainerName,\n ): Promise<{ stdout: string; stderr: string; containers?: ContainerInfo[] }> {\n try {\n let containers = await this.containerList();\n // find ID of container\n const containerInfo = containers.find(it => it.names === container || it.id === container);\n if (!containerInfo) {\n throw new Error(`Container ${container} not found`);\n }\n\n const result = await this.#exec(`stop ${containerInfo.id}`);\n containers = await this.containerList();\n if (containers.find(it => it.id === containerInfo.id && it.status === 'running')) {\n throw new Error(`Container ${container} still running after stop`);\n }\n return { ...result, containers };\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /**\n * Start a container\n *\n * @param container Container name or ID\n */\n async containerStart(\n container: ContainerName,\n ): Promise<{ stdout: string; stderr: string; containers?: ContainerInfo[] }> {\n try {\n let containers = await this.containerList();\n // find ID of container\n const containerInfo = containers.find(it => it.names === container || it.id === container);\n if (!containerInfo) {\n throw new Error(`Container ${container} not found`);\n }\n\n const result = await this.#exec(`start ${containerInfo.id}`);\n containers = await this.containerList();\n if (\n containers.find(\n it => it.id === containerInfo.id && it.status !== 'running' && it.status !== 'restarting',\n )\n ) {\n throw new Error(`Container ${container} still running after stop`);\n }\n return { ...result, containers };\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /**\n * Restart a container\n *\n * This function restarts a container by its name or ID.\n * It accepts an optional timeout in seconds to wait before killing the container (default is 5 seconds).\n *\n * @param container Container name or ID\n * @param timeoutSeconds Timeout in seconds to wait before killing the container (default: 5)\n */\n async containerRestart(\n container: ContainerName,\n timeoutSeconds?: number,\n ): Promise<{ stdout: string; stderr: string }> {\n try {\n const containers = await this.containerList();\n // find ID of container\n const containerInfo = containers.find(it => it.names === container || it.id === container);\n if (!containerInfo) {\n throw new Error(`Container ${container} not found`);\n }\n\n return await this.#exec(`restart -t ${timeoutSeconds || 5} ${containerInfo.id}`);\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /**\n * Remove the container and if necessary, stop it first\n *\n * @param container Container name or ID\n */\n async containerRemove(\n container: ContainerName,\n ): Promise<{ stdout: string; stderr: string; containers?: ContainerInfo[] }> {\n try {\n let containers = await this.containerList();\n // find ID of container\n const containerInfo = containers.find(it => it.names === container || it.id === container);\n if (!containerInfo) {\n throw new Error(`Container ${container} not found`);\n }\n // ensure that container is stopped\n if (containerInfo.status === 'running' || containerInfo.status === 'restarting') {\n // stop container\n const result = await this.#exec(`stop ${containerInfo.id}`);\n if (result.stderr) {\n throw new Error(`Cannot stop container ${container}: ${result.stderr}`);\n }\n }\n\n const result = await this.#exec(`rm ${container}`);\n\n containers = await this.containerList();\n if (containers.find(it => it.id === containerInfo.id)) {\n throw new Error(`Container ${container} still found after stop`);\n }\n return { ...result, containers };\n } catch (e) {\n return { stdout: '', stderr: e.message.toString() };\n }\n }\n\n /**\n * List all containers\n *\n * @param all If true, list all containers. If false, list only running containers. Default is true.\n */\n async containerList(all: boolean = true): Promise<ContainerInfo[]> {\n try {\n const { stdout } = await this.#exec(\n `ps ${all ? '-a' : ''} --format \"{{.Names}};{{.Status}};{{.ID}};{{.Image}};{{.Command}};{{.CreatedAt}};{{.Ports}}\"`,\n );\n return stdout\n .split('\\n')\n .filter(line => line.trim() !== '')\n .map(line => {\n const [names, statusInfo, id, image, command, createdAt, ports] = line.split(';');\n const [status, ...uptime] = statusInfo.split(' ');\n let statusKey: ContainerInfo['status'] = status.toLowerCase() as ContainerInfo['status'];\n if ((statusKey as string) === 'up') {\n statusKey = 'running';\n }\n return { id, image, command, createdAt, status: statusKey, uptime: uptime.join(' '), ports, names };\n });\n } catch (e) {\n this.adapter.log.debug(`Cannot list containers: ${e.message}`);\n return [];\n }\n }\n\n /**\n * Get the logs of a container\n *\n * @param containerNameOrId Container name or ID\n * @param options Options for logs\n * @param options.tail Number of lines to show from the end of the logs\n * @param options.follow If true, follow the logs (not implemented yet)\n */\n async containerLogs(\n containerNameOrId: ContainerName,\n options: { tail?: number; follow?: boolean } = {},\n ): Promise<string[]> {\n try {\n const args = [];\n if (options.tail !== undefined) {\n args.push(`--tail ${options.tail}`);\n }\n if (options.follow) {\n args.push(`--follow`);\n throw new Error('Follow option is not implemented yet');\n }\n const result = await this.#exec(`logs${args.length ? ` ${args.join(' ')}` : ''} ${containerNameOrId}`);\n return (result.stdout || result.stderr).split('\\n').filter(line => line.trim() !== '');\n } catch (e) {\n return e\n .toString()\n .split('\\n')\n .map((line: string): string => line.trim());\n }\n }\n\n /** Inspect a container */\n async containerInspect(containerNameOrId: string): Promise<DockerContainerInspect | null> {\n try {\n const { stdout } = await this.#exec(`inspect ${containerNameOrId}`);\n const result = JSON.parse(stdout)[0] as DockerContainerInspect;\n if (result.State.Running) {\n result.Stats = (await this.containerGetRamAndCpuUsage(containerNameOrId)) || undefined;\n }\n return result;\n } catch (e) {\n this.adapter.log.debug(`Cannot inspect container: ${e.message.toString()}`);\n return null;\n }\n }\n\n /**\n * Build a docker run command string from ContainerConfig\n */\n #toDockerRun(config: ContainerConfig, create?: boolean): string {\n const args: string[] = [];\n\n // detach / interactive\n if (config.detach !== false && !create) {\n // default is true\n args.push('-d');\n }\n if (config.tty) {\n args.push('-t');\n }\n if (config.stdinOpen) {\n args.push('-i');\n }\n if (config.removeOnExit) {\n args.push('--rm');\n }\n\n // name\n if (config.name) {\n args.push('--name', config.name);\n }\n\n // hostname / domain\n if (config.hostname) {\n args.push('--hostname', config.hostname);\n }\n if (config.domainname) {\n args.push('--domainname', config.domainname);\n }\n\n // environment\n if (config.environment) {\n for (const [key, value] of Object.entries(config.environment)) {\n if (key && value) {\n args.push('-e', `${key}=${value}`);\n }\n }\n }\n if (config.envFile) {\n for (const file of config.envFile) {\n args.push('--env-file', file);\n }\n }\n\n // labels\n if (config.labels) {\n for (const [key, value] of Object.entries(config.labels)) {\n args.push('--label', `${key}=${value}`);\n }\n }\n\n // ports\n if (config.publishAllPorts) {\n args.push('-P');\n }\n if (config.ports) {\n for (const p of config.ports) {\n if (!p.containerPort) {\n continue;\n }\n const mapping =\n (p.hostIP ? `${p.hostIP}:` : '') +\n (p.hostPort ? `${p.hostPort}:` : '') +\n p.containerPort +\n (p.protocol ? `/${p.protocol}` : '');\n args.push('-p', mapping);\n }\n }\n\n // volumes / mounts\n if (config.volumes) {\n for (const v of config.volumes) {\n args.push('-v', v);\n }\n }\n if (config.mounts) {\n for (const m of config.mounts) {\n let mount = `type=${m.type},target=${m.target}`;\n if (m.source) {\n mount += `,source=${m.source}`;\n }\n if (m.readOnly) {\n mount += `,readonly`;\n }\n args.push('--mount', mount);\n }\n }\n\n // restart policy\n if (config.restart?.policy) {\n const val =\n config.restart.policy === 'on-failure' && config.restart.maxRetries\n ? `on-failure:${config.restart.maxRetries}`\n : config.restart.policy;\n args.push('--restart', val);\n }\n\n // user & workdir\n if (config.user) {\n args.push('--user', String(config.user));\n }\n if (config.workdir) {\n args.push('--workdir', config.workdir);\n }\n\n // logging\n if (config.logging?.driver) {\n args.push('--log-driver', config.logging.driver);\n if (config.logging.options) {\n for (const [k, v] of Object.entries(config.logging.options)) {\n args.push('--log-opt', `${k}=${v}`);\n }\n }\n }\n\n // security\n if (config.security?.privileged) {\n args.push('--privileged');\n }\n if (config.security?.capAdd) {\n for (const cap of config.security.capAdd) {\n args.push('--cap-add', cap);\n }\n }\n if (config.security?.capDrop) {\n for (const cap of config.security.capDrop) {\n args.push('--cap-drop', cap);\n }\n }\n if (config.security?.noNewPrivileges) {\n args.push('--security-opt', 'no-new-privileges');\n }\n if (config.security?.apparmor) {\n args.push('--security-opt', `apparmor=${config.security.apparmor}`);\n }\n\n // network\n if (config.networkMode) {\n args.push('--network', config.networkMode);\n }\n\n // extra hosts\n if (config.extraHosts) {\n for (const host of config.extraHosts as any[]) {\n if (typeof host === 'string') {\n args.push('--add-host', host);\n } else {\n args.push('--add-host', `${host.host}:${host.ip}`);\n }\n }\n }\n\n // sysctls\n if (config.sysctls) {\n for (const [k, v] of Object.entries(config.sysctls)) {\n args.push('--sysctl', `${k}=${v}`);\n }\n }\n\n // stop signal / timeout\n if (config.stop?.signal) {\n args.push('--stop-signal', config.stop.signal);\n }\n if (config.stop?.gracePeriodSec !== undefined) {\n args.push('--stop-timeout', String(config.stop.gracePeriodSec));\n }\n\n // resources\n if (config.resources?.cpus) {\n args.push('--cpus', String(config.resources.cpus));\n }\n if (config.resources?.memory) {\n args.push('--memory', String(config.resources.memory));\n }\n\n // image\n if (!config.image) {\n throw new Error('ContainerConfig.image is required for docker run');\n }\n args.push(config.image);\n\n // command override\n if (config.command) {\n if (Array.isArray(config.command)) {\n args.push(...config.command);\n } else {\n args.push(config.command);\n }\n }\n\n return args.join(' ');\n }\n\n async networkList(): Promise<NetworkInfo[]> {\n // docker network ls\n try {\n const { stdout } = await this.#exec(`network ls --format \"{{.Name}};{{.ID}};{{.Driver}};{{.Scope}}\"`);\n return stdout\n .split('\\n')\n .filter(line => line.trim() !== '')\n .map(line => {\n const [name, id, driver, scope] = line.split(';');\n return { name, id, driver: driver as NetworkDriver, scope };\n });\n } catch (e) {\n this.adapter.log.debug(`Cannot list networks: ${e.message.toString()}`);\n return [];\n }\n }\n\n async networkCreate(\n name: string,\n driver?: NetworkDriver,\n ): Promise<{ stdout: string; stderr: string; networks?: NetworkInfo[] }> {\n const result = await this.#exec(`network create ${driver ? `--driver ${driver}` : ''} ${name}`);\n const networks = await this.networkList();\n if (!networks.find(it => it.name === name)) {\n throw new Error(`Network ${name} not found after creation`);\n }\n return { ...result, networks };\n }\n\n async networkRemove(networkId: string): Promise<{ stdout: string; stderr: string; networks?: NetworkInfo[] }> {\n const result = await this.#exec(`network remove ${networkId}`);\n const networks = await this.networkList();\n if (networks.find(it => it.id === networkId)) {\n throw new Error(`Network ${networkId} still found after deletion`);\n }\n return { ...result, networks };\n }\n\n /** Stop own containers if necessary */\n async destroy(): Promise<void> {\n if (this.#monitoringInterval) {\n clearInterval(this.#monitoringInterval);\n this.#monitoringInterval = null;\n }\n\n for (const container of this.#ownContainers) {\n if (container.iobEnabled !== false && container.iobStopOnUnload) {\n this.adapter.log.info(`Stopping own container ${container.name} on destroy`);\n try {\n await this.containerStop(container.name);\n } catch (e) {\n this.adapter.log.warn(`Cannot stop own container ${container.name} on destroy: ${e.message}`);\n }\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dockerManager.types.js","sourceRoot":"","sources":["../../src/lib/dockerManager.types.ts"],"names":[],"mappings":"","sourcesContent":["export type ImageName = string;\nexport type ContainerName = string;\nexport type DockerContainerInspect = {\n Id: string;\n Created: string;\n Path: string;\n Args: string[];\n Stats?: ContainerStats;\n State: {\n Status: 'created' | 'restarting' | 'running' | 'removing' | 'paused' | 'exited' | 'dead';\n Running: boolean;\n Paused: boolean;\n Restarting: boolean;\n OOMKilled: boolean;\n Dead: boolean;\n Pid: number;\n ExitCode: number;\n Error: string;\n StartedAt: string;\n FinishedAt: string;\n };\n Image: string;\n ResolvConfPath: string;\n HostnamePath: string;\n HostsPath: string;\n LogPath: string;\n Name: string;\n RestartCount: number;\n Driver: string;\n Platform: string;\n MountLabel: string;\n ProcessLabel: string;\n AppArmorProfile: string;\n ExecIDs: null | string[];\n HostConfig: {\n Binds: string[];\n ContainerIDFile: string;\n LogConfig: {\n Type: 'json-file' | 'local' | 'syslog' | 'journald' | 'gelf' | 'fluentd' | 'awslogs' | 'splunk' | 'none';\n Config: Record<string, string>;\n };\n NetworkMode: 'bridge' | 'host' | 'none' | 'container';\n PortBindings: Record<\n string,\n Array<{\n HostIp: string;\n HostPort: string;\n }>\n >;\n RestartPolicy: {\n Name: string;\n MaximumRetryCount: number;\n };\n AutoRemove: boolean;\n VolumeDriver: string;\n VolumesFrom: null | string[];\n ConsoleSize: [number, number];\n CapAdd: null | string[];\n CapDrop: null | string[];\n CgroupnsMode: string;\n Dns: string[];\n DnsOptions: string[];\n DnsSearch: string[];\n ExtraHosts: null | string[];\n GroupAdd: null | string[];\n IpcMode: 'none' | 'host';\n Cgroup: string;\n Links: null | string[];\n OomScoreAdj: number;\n PidMode: 'host';\n Privileged: boolean;\n PublishAllPorts: boolean;\n ReadonlyRootfs: boolean;\n SecurityOpt: null | string[];\n UTSMode: string;\n UsernsMode: string;\n ShmSize: number;\n Runtime: string;\n Isolation: string;\n CpuShares: number;\n Memory: number;\n NanoCpus: number;\n CgroupParent: string;\n BlkioWeight: number;\n BlkioWeightDevice: any[];\n BlkioDeviceReadBps: any[];\n BlkioDeviceWriteBps: any[];\n BlkioDeviceReadIOps: any[];\n BlkioDeviceWriteIOps: any[];\n CpuPeriod: number;\n CpuQuota: number;\n CpuRealtimePeriod: number;\n CpuRealtimeRuntime: number;\n CpusetCpus: string;\n CpusetMems: string;\n Devices: any[];\n DeviceCgroupRules: null | string[];\n DeviceRequests: null | any[];\n MemoryReservation: number;\n MemorySwap: number;\n MemorySwappiness: null | number;\n OomKillDisable: null | boolean;\n PidsLimit: null | number;\n Ulimits: any[];\n CpuCount: number;\n CpuPercent: number;\n IOMaximumIOps: number;\n IOMaximumBandwidth: number;\n MaskedPaths: string[];\n ReadonlyPaths: string[];\n /** Sysctls (e.g. net.core.somaxconn=1024) */\n Sysctls?: Record<string, string>; // --sysctl\n Init?: boolean;\n };\n GraphDriver: {\n Data: {\n ID: string;\n LowerDir: string;\n MergedDir: string;\n UpperDir: string;\n WorkDir: string;\n };\n Name: string;\n };\n Mounts: Array<{\n Type: 'bind' | 'volume' | 'tmpfs' | 'npipe';\n Source: string;\n Destination: string;\n Mode: string;\n RW: boolean;\n Propagation: string;\n }>;\n Config: {\n Hostname: string;\n Domainname: string;\n User: string;\n AttachStdin: boolean;\n AttachStdout: boolean;\n AttachStderr: boolean;\n ExposedPorts: Record<string, Record<string, string>>;\n Tty: boolean;\n OpenStdin: boolean;\n StdinOnce: boolean;\n Env: string[];\n Cmd: null | string[];\n Image: string;\n Volumes: null | Record<string, unknown>;\n WorkingDir: string;\n Entrypoint: string[];\n OnBuild: null | string[];\n Labels: Record<string, string>;\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n StopSignal?: 'SIGTERM' | 'SIGKILL' | string; // e.g. \"SIGTERM\"\n /** --stop-timeout (seconds) */\n StopTimeout?: number;\n };\n NetworkSettings: {\n Bridge: string;\n SandboxID: string;\n SandboxKey: string;\n Ports: Record<\n string,\n Array<{\n HostIp: string;\n HostPort: string;\n }>\n >;\n HairpinMode: boolean;\n LinkLocalIPv6Address: string;\n LinkLocalIPv6PrefixLen: number;\n SecondaryIPAddresses: null | any[];\n SecondaryIPv6Addresses: null | any[];\n EndpointID: string;\n Gateway: string;\n GlobalIPv6Address: string;\n GlobalIPv6PrefixLen: number;\n IPAddress: string;\n IPPrefixLen: number;\n IPv6Gateway: string;\n MacAddress: string;\n Networks: Record<\n string,\n {\n IPAMConfig: null;\n Links: null;\n Aliases: null;\n MacAddress: string;\n DriverOpts: null;\n GwPriority: number;\n NetworkID: string;\n EndpointID: string;\n Gateway: string;\n IPAddress: string;\n IPPrefixLen: number;\n IPv6Gateway: string;\n GlobalIPv6Address: string;\n GlobalIPv6PrefixLen: number;\n DNSNames: null;\n }\n >;\n };\n};\n\nexport type DockerImageInspect = {\n Id: string;\n RepoTags: string[];\n RepoDigests: string[];\n Parent: string;\n Comment: string;\n Created: string;\n DockerVersion: string;\n Author: string;\n Architecture: string;\n Os: string;\n Size: number;\n GraphDriver: {\n Data: {\n LowerDir: string;\n MergedDir: string;\n UpperDir: string;\n WorkDir: string;\n };\n Name: string;\n };\n RootFS: {\n Type: string;\n Layers: string[];\n };\n Metadata: {\n LastTagTime: string;\n };\n Config: {\n Cmd: null | string[];\n Entrypoint: string[];\n Env: string[];\n ExposedPorts: Record<string, Record<string, string>>;\n Labels: null | Record<string, string>;\n OnBuild: null | string[];\n User: string;\n Volumes: null | Record<string, unknown>;\n WorkingDir: string;\n };\n};\n\n// Enums & Helper Types\nexport type Protocol = 'tcp' | 'udp' | 'sctp';\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nexport type NetworkMode = 'bridge' | 'host' | 'none' | 'container' | string; // with container:<id|name> in networkContainer // custom network name\nexport type RestartPolicy = 'no' | 'always' | 'unless-stopped' | 'on-failure';\nexport type LogDriver =\n | 'json-file'\n | 'local'\n | 'syslog'\n | 'journald'\n | 'gelf'\n | 'fluentd'\n | 'awslogs'\n | 'splunk'\n | 'none';\n\nexport interface PortBinding {\n /** Container port (required) */\n containerPort: number | string;\n /** Host port (optional for publishAllPorts) */\n hostPort?: number | string;\n /** Host IP (e.g. 127.0.0.1) */\n hostIP?: string;\n protocol?: Protocol; // default tcp\n}\n\nexport type EnvVar = Record<string, string>;\n\nexport interface LabelMap {\n [key: string]: string;\n}\n\nexport interface Ulimit {\n name:\n | 'core'\n | 'cpu'\n | 'data'\n | 'fsize'\n | 'locks'\n | 'memlock'\n | 'msgqueue'\n | 'nice'\n | 'nofile'\n | 'nproc'\n | 'rss'\n | 'rtprio'\n | 'rttime'\n | 'sigpending'\n | 'stack';\n soft?: number;\n hard?: number;\n}\n\nexport interface Healthcheck {\n /** Equivalent to --health-cmd / compose.healthcheck.test */\n test: string[] | ['CMD-SHELL', string] | ['CMD', ...string[]] | ['NONE'];\n /** --health-interval / compose.healthcheck.interval (ms) */\n interval?: number;\n /** --health-timeout / compose.healthcheck.timeout (ms) */\n timeout?: number;\n /** --health-retries / compose.healthcheck.retries */\n retries?: number;\n /** --health-start-period / compose.healthcheck.start_period (ms) */\n startPeriod?: number;\n}\n\nexport interface DeviceMapping {\n /** host device path, e.g. /dev/video0 */\n hostPath: string;\n /** container path, e.g. /dev/video0 */\n containerPath?: string;\n /** cgroup permissions, e.g. \"rwm\" */\n permissions?: string;\n}\n\nexport interface VolumeMount {\n /** bind | volume | tmpfs | npipe */\n type: 'bind' | 'volume' | 'tmpfs' | 'npipe';\n /** host path or named volume */\n source?: string;\n /** container path (mountpoint) */\n target: string;\n /** read-only mount */\n readOnly?: boolean;\n /** consistency hints (Docker Desktop/macOS) */\n consistency?: 'default' | 'consistent' | 'cached' | 'delegated';\n /** volume options (compose-like) */\n volumeOptions?: {\n nocopy?: boolean;\n labels?: LabelMap;\n };\n /** bind options */\n bindOptions?: {\n propagation?: 'rprivate' | 'private' | 'rshared' | 'shared' | 'rslave' | 'slave';\n selinux?: 'z' | 'Z';\n };\n /** tmpfs options */\n tmpfsOptions?: {\n size?: number; // bytes\n mode?: number; // e.g. 1777\n };\n}\n\nexport interface Resources {\n /** --cpus (e.g. 0.5), --cpu-shares, --cpu-quota/period, --cpuset-cpus */\n cpus?: number;\n cpuShares?: number;\n cpuQuota?: number;\n cpuPeriod?: number;\n cpusetCpus?: string; // e.g. \"0-2,4\"\n /** --memory, --memory-swap, --memory-reservation (bytes) */\n memory?: number;\n memorySwap?: number; // -1 = unlimited\n memoryReservation?: number;\n /** --pids-limit */\n pidsLimit?: number;\n /** NVIDIA GPUs: --gpus '\"all\"' or '\"device=1,2\"' */\n gpus?: 'all' | { count?: number; devices?: number[] | string[] };\n /** shm size (bytes), --shm-size */\n shmSize?: number;\n /** read-only root FS, --read-only */\n readOnlyRootFilesystem?: boolean;\n}\n\nexport interface Logging {\n driver?: LogDriver; // --log-driver\n options?: Record<string, string>; // --log-opt key=value\n}\n\nexport interface Security {\n /** --privileged */\n privileged?: boolean;\n /** --cap-add / --cap-drop */\n capAdd?: string[];\n capDrop?: string[];\n /** user namespace: --userns */\n usernsMode?: string; // e.g. \"host\", \"private\"\n /** --ipc / --pid */\n ipc?: 'none' | 'host' | 'private';\n pid?: 'host' | '';\n /** SELinux labels (compose style) */\n selinuxLabels?: string[];\n /** seccomp profile path or \"unconfined\" */\n seccomp?: string;\n /** apparmor profile */\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n apparmor?: 'unconfined' | 'docker-default' | string;\n /** device cgroup rules */\n deviceCgroupRules?: string[]; // e.g. \"c 189:* rmw\"\n /** extra groups inside container */\n groupAdd?: (number | string)[];\n /** no-new-privileges: true | false */\n noNewPrivileges?: boolean;\n}\n\nexport interface DNSConfig {\n /** --dns */\n servers?: string[];\n /** --dns-search */\n search?: string[];\n /** --dns-opt */\n options?: string[];\n}\n\nexport interface NetworkAttachment {\n /** target network name */\n name?: string; // compose \"networks:\" key or docker network name\n /** aliases within that network */\n aliases?: string[];\n /** static IPs (IPv4/IPv6) */\n ipv4Address?: string;\n ipv6Address?: string;\n /** links (legacy) */\n links?: string[];\n /** driver options (compose) */\n driverOpts?: Record<string, string>;\n}\n\nexport interface BuildConfig {\n /** compose: build context */\n context: string;\n dockerfile?: string;\n target?: string;\n args?: Record<string, string>;\n labels?: LabelMap;\n cacheFrom?: string[];\n network?: string; // build-time network\n shmSize?: string | number;\n extraHosts?: string[]; // [\"host:ip\"]\n}\n\nexport interface Restart {\n policy?: RestartPolicy; // --restart\n /** only for on-failure */\n maxRetries?: number;\n}\n\nexport interface StopConfig {\n /** --stop-signal */\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n signal?: 'SIGTERM' | 'SIGKILL' | string; // e.g. \"SIGTERM\"\n /** --stop-timeout (seconds) */\n gracePeriodSec?: number;\n}\n\nexport interface HostMapping {\n /** \"hostname:ip\" or split fields */\n host: string;\n ip: string;\n}\n\n// The master container configuration you can use in your manager:\nexport interface ContainerConfig {\n /** If false, container is not started, but still visible in the list */\n iobEnabled?: boolean; // ioBroker setting\n\n /** If true, container is stopped when adapter unloads */\n iobStopOnUnload?: boolean; // ioBroker setting\n\n /** If true, the image will be automatically updated by every start */\n iobAutoImageUpdate?: boolean; // ioBroker setting\n\n /** If true, container will be monitored and if fails restarted */\n iobMonitoringEnabled?: boolean; // ioBroker setting\n\n /** Image reference (repo:tag or ID). If omitted and build is set, the image comes from build */\n image: ImageName;\n\n /** Compose-style build (optional) */\n build?: BuildConfig;\n\n /** --name */\n name: ContainerName;\n\n /** Command & Entrypoint */\n command?: string[] | string; // CMD override\n entrypoint?: string[] | string; // --entrypoint\n\n /** User & Working dir */\n user?: string | number; // --user (uid[:gid] | name)\n workdir?: string; // --workdir\n\n /** Hostname & domain */\n hostname?: string; // --hostname\n domainname?: string;\n macAddress?: string;\n\n /** Environment & Labels */\n environment?: EnvVar; // -e, --env-file merged by your tool if needed\n envFile?: string[]; // compose-style\n labels?: LabelMap; // --label\n labelFile?: string[]; // less common\n\n /** TTY & STDIN */\n tty?: boolean; // -t\n stdinOpen?: boolean; // -i\n attachStdin?: boolean;\n attachStdout?: boolean;\n attachStderr?: boolean;\n openStdin?: boolean;\n\n /** Detach & Auto-remove */\n detach?: boolean; // -d\n // If true, container is removed after exit (cannot be used with restart policies)\n removeOnExit?: boolean; // --rm\n\n /** Ports */\n publishAllPorts?: boolean; // -P\n ports?: PortBinding[]; // -p\n\n /** Expose (container-only visibility) */\n expose?: (number | string)[];\n\n /** Volumes & Mounts */\n mounts?: VolumeMount[]; // --mount (recommended)\n volumes?: string[]; // legacy \"-v\" strings also acceptable if you want\n\n /** Devices */\n devices?: DeviceMapping[]; // --device\n\n /** Extra hosts (host:ip) */\n extraHosts?: HostMapping[] | string[]; // --add-host\n\n /** DNS */\n dns?: DNSConfig;\n\n /** Networks */\n networkMode?: NetworkMode; // --network\n networkContainer?: string; // when networkMode === \"container\"\n networks?: NetworkAttachment[]; // compose-style multiple networks\n\n /** Healthcheck */\n healthcheck?: Healthcheck;\n\n /** Restart */\n restart?: Restart;\n\n /** Resources / Limits */\n resources?: Resources;\n\n /** Logging */\n logging?: Logging;\n\n /** Security */\n security?: Security;\n\n /** Sysctls (e.g. net.core.somaxconn=1024) */\n sysctls?: Record<string, string>; // --sysctl\n\n /** Depends on other containers (compose-style) */\n dependsOn?:\n | string[]\n | Record<string, { condition?: 'service_started' | 'service_healthy' | 'service_completed_successfully' }>;\n\n /** Init process (tini), --init */\n init?: boolean;\n\n /** Working lifecycle */\n stop?: StopConfig;\n\n /** IPC shm mount as tmpfs paths: --tmpfs */\n tmpfs?: (string | { target: string; size?: number; mode?: number })[];\n\n /** Read-only root plus per-path write exceptions (compose: read_only + tmpfs/mounts) */\n readOnly?: boolean;\n\n /** Timezone, locale (via env usually), but explicit here if your manager wants to enforce */\n timezone?: string;\n\n /** Custom arbitrary labels for your manager’s bookkeeping */\n __meta?: Record<string, any>;\n}\n\nexport type SizeInfo = {\n total: number;\n reclaimable: number;\n active: number;\n size: number;\n};\n\nexport type DiskUsage = {\n images?: SizeInfo;\n containers?: SizeInfo;\n volumes?: SizeInfo;\n buildCache?: SizeInfo;\n total: { size: number; reclaimable: number };\n};\n\nexport type ContainerInfo = {\n id: string;\n image: ImageName;\n command: string;\n createdAt: string;\n status: 'created' | 'restarting' | 'running' | 'removing' | 'paused' | 'exited' | 'dead';\n uptime: string;\n ports: string;\n names: string;\n httpLinks?: { [ip: string]: string[] };\n};\n\nexport type ImageInfo = {\n repository: string;\n tag: string;\n id: string;\n createdSince: string;\n size: number;\n};\nexport type NetworkDriver = 'bridge' | 'container' | 'host' | 'macvlan' | 'overlay';\nexport type NetworkInfo = {\n name: string;\n id: string;\n driver: NetworkDriver;\n scope: string;\n};\n\nexport type DockerImageTagsResponse = {\n count: number;\n next: string | null;\n previous: string | null;\n results: {\n creator: number;\n id: number;\n images: {\n architecture: string;\n features: string;\n variant: string | null;\n digest: string;\n os: string;\n os_features: string;\n os_version: string | null;\n size: number;\n status: string;\n last_pulled: string;\n last_pushed: string;\n }[];\n last_updated: string;\n last_updater: number;\n last_updater_username: string;\n name: string;\n repository: number;\n full_size: number;\n v2: boolean;\n tag_status: string;\n tag_last_pulled: string;\n tag_last_pushed: string;\n media_type: string;\n content_type: string;\n digest: string;\n }[];\n};\n\nexport interface ContainerStats {\n cpu: number;\n memUsed: number;\n memMax: number;\n netRead: number;\n netWrite: number;\n processes: number;\n blockIoRead: number;\n blockIoWrite: number;\n ts: number;\n}\n\nexport interface ContainerStatus extends ContainerStats {\n status: 'created' | 'restarting' | 'running' | 'removing' | 'paused' | 'exited' | 'dead' | 'unknown';\n statusTs: number;\n}\n"]}
|
|
@@ -5,7 +5,7 @@ const checkLinuxPass_1 = require("./checkLinuxPass");
|
|
|
5
5
|
const node_stream_1 = require("node:stream");
|
|
6
6
|
let maskOutput = false;
|
|
7
7
|
// this file is used for test on different locales
|
|
8
|
-
// node /opt/iobroker/node_modules/iobroker.admin/build
|
|
8
|
+
// node /opt/iobroker/node_modules/iobroker.admin/build/lib/testPassword
|
|
9
9
|
const mutableStdout = new node_stream_1.Writable({
|
|
10
10
|
write: (_chunk, _encoding, callback) => {
|
|
11
11
|
if (maskOutput) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testPassword.js","sourceRoot":"","sources":["../../src/lib/testPassword.ts"],"names":[],"mappings":";;AAAA,iDAAgD;AAChD,qDAA6E;AAC7E,6CAAuC;AAEvC,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,kDAAkD;AAClD,
|
|
1
|
+
{"version":3,"file":"testPassword.js","sourceRoot":"","sources":["../../src/lib/testPassword.ts"],"names":[],"mappings":";;AAAA,iDAAgD;AAChD,qDAA6E;AAC7E,6CAAuC;AAEvC,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,kDAAkD;AAClD,wEAAwE;AACxE,MAAM,aAAa,GAAG,IAAI,sBAAQ,CAAC;IAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;QACnC,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,QAAQ,EAAE,CAAC;IACf,CAAC;CACJ,CAAC,CAAC;AAEH,mEAAmE;AACnE,IAAA,wCAAuB,GAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;IACnC,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnE,qBAAqB;QACrB,MAAM,EAAE,GAAG,IAAA,+BAAe,EAAC;YACvB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,EAAE,CAAC,QAAQ,CAAC,2BAA2B,KAAK,CAAC,KAAK,kBAAkB,EAAE,CAAC,QAAgB,EAAE,EAAE;YACvF,UAAU,GAAG,KAAK,CAAC;YACnB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;YACD,EAAE,CAAC,QAAQ,CAAC,4BAA4B,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,cAAsB,EAAE,EAAE;gBAChF,UAAU,GAAG,KAAK,CAAC;gBACnB,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtE,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;oBAC9B,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;gBACD,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,IAAA,iCAAgB,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;oBACvE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACrD,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YACH,UAAU,GAAG,IAAI,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,UAAU,GAAG,IAAI,CAAC;IACtB,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { createInterface } from 'node:readline';\nimport { setLinuxPassword, checkWellKnownPasswords } from './checkLinuxPass';\nimport { Writable } from 'node:stream';\n\nlet maskOutput = false;\n// this file is used for test on different locales\n// node /opt/iobroker/node_modules/iobroker.admin/build/lib/testPassword\nconst mutableStdout = new Writable({\n write: (_chunk, _encoding, callback) => {\n if (maskOutput) {\n process.stdout.write('*');\n } else {\n process.stdout.write(_chunk, _encoding);\n }\n callback();\n },\n});\n\n// eslint-disable-next-line @typescript-eslint/no-floating-promises\ncheckWellKnownPasswords().then(found => {\n if (found) {\n console.log(`Found well-known password: ${JSON.stringify(found)}`);\n // enter new password\n const rl = createInterface({\n input: process.stdin,\n output: mutableStdout,\n terminal: true,\n });\n rl.question(`Enter new password for \"${found.login} (min 6 chars): `, (password: string) => {\n maskOutput = false;\n password = password.replace(/\\r/g, '').replace(/\\n/g, '');\n if (password.length < 6) {\n console.error('password is too short');\n process.exit(1);\n }\n rl.question(`Repeat new password for \"${found.login}: `, (passwordRepeat: string) => {\n maskOutput = false;\n passwordRepeat = passwordRepeat.replace(/\\r/g, '').replace(/\\n/g, '');\n if (password !== passwordRepeat) {\n console.error('passwords are not equal');\n process.exit(1);\n }\n rl.close();\n void setLinuxPassword(found.login, found.password, password).then(result => {\n console.log(`Result: ${JSON.stringify(result)}`);\n });\n });\n maskOutput = true;\n });\n maskOutput = true;\n } else {\n console.log(`No well known passwords found`);\n process.exit(0);\n }\n});\n"]}
|
|
@@ -14,12 +14,27 @@ const updateText = {
|
|
|
14
14
|
uk: 'Адаптер %adapter можна оновити з %installedVersion до %newVersion.',
|
|
15
15
|
'zh-cn': '适配器 %adapter 可以从 %installedVersion 升级到 %newVersion。',
|
|
16
16
|
};
|
|
17
|
+
const controllerUpdateText = {
|
|
18
|
+
en: 'The %adapter can be updated from %installedVersion to %newVersion.',
|
|
19
|
+
de: 'Der %adapter kann von %installedVersion auf %newVersion aktualisiert werden.',
|
|
20
|
+
ru: '%adapter может быть обновлен с %installedVersion до %newVersion.',
|
|
21
|
+
pt: 'O %adapter pode ser atualizado de %installedVersion para %newVersion.',
|
|
22
|
+
nl: 'De %adapter kan worden bijgewerkt van %installedVersion naar %newVersion.',
|
|
23
|
+
fr: 'Le %adapter peut être mis à jour de %installedVersion à %newVersion.',
|
|
24
|
+
it: 'Il %adapter può essere aggiornato da %installedVersion a %newVersion.',
|
|
25
|
+
es: 'El %adapter puede actualizarse de %installedVersion a %newVersion.',
|
|
26
|
+
pl: '%adapter może zostać zaktualizowany z %installedVersion do %newVersion.',
|
|
27
|
+
uk: '%adapter можна оновити з %installedVersion до %newVersion.',
|
|
28
|
+
'zh-cn': '%adapter 可以从 %installedVersion 升级到 %newVersion。',
|
|
29
|
+
};
|
|
17
30
|
/**
|
|
18
31
|
* Get text for a message about adapter update in given language
|
|
19
32
|
*/
|
|
20
33
|
function getAdapterUpdateText(options) {
|
|
21
34
|
const { lang, adapter, installedVersion, newVersion } = options;
|
|
22
|
-
|
|
35
|
+
// Use different text template for js-controller updates
|
|
36
|
+
const textTemplate = adapter === 'js-controller' ? controllerUpdateText[lang] : updateText[lang];
|
|
37
|
+
return textTemplate
|
|
23
38
|
.replace('%adapter', adapter)
|
|
24
39
|
.replace('%installedVersion', installedVersion)
|
|
25
40
|
.replace('%newVersion', newVersion);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translations.js","sourceRoot":"","sources":["../../src/lib/translations.ts"],"names":[],"mappings":";;AA0CA,oDAUC;AAzCD,MAAM,UAAU,GAAuC;IACnD,EAAE,EAAE,wEAAwE;IAC5E,EAAE,EAAE,kFAAkF;IACtF,EAAE,EAAE,0EAA0E;IAC9E,EAAE,EAAE,iFAAiF;IACrF,EAAE,EAAE,gFAAgF;IACpF,EAAE,EAAE,gFAAgF;IACpF,EAAE,EAAE,iFAAiF;IACrF,EAAE,EAAE,8EAA8E;IAClF,EAAE,EAAE,iFAAiF;IACrF,EAAE,EAAE,oEAAoE;IACxE,OAAO,EAAE,qDAAqD;CACjE,CAAC;AAEF,MAAM,oBAAoB,GAAuC;IAC7D,EAAE,EAAE,oEAAoE;IACxE,EAAE,EAAE,8EAA8E;IAClF,EAAE,EAAE,kEAAkE;IACtE,EAAE,EAAE,uEAAuE;IAC3E,EAAE,EAAE,2EAA2E;IAC/E,EAAE,EAAE,sEAAsE;IAC1E,EAAE,EAAE,uEAAuE;IAC3E,EAAE,EAAE,oEAAoE;IACxE,EAAE,EAAE,yEAAyE;IAC7E,EAAE,EAAE,4DAA4D;IAChE,OAAO,EAAE,iDAAiD;CAC7D,CAAC;AAEF;;GAEG;AACH,SAAgB,oBAAoB,CAAC,OAA6B;IAC9D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAEhE,wDAAwD;IACxD,MAAM,YAAY,GAAG,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAEjG,OAAO,YAAY;SACd,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC;SAC5B,OAAO,CAAC,mBAAmB,EAAE,gBAAgB,CAAC;SAC9C,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["interface AdapterUpdateOptions {\n /** Language to translate text to */\n lang: ioBroker.Languages;\n /** The adapter to update */\n adapter: string;\n /** The installed version */\n installedVersion: string;\n /** The new available version */\n newVersion: string;\n}\n\nconst updateText: Record<ioBroker.Languages, string> = {\n en: 'Adapter %adapter can be updated from %installedVersion to %newVersion.',\n de: 'Adapter %adapter kann von %installedVersion auf %newVersion aktualisiert werden.',\n ru: 'Адаптер %adapter может быть обновлен с %installedVersion до %newVersion.',\n pt: 'O adaptador %adapter pode ser atualizado de %installedVersion para %newVersion.',\n nl: 'Adapter %adapter kan worden bijgewerkt van %installedVersion naar %newVersion.',\n fr: \"L'adaptateur %adapter peut être mis à jour de %installedVersion à %newVersion.\",\n it: \"L'adattatore %adapter può essere aggiornato da %installedVersion a %newVersion.\",\n es: 'El adaptador %adapter puede actualizarse de %installedVersion a %newVersion.',\n pl: 'Adapter %adapter może zostać zaktualizowany z %installedVersion do %newVersion.',\n uk: 'Адаптер %adapter можна оновити з %installedVersion до %newVersion.',\n 'zh-cn': '适配器 %adapter 可以从 %installedVersion 升级到 %newVersion。',\n};\n\nconst controllerUpdateText: Record<ioBroker.Languages, string> = {\n en: 'The %adapter can be updated from %installedVersion to %newVersion.',\n de: 'Der %adapter kann von %installedVersion auf %newVersion aktualisiert werden.',\n ru: '%adapter может быть обновлен с %installedVersion до %newVersion.',\n pt: 'O %adapter pode ser atualizado de %installedVersion para %newVersion.',\n nl: 'De %adapter kan worden bijgewerkt van %installedVersion naar %newVersion.',\n fr: 'Le %adapter peut être mis à jour de %installedVersion à %newVersion.',\n it: 'Il %adapter può essere aggiornato da %installedVersion a %newVersion.',\n es: 'El %adapter puede actualizarse de %installedVersion a %newVersion.',\n pl: '%adapter może zostać zaktualizowany z %installedVersion do %newVersion.',\n uk: '%adapter можна оновити з %installedVersion до %newVersion.',\n 'zh-cn': '%adapter 可以从 %installedVersion 升级到 %newVersion。',\n};\n\n/**\n * Get text for a message about adapter update in given language\n */\nexport function getAdapterUpdateText(options: AdapterUpdateOptions): string {\n const { lang, adapter, installedVersion, newVersion } = options;\n\n // Use different text template for js-controller updates\n const textTemplate = adapter === 'js-controller' ? controllerUpdateText[lang] : updateText[lang];\n\n return textTemplate\n .replace('%adapter', adapter)\n .replace('%installedVersion', installedVersion)\n .replace('%newVersion', newVersion);\n}\n"]}
|
|
@@ -21,14 +21,15 @@ const ws_server_1 = require("@iobroker/ws-server");
|
|
|
21
21
|
const translations_1 = require("./lib/translations");
|
|
22
22
|
const web_1 = require("./lib/web");
|
|
23
23
|
const checkLinuxPass_1 = require("./lib/checkLinuxPass");
|
|
24
|
+
const DockerManager_1 = require("./lib/DockerManager");
|
|
24
25
|
const adapterName = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, '..', 'package.json'), { encoding: 'utf-8' }))
|
|
25
26
|
.name.split('.')
|
|
26
27
|
.pop();
|
|
27
28
|
const { getInstalledInfo } = adapter_core_1.commonTools;
|
|
28
29
|
const ONE_HOUR_MS = 3_600_000;
|
|
29
30
|
const ERROR_PERMISSION = 'permissionError';
|
|
30
|
-
const CURRENT_MAX_MAJOR_NODEJS =
|
|
31
|
-
const CURRENT_MAX_MAJOR_NPM =
|
|
31
|
+
const CURRENT_MAX_MAJOR_NODEJS = 22;
|
|
32
|
+
const CURRENT_MAX_MAJOR_NPM = 10;
|
|
32
33
|
let socket;
|
|
33
34
|
let webServer;
|
|
34
35
|
let lastRepoUpdate;
|
|
@@ -205,8 +206,10 @@ class Admin extends adapter_core_1.Adapter {
|
|
|
205
206
|
else if (obj.command === 'url') {
|
|
206
207
|
this.log.info(`url: ${JSON.stringify(obj.message)}`);
|
|
207
208
|
// just for test
|
|
208
|
-
|
|
209
|
-
this.sendTo(obj.from, obj.command, { openUrl: obj.message._origin, saveConfig: true }, obj.callback)
|
|
209
|
+
if (obj.callback) {
|
|
210
|
+
this.sendTo(obj.from, obj.command, { openUrl: obj.message._origin, saveConfig: true }, obj.callback);
|
|
211
|
+
}
|
|
212
|
+
return;
|
|
210
213
|
}
|
|
211
214
|
else if (obj.command.startsWith('admin:')) {
|
|
212
215
|
return this.processNotificationsGui(obj);
|
|
@@ -216,6 +219,16 @@ class Admin extends adapter_core_1.Adapter {
|
|
|
216
219
|
this.log.info(`test: ${JSON.stringify(obj.message)}`);
|
|
217
220
|
return;
|
|
218
221
|
}
|
|
222
|
+
else if (obj.command === 'checkDocker') {
|
|
223
|
+
const dockerManager = new DockerManager_1.default(this);
|
|
224
|
+
void dockerManager.getDockerDaemonInfo().then(result => {
|
|
225
|
+
if (obj.callback) {
|
|
226
|
+
this.sendTo(obj.from, obj.command, result, obj.callback);
|
|
227
|
+
}
|
|
228
|
+
void dockerManager.destroy();
|
|
229
|
+
});
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
219
232
|
else if (webServer?.processMessage(obj)) {
|
|
220
233
|
return;
|
|
221
234
|
}
|
|
@@ -1337,6 +1350,44 @@ class Admin extends adapter_core_1.Adapter {
|
|
|
1337
1350
|
}
|
|
1338
1351
|
});
|
|
1339
1352
|
}
|
|
1353
|
+
/**
|
|
1354
|
+
* Add repository read timestamp to the repository data structure
|
|
1355
|
+
*/
|
|
1356
|
+
async addRepositoryReadTimestamp(repository, activeRepo) {
|
|
1357
|
+
try {
|
|
1358
|
+
const readTime = new Date().toISOString();
|
|
1359
|
+
// Add read timestamp to the repository info structure
|
|
1360
|
+
if (repository._repoInfo) {
|
|
1361
|
+
repository._repoInfo.repoReadTime = readTime;
|
|
1362
|
+
}
|
|
1363
|
+
// Update the system.repositories object to store the read timestamp
|
|
1364
|
+
const repos = await this.getForeignObjectAsync('system.repositories');
|
|
1365
|
+
if (repos?.native?.repositories) {
|
|
1366
|
+
if (Array.isArray(activeRepo)) {
|
|
1367
|
+
// Handle multiple repositories
|
|
1368
|
+
for (const repo of activeRepo) {
|
|
1369
|
+
if (repos.native.repositories[repo]?.json?._repoInfo) {
|
|
1370
|
+
// @ts-expect-error - type will be extended in other repository to include repoReadTime
|
|
1371
|
+
repos.native.repositories[repo].json._repoInfo.repoReadTime = readTime;
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
else {
|
|
1376
|
+
// Handle single repository
|
|
1377
|
+
if (repos.native.repositories[activeRepo]?.json?._repoInfo) {
|
|
1378
|
+
// @ts-expect-error - type will be extended in other repository to include repoReadTime
|
|
1379
|
+
repos.native.repositories[activeRepo].json._repoInfo.repoReadTime = readTime;
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1382
|
+
// Save the updated repositories object
|
|
1383
|
+
await this.setForeignObjectAsync('system.repositories', repos);
|
|
1384
|
+
this.log.debug(`Repository read timestamp updated: ${readTime}`);
|
|
1385
|
+
}
|
|
1386
|
+
}
|
|
1387
|
+
catch (err) {
|
|
1388
|
+
this.log.error(`Cannot add repository read timestamp: ${err}`);
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1340
1391
|
async checkRevokedVersions(repository) {
|
|
1341
1392
|
try {
|
|
1342
1393
|
const adapters = Object.keys(repository);
|
|
@@ -1495,13 +1546,15 @@ class Admin extends adapter_core_1.Adapter {
|
|
|
1495
1546
|
this.sendToHost(this.host, 'getRepository', {
|
|
1496
1547
|
repo: active,
|
|
1497
1548
|
update: true,
|
|
1498
|
-
}, _repository => {
|
|
1549
|
+
}, async (_repository) => {
|
|
1499
1550
|
if ((typeof _repository === 'string' || _repository instanceof Error) &&
|
|
1500
1551
|
_repository.toString().includes(ERROR_PERMISSION)) {
|
|
1501
1552
|
this.log.error('May not read "getRepository"');
|
|
1502
1553
|
}
|
|
1503
1554
|
else {
|
|
1504
1555
|
this.log.info('Repository received successfully.');
|
|
1556
|
+
// Add repository read timestamp to the repository data
|
|
1557
|
+
await this.addRepositoryReadTimestamp(_repository, active);
|
|
1505
1558
|
socket?.repoUpdated();
|
|
1506
1559
|
this.checkRevokedVersions(_repository).catch(e => this.log.error(`Cannot check revoked versions: ${e}`));
|
|
1507
1560
|
}
|