@platforma-sdk/bootstrap 3.1.23 → 3.2.0
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/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/cmd-opts.ts","../src/util.ts","../src/block.ts","../src/commands/create-block.ts","../src/package.ts","../src/state.ts","../src/run.ts","../src/templates/compose.ts","../src/templates/types.ts","../src/templates/pl-config.ts","../src/platforma.ts","../src/core.ts","../src/commands/reset.ts","../src/commands/start.ts","../src/commands/stop.ts","../src/commands/start/docker.ts","../src/commands/start/local.ts","../src/commands/svc/delete.ts","../src/commands/svc/down.ts","../src/commands/svc/list.ts","../src/commands/svc/up.ts","../src/commands/start/docker/s3.ts","../src/commands/start/local/s3.ts","../src/commands/svc/create/docker.ts","../src/commands/svc/create/local.ts","../src/commands/svc/create/docker/s3.ts","../src/commands/svc/create/local/s3.ts","../src/index.ts"],"sourcesContent":["import { Flags } from '@oclif/core';\n\nexport const GlobalFlags = {\n 'log-level': Flags.string({\n description: 'logging level',\n default: 'info',\n options: ['error', 'warn', 'info', 'debug'],\n required: false,\n }),\n};\n\nexport const InstanceName = {\n name: Flags.string({\n description: 'name of instance',\n required: false,\n }),\n};\n\nexport const ImageFlag = {\n image: Flags.string({\n description: 'use custom docker image to run platforma',\n }),\n};\n\nexport const VersionFlag = {\n version: Flags.string({\n description: 'use custom platforma release (official docker image or binary package)',\n }),\n};\n\nexport const ArchFlag = {\n arch: Flags.string({\n description: 'override architecture. You can start amd64 linux image on arm-based host (say, Apple M family processor). I.e. arm64, amd64, amd64/v2',\n }),\n};\n\nexport const LicenseFlags = {\n 'license': Flags.string({\n description: 'pass a license code. The license can be got from \"https://licensing.milaboratories.com\".',\n }),\n 'license-file': Flags.file({\n exists: true,\n description:\n 'specify a path to the file with a license. The license can be got from \\'https://licensing.milaboratories.com\\'.',\n }),\n};\n\nexport const AddressesFlags = {\n 'grpc-port': Flags.integer({\n description: 'port for Platforma Backend gRPC API. Default is 6345',\n env: 'PLATFORMA_GRPC_PORT',\n }),\n\n 'grpc-listen': Flags.string({\n description: 'full listen addr for Platforma Backend gRPC API. Default is 127.0.0.1:6345',\n env: 'PLATFORMA_GRPC_LISTEN',\n }),\n\n 'monitoring-port': Flags.integer({\n description: 'port for Platforma Backend monitoring API. Default is 9090',\n env: 'PLATFORMA_MONITORING_PORT',\n }),\n\n 'monitoring-listen': Flags.string({\n description: 'full listen addr for Platforma Backend monitoring API. Default is 127.0.0.1:9090',\n env: 'PLATFORMA_MONITORING_LISTEN',\n }),\n\n 'debug-port': Flags.integer({\n description: 'port for Platforma Backend debug API. Default is 9091',\n env: 'PLATFORMA_DEBUG_PORT',\n }),\n\n 'debug-listen': Flags.string({\n description: 'full listen addr for Platforma Backend debug API. Default is 127.0.0.1:9091',\n env: 'PLATFORMA_DEBUG_LISTEN',\n }),\n};\n\nexport const S3AddressesFlags = {\n 's3-port': Flags.integer({\n description: 'port that S3 will listen, default is 9000',\n default: 9000,\n env: 'PLATFORMA_S3_PORT',\n }),\n\n 's3-console-port': Flags.integer({\n description: 'port that a console of S3 will listen, default is 9001',\n default: 9001,\n env: 'PLATFORMA_S3_CONSOLE_PORT',\n }),\n};\n\nexport const StorageFlag = {\n storage: Flags.string({\n description: 'specify path on host to be used as storage for all Platforma Backend data',\n }),\n};\n\nexport const MinioPresignHostFlag = {\n ['minio-presign-host']: Flags.boolean({\n description: 'use \\'minio\\' host instead of \\'localhost\\' in presign URLs',\n }),\n};\n\nexport const MountFlag = {\n mount: Flags.string({\n multiple: true,\n description: 'things to be mounted into platforma docker container. Targets will appear inside the container under the same absolute paths',\n }),\n};\n\nexport const PlLogFileFlag = {\n ['pl-log-file']: Flags.file({\n description: 'specify path for Platforma Backend log file',\n }),\n};\n\nexport const PlWorkdirFlag = {\n ['pl-workdir']: Flags.file({\n description: 'specify working directory for Platforma Backend process',\n }),\n};\n\nexport const PlBinaryFlag = {\n ['pl-binary']: Flags.file({\n description: 'start given Platforma Backend binary instead of automatically downloaded version',\n }),\n};\n\nexport const PlSourcesFlag = {\n ['pl-sources']: Flags.file({\n description: 'path to pl repository root: build Platforma Backend from sources and start the resulting binary',\n }),\n};\n\nexport const ConfigFlag = {\n config: Flags.string({\n description: 'use custom Platforma Backend config',\n }),\n};\n\nexport const StoragePrimaryPathFlag = {\n 'storage-primary': Flags.file({\n description: 'specify path on host to be used as \\'primary\\' storage',\n }),\n};\n\nexport const StorageWorkPathFlag = {\n 'storage-work': Flags.file({\n description: 'specify path on host to be used as \\'work\\' storage',\n }),\n};\n\nexport const StorageLibraryPathFlag = {\n 'storage-primary': Flags.file({\n description: 'specify path on host to be used as \\'library\\' storage',\n }),\n};\n\nexport const StoragePrimaryURLFlag = {\n 'storage-primary': Flags.string({\n description:\n 'specify \\'primary\\' storage destination URL.\\n'\n + '\\tfile:/path/to/dir for directory on local FS\\n'\n + '\\ts3://<bucket>/?region=<name> for real AWS bucket\\n'\n + '\\ts3e://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via http\\n'\n + '\\ts3es://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via https',\n }),\n};\n\nexport const StorageLibraryURLFlag = {\n 'storage-library': Flags.string({\n description:\n 'specify \\'library\\' storage destination URL.\\n'\n + '\\tfile:/path/to/dir for directory on local FS\\n'\n + '\\ts3://<bucket>/?region=<name> for real AWS bucket\\n'\n + '\\ts3e://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via http\\n'\n + '\\ts3es://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via https',\n }),\n};\n\nexport const AuthEnabledFlag = {\n 'auth-enabled': Flags.boolean({\n description: 'enable authorization',\n }),\n};\n\nexport const HTPasswdFileFlag = {\n 'auth-htpasswd-file': Flags.file({\n description: 'path to .htpasswd file with Platforma users (static user DB auth source)',\n }),\n};\n\nexport const LDAPAddressFlag = {\n 'auth-ldap-server': Flags.string({\n description: 'address of LDAP server to use for auth in Platforma (auth source)',\n }),\n};\n\nexport const LDAPDefaultDNFlag = {\n 'auth-ldap-default-dn': Flags.string({\n description: 'DN to use when checking user with LDAP bind operation: e.g. cn=%u,ou=users,dc=example,dc=com',\n }),\n};\n\nexport const AuthFlags = {\n ...AuthEnabledFlag,\n ...HTPasswdFileFlag,\n\n ...LDAPAddressFlag,\n ...LDAPDefaultDNFlag,\n};\n","import os from 'node:os';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\n\nimport winston from 'winston';\nimport { randomBytes } from 'node:crypto';\nimport readlineSync from 'readline-sync';\n\nexport function askYN(prompt: string): boolean {\n const answer = readlineSync.question(`${prompt} [y/N] `);\n return answer.toLowerCase() === 'y';\n}\n\nexport function assertNever(n: never) {\n throw new Error('this should never happen');\n}\n\nexport function createLogger(level: string = 'debug'): winston.Logger {\n return winston.createLogger({\n level: level,\n\n format: winston.format.printf(({ level, message }) => {\n const indent = ' '.repeat(level.length + 2); // For ': ' after the level\n if (typeof message !== 'string') {\n const messageJson = JSON.stringify(message);\n throw Error(`logger message ${messageJson} is not a string`);\n }\n const indentedMessage = message\n .split('\\n')\n .map((line: string, index: number) => (index === 0 ? line : indent + line))\n .join('\\n');\n\n const colorize = (l: string) => winston.format.colorize().colorize(l, l);\n\n return `${colorize(level)}: ${indentedMessage}`;\n }),\n\n transports: [\n new winston.transports.Console({\n stderrLevels: ['error', 'warn', 'info', 'debug'],\n handleExceptions: true,\n }),\n ],\n });\n}\n\nexport function randomStr(len: number): string {\n return randomBytes(Math.ceil(len / 2))\n .toString('hex')\n .slice(0, len);\n}\n\nexport function resolveTilde(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\nexport function ensureDir(p: string, options?: {\n mode?: fs.Mode;\n}) {\n if (fs.existsSync(p)) {\n return;\n }\n\n fs.mkdirSync(p, { recursive: true });\n if (options?.mode) {\n fs.chmodSync(p, options.mode);\n }\n}\n\nexport function getProcessName(pid: number): string {\n try {\n if (os.platform() !== 'win32') {\n return execSync(`ps -p ${pid} -o comm=`, { encoding: 'utf8' }).trim();\n }\n\n const command = `wmic process where processid=${pid} get Caption`;\n const lines = execSync(command, { encoding: 'utf8' }).split('\\n');\n\n // lines = [\"Caption:\", \"<process name>\"]\n if (lines.length <= 1) {\n return '';\n }\n\n return lines[1].trim();\n } catch (e) {\n return '';\n }\n}\n\nexport type dockerComposeStatus = {\n Name: string;\n Status: string;\n ConfigFiles: string;\n};\n\nexport function getDockerComposeInfo(serviceName: string): dockerComposeStatus | undefined {\n const result = execSync(`docker compose ls --filter name=${serviceName} --format json`, { encoding: 'utf8' }).trim();\n\n const report = JSON.parse(result) as dockerComposeStatus[];\n\n for (const st of report) {\n if (st.Name === serviceName) {\n return st;\n }\n }\n\n return undefined;\n}\n","import { createWriteStream } from 'node:fs';\nimport * as fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type winston from 'winston';\nimport { Writable, Transform } from 'node:stream';\nimport os from 'node:os';\nimport readlineSync from 'readline-sync';\nimport { z } from 'zod';\nimport decompress from 'decompress';\nimport yaml from 'yaml';\n\nconst blockPlatformsToChoose = ['Python'];\nconst allPlatforms = ['Tengo', 'Python'] as const;\nconst CreateBlockPlatforms = z.union([z.literal('Tengo'), z.literal('Python')]);\nexport type CreateBlockPlatform = z.infer<typeof CreateBlockPlatforms>;\n\nconst CreateBlockOptions = z.object({\n npmOrgName: z.string().min(1),\n orgName: z.string().min(1, { message: `Organization name must be provided` }),\n blockName: z.string().min(1, { message: `Block name must be provided` }),\n softwarePlatforms: z.array(CreateBlockPlatforms).refine((p) => new Set(p).size === p.length, {\n message: 'Must be an array of unique software platforms',\n }),\n});\nexport type CreateBlockOptions = z.infer<typeof CreateBlockOptions>;\n\n/** Creates a block by cloning block-boilerplate repository. */\nexport async function createBlock(logger: winston.Logger) {\n const { npmOrgName, orgName, blockName, softwarePlatforms } = askForOptions();\n const targetPath = path.join(process.cwd(), blockName);\n\n logger.info(`Downloading boilerplate code...`);\n await downloadAndUnzip(\n // 'https://github.com/milaboratory/platforma-block-boilerplate/archive/refs/heads/software_platforms.zip',\n // 'platforma-block-boilerplate-software_platforms',\n 'https://github.com/milaboratory/platforma-block-boilerplate/archive/refs/heads/main.zip',\n 'platforma-block-boilerplate-main',\n targetPath,\n );\n\n const platformsToRemove = allPlatforms.filter((p) => softwarePlatforms.indexOf(p) < 0);\n const noPlatforms = blockPlatformsToChoose.length == platformsToRemove.length;\n logger.info(`Keep platforms '${softwarePlatforms}', remove: '${platformsToRemove}'. Will remove all platforms? ${noPlatforms}`);\n for (const p of platformsToRemove) {\n await removePlatform(targetPath, p);\n }\n if (noPlatforms) {\n await removePlatformsCompletely(targetPath);\n }\n\n logger.info(`Replace everything in the template with provided options...`);\n replaceRegexInAllFiles(targetPath, [\n // '@' literal ensures only npm org name will be renamed,\n // as public registry for software also is called platforma-open, but without '@'.\n // Also, don't rename an organization for runenv-python-3 package.\n { from: /@platforma-open(?!.*runenv-python-3)/g, to: `@${npmOrgName}` },\n\n { from: /my-org/g, to: orgName },\n\n { from: /block-boilerplate/g, to: blockName },\n ]);\n}\n\nfunction askForOptions(): CreateBlockOptions {\n let npmOrgName = readlineSync.question(\n 'Write an organization name for npm. Default is \"platforma-open\": ',\n );\n if (npmOrgName === '') {\n npmOrgName = 'platforma-open';\n }\n\n let orgName = '';\n while (orgName.length < 1)\n orgName = readlineSync.question('Write an organization name, e.g. \"my-org\": ');\n\n let blockName = '';\n while (blockName.length < 1)\n blockName = readlineSync.question('Write a name of the block, e.g. \"hello-world\": ');\n\n const needSoftware = readlineSync.keyInYN('Create package for block\\'s software?');\n let softwarePlatforms = ['Tengo'];\n if (needSoftware) {\n while (softwarePlatforms.length < allPlatforms.length) {\n const index = readlineSync.keyInSelect(blockPlatformsToChoose, 'Choose software platform:');\n if (index < 0) break;\n softwarePlatforms.push(blockPlatformsToChoose[index]);\n }\n }\n softwarePlatforms = Array.from(new Set(softwarePlatforms)).sort();\n\n const result = CreateBlockOptions.safeParse({ npmOrgName, orgName, blockName, softwarePlatforms });\n if (!result.success && result.error.issues.length) {\n throw new Error(result.error.issues.map(i => i.message).join('; '));\n }\n\n return result.data!;\n}\n\nasync function downloadAndUnzip(url: string, pathInArchive: string, outputPath: string) {\n const response = await fetch(url);\n const content = await response.blob();\n\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'create-repo'));\n\n const tmpFile = path.join(tmpDir, 'packed-repo.zip');\n const f = Writable.toWeb(createWriteStream(tmpFile));\n await content.stream().pipeTo(f);\n\n const tmpRepo = path.join(tmpDir, 'unpacked-repo');\n await fs.mkdir(tmpRepo);\n await decompress(tmpFile, tmpRepo);\n\n await fs.cp(path.join(tmpRepo, pathInArchive), outputPath, { recursive: true });\n}\n\n/** Removes a bunch of dependencies to the platform. */\nasync function removePlatform(dir: string, platform: CreateBlockPlatform) {\n const p = platform.toLowerCase();\n\n // Remove <PlAlert> line from MainPage.vue\n // https://regex101.com/r/oCTyHk/1\n await deleteRegexInFile(\n path.join(dir, 'ui', 'src', 'pages', 'MainPage.vue'),\n new RegExp(`.*${p}Message.*\\\\n\\\\n`, 'g'),\n );\n\n // Remove an output from the model.\n await deleteRegexInFile(\n path.join(dir, 'model', 'src', 'index.ts'),\n new RegExp(`.*${p}Message.*\\\\n\\\\n`, 'g'),\n );\n\n // This regexp represents a block of code until the empty line.\n // https://regex101.com/r/Os8kX1/1\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'main.tpl.tengo'),\n new RegExp(`.*${p}.*exec.builder.*[\\\\s\\\\S]*?\\\\n\\\\n`, 'g'),\n );\n\n // Remove a line from the workflow output.\n // https://regex101.com/r/PkHwQ8/1\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'main.tpl.tengo'),\n new RegExp(`.*${p}Message.*\\\\n`, 'g'),\n );\n\n // Remove 2 lines: the one with the language message and the one with expect\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'wf.test.ts'),\n new RegExp(`.*${p}Message.*\\\\n.*expect.*\\\\n\\\\n`, 'g'),\n );\n\n await fs.rm(path.join(dir, 'software', `src_${p}`), { recursive: true });\n\n await replaceInFile(\n path.join(dir, 'software', 'package.json'),\n (content) => {\n const json = JSON.parse(content);\n delete json['block-software']['artifacts'][`hello-${p}-artifact`];\n delete json['block-software']['entrypoints'][`hello-world-${p}`];\n return JSON.stringify(json, null, 2);\n },\n );\n}\n\n/** Removes software directory completely and all references to it from the workspace. */\nasync function removePlatformsCompletely(dir: string) {\n await fs.rm(path.join(dir, 'software'), { recursive: true });\n\n await replaceInFile(\n path.join(dir, 'workflow', 'package.json'),\n (content) => {\n const json = JSON.parse(content);\n delete json['dependencies']['@platforma-open/my-org.block-boilerplate.software'];\n return JSON.stringify(json, null, 2);\n },\n );\n\n await deleteRegexInFile(\n path.join(dir, 'pnpm-workspace.yaml'),\n /.*- software$\\n/gm,\n );\n}\n\nasync function replaceRegexInAllFiles(\n dir: string,\n patterns: { from: RegExp; to: string }[],\n) {\n const files = await getAllFiles(dir);\n for (const { from, to } of patterns) {\n for (const fPath of files) {\n await replaceRegexInFile(fPath, from, to);\n }\n }\n}\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const allDirents = await fs.readdir(dir, {\n withFileTypes: true,\n recursive: true,\n });\n\n return allDirents.filter((f: any) => f.isFile()).map((f: any) => path.join(f.parentPath, f.name));\n}\n\nasync function replaceInFile(fPath: string, replacer: (content: string) => any) {\n const content = await fs.readFile(fPath);\n const newContent = replacer(content.toString());\n await fs.writeFile(fPath, newContent);\n}\n\nasync function replaceRegexInFile(fPath: string, from: RegExp, to: string) {\n return await replaceInFile(fPath, (content) => content.replaceAll(from, to));\n}\n\nasync function deleteRegexInFile(fPath: string, what: RegExp) {\n return await replaceRegexInFile(fPath, what, '');\n}\n","import { Command, Flags } from '@oclif/core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\nimport * as block from '../block';\n\nexport default class CreateBlock extends Command {\n static override description = \"Helps to create a new block by downloading a block's template.\";\n\n static override examples = ['<%= name %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(CreateBlock);\n const logger = util.createLogger(flags['log-level']);\n\n await block.createBlock(logger);\n }\n}\n","import { resolve, join } from 'path';\nimport fs from 'fs';\nimport { getDefaultPlVersion } from '@milaboratories/pl-deployments';\n\nexport function path(...p: string[]): string {\n return resolve(__dirname, '..', ...p);\n}\n\nexport function dist(...p: string[]): string {\n return path('dist', ...p);\n}\n\nexport function assets(...p: string[]): string {\n return path('assets', ...p);\n}\n\nexport function composeFiles(): string[] {\n const dockerDirEntries = fs.readdirSync(assets());\n return dockerDirEntries\n .filter((entry) => {\n return entry.startsWith('compose-') && entry.endsWith('.yaml');\n })\n .map((value) => assets(value));\n}\n\nexport function readFileSync(...p: string[]): Buffer {\n return fs.readFileSync(path(...p));\n}\n\nexport function plImageTag(version?: string): string {\n if (!version) {\n version = getDefaultPlVersion();\n }\n\n return `quay.io/milaboratories/platforma:${version}`;\n}\n","import os from 'node:os';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as pkg from './package';\nimport * as util from './util';\nimport type { SpawnOptions } from 'node:child_process';\nimport type * as types from './templates/types';\n\nexport type runInfo = {\n configPath?: string;\n apiPort?: number;\n apiAddr?: string;\n logPath?: string;\n dbPath?: string;\n primary?: types.storageOptions;\n work?: types.fsStorageOptions;\n library?: types.storageOptions;\n};\n\nexport type instanceCommand = {\n async?: boolean;\n cmd: string;\n args: readonly string[];\n envs?: NodeJS.ProcessEnv;\n workdir?: string;\n runOpts: SpawnOptions;\n};\n\nexport type commmonInstanceInfo = {\n name: string;\n upCommands: instanceCommand[];\n downCommands: instanceCommand[];\n cleanupCommands: instanceCommand[];\n runInfo?: runInfo;\n};\n\nexport type dockerInstanceInfo = commmonInstanceInfo & {\n type: 'docker';\n};\nexport type processInstanceInfo = commmonInstanceInfo & {\n type: 'process';\n pid?: number;\n};\n\nexport type instanceInfo = dockerInstanceInfo | processInstanceInfo;\nexport type jsonInstanceInfo = Omit<dockerInstanceInfo, 'name' | 'isActive'> | Omit<processInstanceInfo, 'name' | 'isActive'>;\n\nexport function reset() {\n fs.rmSync(State.getStateInstance().filePath);\n}\n\ntype state = {\n currentInstance: string;\n};\n\nclass State {\n private static instance: State;\n\n private state: state = {\n currentInstance: '',\n };\n\n public readonly filePath: string;\n private readonly dirPath: string;\n\n constructor(stateDir?: string) {\n stateDir = stateDir ?? path.resolve(os.homedir(), '.config', 'pl-bootstrap');\n\n const stateFile = path.join(stateDir, 'state.json');\n\n this.dirPath = stateDir;\n this.filePath = stateFile;\n\n if (!fs.existsSync(stateDir)) {\n fs.mkdirSync(stateDir, { recursive: true });\n }\n\n if (fs.existsSync(stateFile)) {\n this.state = JSON.parse(pkg.readFileSync(stateFile).toString()) as state;\n }\n }\n\n public static getStateInstance(): State {\n if (!State.instance) {\n State.instance = new State();\n }\n\n return State.instance;\n }\n\n public path(...p: string[]): string {\n return path.join(this.dirPath, ...p);\n }\n\n public instanceDir(name?: string, ...p: string[]): string {\n if (name) {\n return this.path('data', name, ...p);\n }\n\n return this.path('data');\n }\n\n public binaries(...p: string[]): string {\n return this.path('binaries', ...p);\n }\n\n private writeState() {\n fs.writeFileSync(this.filePath, JSON.stringify(this.state));\n }\n\n get instanceList(): string[] {\n if (!fs.existsSync(this.instanceDir())) {\n return [];\n }\n\n const list = fs.readdirSync(this.instanceDir());\n\n return list.filter((iName) => this.instanceExists(iName));\n }\n\n instanceExists(name: string): boolean {\n return fs.existsSync(this.instanceDir(name, 'instance.json'));\n }\n\n public getInstanceInfo(name: string): instanceInfo {\n const instanceInfoFile = this.instanceDir(name, 'instance.json');\n if (!fs.existsSync(instanceInfoFile)) {\n throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);\n }\n\n const jsonInfo = JSON.parse(pkg.readFileSync(instanceInfoFile).toString()) as jsonInstanceInfo;\n return {\n name: name,\n ...jsonInfo,\n };\n }\n\n public setInstanceInfo(instanceName: string, info: jsonInstanceInfo) {\n if (!fs.existsSync(this.instanceDir(instanceName))) {\n fs.mkdirSync(this.instanceDir(instanceName), { recursive: true });\n }\n\n const instanceInfoFile = this.instanceDir(instanceName, 'instance.json');\n let oldInfo: object = {};\n\n if (fs.existsSync(instanceInfoFile)) {\n oldInfo = JSON.parse(pkg.readFileSync(instanceInfoFile).toString()) as object;\n }\n\n fs.writeFileSync(instanceInfoFile, JSON.stringify({ ...oldInfo, ...info }));\n }\n\n public isInstanceActive(instance: instanceInfo): boolean {\n const iType = instance.type;\n switch (iType) {\n case 'docker': {\n const i = util.getDockerComposeInfo(`pl-${instance.name}`);\n if (!i) {\n return false;\n }\n return i.Status.trim().startsWith('running');\n }\n\n case 'process': {\n if (!instance.pid) {\n return false;\n }\n return isValidPID(instance.pid);\n }\n\n default:\n util.assertNever(iType);\n throw new Error('cli logic error: unknown service type, cannot check its state');\n }\n }\n\n get isActive(): boolean {\n for (const iName of this.instanceList) {\n const instance = this.getInstanceInfo(iName);\n if (this.isInstanceActive(instance)) {\n return true;\n }\n }\n\n return false;\n }\n\n public isValidPID(pid: number): boolean {\n return isValidPID(pid);\n }\n\n get currentInstance(): instanceInfo | undefined {\n const name = this.state.currentInstance;\n if (name && this.instanceExists(name)) {\n return this.getInstanceInfo(name);\n }\n\n return undefined;\n }\n\n get currentInstanceName(): string {\n return this.state.currentInstance;\n }\n\n set currentInstanceName(name: string) {\n this.state.currentInstance = name;\n this.writeState();\n }\n\n selectInstance(name: string) {\n if (!this.instanceExists(name)) {\n throw new Error(`instance '${name}' does not exist`);\n }\n this.state.currentInstance = name;\n this.writeState();\n }\n}\n\nfunction isValidPID(pid: number): boolean {\n const processName = util.getProcessName(pid);\n return processName === 'platforma' || processName.endsWith('/platforma') || processName.endsWith('\\\\platforma');\n}\n\nexport default State.getStateInstance();\n","import type { SpawnOptions, SpawnSyncReturns, ChildProcess } from 'node:child_process';\nimport { spawnSync, spawn } from 'node:child_process';\nimport type { instanceCommand } from './state';\nimport state from './state';\nimport type winston from 'winston';\n\ntype runResult = {\n executed: SpawnSyncReturns<Buffer>[];\n spawned: ChildProcess[];\n};\n\nexport function runCommands(logger: winston.Logger, cmds: instanceCommand[], options?: SpawnOptions): runResult {\n const buffers: SpawnSyncReturns<Buffer>[] = [];\n const children: ChildProcess[] = [];\n for (const cmd of cmds) {\n const opts = {\n cwd: cmd.workdir,\n env: {\n ...cmd.envs,\n ...options?.env,\n },\n ...cmd.runOpts,\n ...options,\n };\n\n if (cmd.async) {\n const child = run(logger, cmd.cmd, cmd.args, opts);\n children.push(child);\n } else {\n const result = runSync(logger, cmd.cmd, cmd.args, opts);\n buffers.push(result);\n if (result.error || result.status !== 0) {\n break;\n }\n }\n };\n\n return {\n executed: buffers,\n spawned: children,\n };\n}\n\nexport function rerunLast(logger: winston.Logger, options: SpawnOptions): runResult {\n const instance = state.currentInstance;\n\n if (!instance) {\n throw new Error('no previous run info found: this is the first run after package installation');\n }\n\n return runCommands(logger, instance.upCommands, options);\n}\n\nexport function run(logger: winston.Logger, cmd: string, args: readonly string[], options: SpawnOptions): ChildProcess {\n logger.debug(\n `Running:\\n cmd: ${JSON.stringify([cmd, ...args])}\\n wd: ${options.cwd?.toString()}`,\n );\n\n options.env = { ...process.env, ...options.env };\n logger.debug(' spawning child process');\n const child = spawn(cmd, args, options);\n let exitAfterChild: boolean = false;\n\n //\n // Ensure Ctrl+C causes right finalization order: first stop child process, then stop the parent.\n //\n const sigintHandler = () => {\n child.kill('SIGINT');\n exitAfterChild = true;\n };\n\n logger.debug(' setting up signal handler');\n process.on('SIGINT', sigintHandler);\n\n child.on('close', (code) => {\n process.removeListener('SIGINT', sigintHandler);\n if (exitAfterChild) {\n process.exit(code);\n }\n });\n\n return child;\n}\n\nexport function runSync(\n logger: winston.Logger,\n cmd: string,\n args: readonly string[],\n options: SpawnOptions,\n): SpawnSyncReturns<Buffer> {\n logger.debug(\n `Running:\\n cmd: ${JSON.stringify([cmd, ...args])}\\n opts: ${JSON.stringify(options)}`,\n );\n\n options.env = { ...process.env, ...options.env };\n return spawnSync(cmd, args, options);\n}\n","import fs from 'node:fs';\nimport YAML from 'yaml';\n\nexport type VolumeMountOption = {\n hostPath: string;\n containerPath: string;\n};\n\nexport type ServiceOptions = {\n platform?: string;\n envs?: NodeJS.ProcessEnv;\n mounts?: VolumeMountOption[];\n};\n\ntype ComposeYamlSpec = {\n name: string;\n services: Record<string, {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n }>;\n\n volumes?: unknown;\n};\n\nexport function render(\n composeSource: string,\n composeDest: string,\n deployName: string,\n services?: Map<string, ServiceOptions>,\n options?: {\n dropVolumes: boolean;\n },\n) {\n const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });\n const compose = YAML.parse(composeSrcData.toString()) as ComposeYamlSpec;\n\n if (!compose.services) {\n throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);\n }\n\n if (services) {\n for (const svcName of Object.keys(compose.services)) {\n if (!services.has(svcName)) {\n delete compose.services[svcName];\n }\n }\n }\n\n compose.name = deployName;\n\n for (const [svcName, options] of services?.entries() ?? []) {\n const svcSpec = compose.services[svcName];\n\n if (!svcSpec) {\n throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);\n }\n\n if (options.platform) {\n svcSpec.platform = options.platform;\n }\n\n if (options.envs) {\n if (!svcSpec.environment) {\n svcSpec.environment = [];\n }\n for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {\n const envSpec: string = svcSpec.environment[envSpecI];\n const envName = envSpec.split('=')[0];\n if (options.envs[envName]) {\n // Drop env expression from list as we will replace it later by our custom configuration\n const last = svcSpec.environment.pop();\n\n // Do not insert back last element we just removed.\n if (last && svcSpec.environment.length !== envSpecI) {\n svcSpec.environment[envSpecI] = last;\n }\n } else {\n envSpecI++;\n }\n }\n\n for (const [envName, envValue] of Object.entries(options.envs)) {\n svcSpec.environment.push(`${envName}=${envValue}`);\n }\n }\n\n if (options.mounts) {\n if (!svcSpec.volumes) {\n svcSpec.volumes = [];\n }\n for (const mount of options.mounts) {\n svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);\n }\n }\n }\n\n if (options?.dropVolumes) {\n delete compose.volumes;\n }\n\n fs.writeFileSync(composeDest, YAML.stringify(compose));\n}\n","export type plSettings = {\n localRoot: string;\n\n license: licenseSettings;\n log: logSettings;\n grpc: grpcSettings;\n core: coreSettings;\n storages: storagesSettings;\n\n monitoring: monitoringSettings;\n debug: debugSettings;\n\n hacks: {\n libraryDownloadable: boolean;\n };\n};\nexport type plOptions = {\n localRoot?: string;\n\n license?: licenseOptions;\n log?: logOptions;\n grpc?: grpcOptions;\n core?: coreOptions;\n storages?: storagesOptions;\n\n monitoring?: monitoringOptions;\n debug?: debugOptions;\n};\n\nexport type licenseSettings = {\n value: string;\n file: string;\n};\nexport type licenseOptions = DeepPartial<licenseSettings>;\n\nexport type logSettings = {\n level: string;\n path: string;\n};\nexport type logOptions = DeepPartial<logSettings>;\n\nexport type coreSettings = {\n auth: authSettings;\n db: dbSettings;\n};\nexport type coreOptions = {\n auth?: authOptions;\n db?: dbOptions;\n};\n\nexport type authSettings = {\n enabled: boolean;\n drivers: authDriver[];\n};\nexport type authOptions = Partial<authSettings>;\n\nexport type dbSettings = {\n path: string;\n};\nexport type dbOptions = Partial<dbSettings>;\n\nexport type authDriver =\n | {\n driver: 'ldap';\n serverUrl: string; // 'ldaps://ldap.example.com:1111'\n defaultDN: string; // 'cn=%u,ou=users,ou=users,dc=example,dc=com'\n }\n | {\n driver: 'jwt';\n key: string;\n }\n | {\n driver: 'htpasswd';\n path: string;\n };\n\nexport type grpcSettings = {\n listen: string;\n tls: tlsSettings;\n};\nexport type grpcOptions = Partial<grpcSettings>;\n\nexport type tlsSettings = {\n enable: boolean;\n clientAuthMode: tlsAuthMode;\n certFile: string;\n keyFile: string;\n};\nexport type tlsOptions = Partial<tlsSettings>;\n\nexport type tlsAuthMode = 'NoAuth' | 'RequestAnyCert' | 'RequireAnyCert' | 'RequestValidCert' | 'RequireValidCert';\n\nexport type storagesSettings = {\n primary: storageSettings;\n work: fsStorageSettings;\n library: storageSettings;\n};\nexport type storagesOptions = {\n primary?: storageOptions;\n work?: storageOptions;\n library?: storageOptions;\n};\n\nexport type storageSettings = s3StorageSettings | fsStorageSettings;\nexport type storageOptions = s3StorageOptions | fsStorageOptions;\n\ntype storageID = { id: string };\ntype commonStorageSettings = {\n indexCachePeriod: string;\n};\n\nexport type s3StorageSettings = storageID & s3StorageType & commonStorageSettings & s3StorageTypeSettings;\nexport type s3StorageOptions = s3StorageType & Partial<commonStorageSettings> & Partial<s3StorageTypeSettings>;\nexport function emptyS3Settings(id: string): s3StorageSettings {\n return {\n id: id,\n type: 'S3',\n indexCachePeriod: '0s',\n endpoint: '',\n region: '',\n bucketName: '',\n createBucket: false,\n forcePathStyle: false,\n key: '',\n secret: '',\n keyPrefix: '',\n accessPrefixes: [],\n uploadKeyPrefix: '',\n };\n}\n\ntype s3StorageType = { type: 'S3' };\ntype s3StorageTypeSettings = {\n endpoint?: string;\n presignEndpoint?: string;\n region?: string;\n bucketName: string;\n createBucket: boolean;\n forcePathStyle: boolean;\n key: string;\n secret: string;\n keyPrefix: string;\n accessPrefixes: string[];\n uploadKeyPrefix: string;\n};\n\nexport type fsStorageSettings = storageID & fsStorageType & commonStorageSettings & fsStorageTypeSettings;\nexport type fsStorageOptions = fsStorageType & Partial<commonStorageSettings> & Partial<fsStorageTypeSettings>;\nexport function emptyFSSettings(id: string): fsStorageSettings {\n return {\n id: id,\n type: 'FS',\n indexCachePeriod: '0s',\n rootPath: '',\n };\n}\n\ntype fsStorageType = { type: 'FS' };\ntype fsStorageTypeSettings = {\n rootPath: string;\n};\n\nexport type monitoringSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type monitoringOptions = Partial<monitoringSettings>;\n\nexport type debugSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type debugOptions = Partial<debugSettings>;\n\n/** Makes all keys and keys in sub-objects optional. */\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n","import fs from 'node:fs';\nimport * as types from './types';\nimport { assertNever, resolveTilde } from '../util';\nimport state from '../state';\n\nexport type { plOptions } from './types';\n\nexport function storageSettingsFromURL(\n storageURL: string,\n baseDir?: string,\n defaults?: types.storageOptions,\n): types.storageOptions {\n storageURL = resolveTilde(storageURL);\n const url = new URL(storageURL, `file:${baseDir}`);\n\n switch (url.protocol) {\n case 's3:': {\n const bucketName = url.hostname;\n const region = url.searchParams.get('region');\n const keyPrefix = url.pathname.slice(1); // 's3://bucket/' will have '/' as pathname. We don't want to always have '/' prefix\n\n return {\n ...defaults,\n\n type: 'S3',\n bucketName,\n region,\n keyPrefix,\n } as types.storageOptions;\n }\n case 's3e:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `http://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 's3es:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `https://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 'file:':\n return {\n type: 'FS',\n rootPath: url.pathname,\n };\n\n default:\n throw new Error(`storage protocol '${url.protocol}' is not supported`);\n }\n}\n\nexport function loadDefaults(jwtKey: string, options?: types.plOptions): types.plSettings {\n const localRoot = options?.localRoot ?? state.instanceDir('default');\n\n const log: types.logSettings = {\n level: options?.log?.level ?? 'info',\n path: options?.log?.path ?? `${localRoot}/logs/platforma.log`,\n };\n\n const grpc: types.grpcSettings = {\n listen: options?.grpc?.listen ?? 'localhost:6345',\n tls: {\n enable: defaultBool(options?.grpc?.tls?.enable, false),\n clientAuthMode: options?.grpc?.tls?.clientAuthMode ?? 'NoAuth',\n certFile: options?.grpc?.tls?.certFile ?? `${localRoot}/certs/tls.cert`,\n keyFile: options?.grpc?.tls?.keyFile ?? `${localRoot}/certs/tls.key`,\n\n ...options?.grpc?.tls,\n },\n };\n\n const core: types.coreSettings = {\n auth: {\n enabled: options?.core?.auth?.enabled ?? false,\n drivers: options?.core?.auth?.drivers ?? [\n { driver: 'jwt', key: jwtKey },\n { driver: 'htpasswd', path: `${localRoot}/users.htpasswd` },\n ],\n },\n db: {\n path: `${localRoot}/db`,\n },\n };\n\n const primary = defaultStorageSettings(\n 'main',\n `${localRoot}/storages/main`,\n 'main-bucket',\n options?.storages?.primary,\n );\n\n let work: types.storageSettings;\n const wType = options?.storages?.work?.type;\n switch (wType) {\n case undefined:\n case 'FS':\n work = types.emptyFSSettings('work');\n work.rootPath = options?.storages?.work?.rootPath ?? `${localRoot}/storages/work`;\n work.indexCachePeriod = options?.storages?.work?.indexCachePeriod ?? '1m';\n break;\n\n default:\n throw new Error('work storage MUST have \\'FS\\' type as it is used for working directories management');\n }\n\n const library = defaultStorageSettings(\n 'library',\n `${localRoot}/storages/library`,\n 'library-bucket',\n options?.storages?.library,\n );\n\n const monitoring: types.monitoringSettings = {\n enabled: defaultBool(options?.monitoring?.enabled, true),\n listen: options?.monitoring?.listen ?? '127.0.0.1:9090',\n };\n const debug: types.debugSettings = {\n enabled: defaultBool(options?.debug?.enabled, true),\n listen: options?.debug?.listen ?? '127.0.0.1:9091',\n };\n const license: types.licenseSettings = {\n value: options?.license?.value ?? '',\n file: options?.license?.file ?? '',\n };\n\n return {\n localRoot,\n license,\n log,\n grpc,\n core,\n monitoring,\n debug,\n storages: { primary, work, library },\n hacks: { libraryDownloadable: true },\n };\n}\n\nfunction defaultStorageSettings(\n storageID: string,\n defaultLocation: string,\n defaultBucket: string,\n options?: types.storageOptions,\n): types.storageSettings {\n let storage: types.storageSettings;\n const pType = options?.type;\n switch (pType) {\n case undefined:\n case 'FS':\n storage = types.emptyFSSettings(storageID);\n storage.rootPath = options?.rootPath ?? defaultLocation;\n break;\n\n case 'S3':\n storage = types.emptyS3Settings(storageID);\n\n storage.endpoint = options?.endpoint;\n storage.region = options?.region;\n storage.presignEndpoint = options?.presignEndpoint ?? options?.endpoint;\n storage.bucketName = options?.bucketName ?? defaultBucket;\n storage.createBucket = defaultBool(options?.createBucket, true);\n storage.forcePathStyle = defaultBool(options?.forcePathStyle, true);\n storage.key = options?.key ?? '';\n storage.secret = options?.secret ?? '';\n storage.keyPrefix = options?.keyPrefix ?? '';\n storage.accessPrefixes = options?.accessPrefixes ?? [''];\n storage.uploadKeyPrefix = options?.uploadKeyPrefix ?? '';\n break;\n\n default:\n assertNever(pType);\n throw new Error('unknown storage type'); // calm down TS type analyzer\n }\n\n return storage;\n}\n\nexport function render(options: types.plSettings): string {\n const disableMon = options.monitoring.enabled ? '' : ' disabled';\n const disableDbg = options.debug.enabled ? '' : ' disabled';\n const libraryDownloadable = options.hacks.libraryDownloadable ? 'true' : 'false';\n\n let miLicenseSecret = options.license.value;\n if (options.license.file != '') {\n miLicenseSecret = fs.readFileSync(options.license.file).toString().trimEnd();\n }\n\n return `\nlicense:\n value: '${options.license.value}'\n file: '${options.license.file}'\n\nlogging:\n level: '${options.log.level}'\n destinations:\n - path: '${options.log.path}'\n rotation:\n maxSize: 1GiB\n maxBackups: 15\n compress: true\n\nmonitoring${disableMon}:\n listen: '${options.monitoring.listen}'\n\ndebug${disableDbg}:\n listen: '${options.debug.listen}'\n\ncore:\n logging:\n extendedInfo: true\n dumpResourceData: false\n\n grpc:\n listen: '${options.grpc.listen}'\n\n tlsEnabled: ${JSON.stringify(options.grpc.tls.enable)}\n tls:\n clientAuthMode: '${options.grpc.tls.clientAuthMode}'\n certificates:\n - certFile: '${options.grpc.tls.certFile}'\n keyFile: '${options.grpc.tls.keyFile}'\n\n\n authEnabled: ${JSON.stringify(options.core.auth.enabled)}\n auth: ${JSON.stringify(options.core.auth.drivers)}\n db:\n path: '${options.core.db.path}'\n\ncontrollers:\n data:\n main:\n storages:\n main:\n mode: primary\n downloadable: true\n\n library:\n mode: passive\n downloadable: ${libraryDownloadable}\n\n work:\n mode: active\n downloadable: false\n\n storages:\n - ${JSON.stringify(options.storages.primary)}\n - ${JSON.stringify(options.storages.library)}\n - ${JSON.stringify(options.storages.work)}\n\n runner:\n type: local\n storageRoot: '${(options.storages.work).rootPath}'\n workdirCacheOnFailure: 1h\n secrets:\n - map:\n MI_LICENSE: ${JSON.stringify(miLicenseSecret)}\n\n packageLoader:\n packagesRoot: '${options.localRoot}/packages'\n\n workflows: {}\n`;\n}\n\nfunction defaultBool(v: boolean | undefined, def: boolean): boolean {\n return v === undefined ? def : v;\n}\n","import os from 'node:os';\nimport fs from 'node:fs';\nimport https from 'https';\nimport path from 'node:path';\n\nimport * as tar from 'tar';\nimport type winston from 'winston';\nimport state from './state';\nimport { getDefaultPlVersion } from '@milaboratories/pl-deployments';\n\nexport const OSes = ['linux', 'macos', 'windows'] as const;\nexport type OSType = (typeof OSes)[number];\n\nexport function archiveOS(osName?: string): OSType {\n const platform = osName ?? os.platform();\n\n switch (platform) {\n case 'darwin':\n return 'macos';\n case 'linux':\n return 'linux';\n case 'win32':\n return 'windows';\n default:\n throw new Error(\n `operating system '${platform}' is not currently supported by Platforma ecosystem. The list of OSes supported: `\n + JSON.stringify(OSes),\n );\n }\n}\n\nexport const Arches = ['amd64', 'arm64'] as const;\nexport type ArchType = (typeof Arches)[number];\n\nexport function archiveArch(archName?: string): ArchType {\n const arch = archName ?? os.arch();\n\n switch (arch) {\n case 'arm64':\n return 'arm64';\n case 'x64':\n return 'amd64';\n default:\n throw new Error(\n `processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: `\n + JSON.stringify(Arches),\n );\n }\n}\n\nexport function downloadArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n showProgress?: boolean;\n downloadURL?: string;\n saveTo?: string;\n },\n): Promise<string> {\n const version = options?.version ?? getDefaultPlVersion();\n const showProgress = options?.showProgress ?? process.stdout.isTTY;\n\n const archiveName = `pl-${version}-${archiveArch()}.tgz`;\n const downloadURL = options?.downloadURL ?? `https://cdn.platforma.bio/software/pl/${archiveOS()}/${archiveName}`;\n\n const archiveFilePath = options?.saveTo ?? state.binaries(archiveName);\n if (fs.existsSync(archiveFilePath)) {\n logger.info(`Platforma Backend archive download skipped: '${archiveFilePath}' already exists`);\n return Promise.resolve(archiveFilePath);\n }\n\n fs.mkdirSync(path.dirname(archiveFilePath), { recursive: true });\n\n logger.info(`Downloading Platforma Backend archive:\\n URL: ${downloadURL}\\n Save to: ${archiveFilePath}`);\n\n const request = https.get(downloadURL);\n\n return new Promise((resolve, reject) => {\n request.on('response', (response) => {\n if (!response.statusCode) {\n const err = new Error('failed to download archive: no HTTP status code in response from server');\n request.destroy();\n reject(err);\n return;\n }\n if (response.statusCode !== 200) {\n const err = new Error(`failed to download archive: ${response.statusCode} ${response.statusMessage}`);\n request.destroy();\n reject(err);\n return;\n }\n\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\n let downloadedBytes = 0;\n\n const archive = fs.createWriteStream(archiveFilePath);\n\n response.pipe(archive);\n response.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const progress = (downloadedBytes / totalBytes) * 100;\n if (showProgress) {\n process.stdout.write(` downloading: ${progress.toFixed(2)}%\\r`);\n }\n });\n\n response.on('error', (err: Error) => {\n fs.unlinkSync(archiveFilePath);\n logger.error(`Failed to download Platforma Binary: ${err.message}`);\n request.destroy();\n reject(err);\n });\n\n archive.on('finish', () => {\n archive.close();\n logger.info(` ... download done.`);\n request.destroy();\n resolve(archiveFilePath);\n });\n });\n });\n}\n\nexport function extractArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n archivePath?: string;\n extractTo?: string;\n },\n): string {\n logger.debug('extracting archive...');\n\n const version = options?.version ?? getDefaultPlVersion();\n logger.debug(` version: '${version}'`);\n const archiveName = `${binaryDirName({ version })}.tgz`;\n\n const archivePath = options?.archivePath ?? state.binaries(archiveName);\n logger.debug(` archive path: '${archivePath}'`);\n\n const targetDir = options?.extractTo ?? trimExtension(archivePath);\n logger.debug(` target dir: '${targetDir}'`);\n\n if (fs.existsSync(targetDir)) {\n logger.info(`Platforma Backend binaries unpack skipped: '${targetDir}' exists`);\n return targetDir;\n }\n\n if (!fs.existsSync(archivePath)) {\n const msg = `Platforma Backend binary archive not found at '${archivePath}'`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n if (!fs.existsSync(targetDir)) {\n logger.debug(` creating target dir '${targetDir}'`);\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n logger.info(`Unpacking Platforma Backend archive:\\n Archive: ${archivePath}\\n Target dir: ${targetDir}`);\n\n tar.x({\n file: archivePath,\n cwd: targetDir,\n gzip: true,\n sync: true,\n });\n\n logger.info(` ... unpack done.`);\n\n return targetDir;\n}\n\nexport function getBinary(\n logger: winston.Logger,\n options?: { version?: string; showProgress?: boolean },\n): Promise<string> {\n return downloadArchive(logger, options).then((archivePath) => extractArchive(logger, { archivePath }));\n}\n\nfunction binaryDirName(options?: { version?: string }): string {\n const version = options?.version ?? getDefaultPlVersion();\n return `pl-${version}-${archiveArch()}`;\n}\n\nexport function binaryPath(version?: string, ...p: string[]): string {\n return state.binaries(binaryDirName({ version }), ...p);\n}\n\nfunction trimExtension(filename: string): string {\n const lastDotIndex = filename.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return filename;\n }\n return filename.slice(0, lastDotIndex);\n}\n","import type { ChildProcess, SpawnSyncReturns } from 'node:child_process';\nimport { spawn, spawnSync } from 'node:child_process';\nimport yaml from 'yaml';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport * as pkg from './package';\nimport * as run from './run';\nimport * as composeCfg from './templates/compose';\nimport * as plCfg from './templates/pl-config';\nimport type * as types from './templates/types';\nimport * as platforma from './platforma';\nimport type { instanceInfo, instanceCommand } from './state';\nimport state from './state';\nimport * as util from './util';\nimport type winston from 'winston';\n\nexport default class Core {\n constructor(private readonly logger: winston.Logger) { }\n\n public startLast(): ChildProcess[] {\n const instance = state.currentInstance;\n if (!instance) {\n this.logger.error('failed to bring back Platforma Backend in the last started configuration: no last configuration found');\n throw new Error('no previous run info found');\n }\n\n return this.startInstance(instance);\n }\n\n public startInstance(instance: instanceInfo): ChildProcess[] {\n if (instance.runInfo) {\n const runInfo = this.renderRunInfo(instance.runInfo);\n this.logger.info(`Starting platforma backend instance '${instance.name}':\\n${runInfo}`);\n }\n\n const result = run.runCommands(\n this.logger,\n instance.upCommands,\n );\n checkRunError(result.executed);\n\n if (result.spawned.length > 0 && instance.type === 'process') {\n instance.pid = result.spawned[result.spawned.length - 1].pid;\n state.setInstanceInfo(instance.name, instance);\n this.logger.info(`instance '${instance.name}' started`);\n }\n\n state.currentInstanceName = instance.name;\n\n return result.spawned;\n }\n\n public stopInstance(instance: instanceInfo) {\n this.logger.info(`stopping platforma backend instance '${instance.name}'...`);\n const result = run.runCommands(this.logger, instance.downCommands);\n checkRunError(result.executed);\n\n const iType = instance.type;\n switch (iType) {\n case 'docker': {\n return;\n }\n\n case 'process': {\n if (instance.pid && state.isInstanceActive(instance)) {\n process.kill(instance.pid);\n }\n\n return;\n }\n default:\n util.assertNever(iType);\n }\n }\n\n public switchInstance(instance: instanceInfo): ChildProcess[] {\n // Stop all other active instances before switching to new one;\n for (const iName of state.instanceList) {\n if (iName !== instance.name) {\n const iToStop = state.getInstanceInfo(iName);\n if (state.isInstanceActive(iToStop)) {\n this.stopInstance(iToStop);\n }\n }\n }\n\n return this.startInstance(instance);\n }\n\n public createLocal(instanceName: string, options?: createLocalOptions): instanceInfo {\n let plBinaryPath = platforma.binaryPath(options?.version, 'binaries', 'platforma');\n if (options?.sourcesPath) {\n plBinaryPath = path.join(os.tmpdir(), 'platforma-custom-build');\n }\n if (options?.binaryPath) {\n plBinaryPath = options.binaryPath;\n }\n\n let configPath = options?.configPath;\n const workdir: string = options?.workdir ?? (configPath ? process.cwd() : state.instanceDir(instanceName));\n\n if (options?.primaryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n primary: plCfg.storageSettingsFromURL(options.primaryURL, workdir, options.configOptions?.storages?.primary),\n },\n };\n }\n if (options?.libraryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n library: plCfg.storageSettingsFromURL(options.libraryURL, workdir, options.configOptions?.storages?.library),\n },\n };\n }\n\n const configOptions = plCfg.loadDefaults(this.getLastJwt(), options?.configOptions);\n\n this.logger.debug(` checking license...`);\n this.checkLicense(options?.configOptions?.license?.value, options?.configOptions?.license?.file);\n\n const storageDirs: string[] = [\n `${configOptions.localRoot}/packages`,\n `${configOptions.localRoot}/packages-local`,\n `${configOptions.localRoot}/blocks-local`,\n ];\n if (configOptions.storages.primary.type === 'FS') {\n storageDirs.push(configOptions.storages.primary.rootPath);\n }\n if (configOptions.storages.library.type === 'FS') {\n storageDirs.push(configOptions.storages.library.rootPath);\n configOptions.hacks.libraryDownloadable = false;\n }\n if (configOptions.storages.work.type === 'FS') {\n storageDirs.push(configOptions.storages.work.rootPath);\n }\n\n this.logger.debug(' creating pl state directories...');\n for (const dir of storageDirs) {\n if (!fs.existsSync(dir)) {\n this.logger.debug(` '${dir}'`);\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n for (const drv of configOptions.core.auth.drivers) {\n if (drv.driver === 'htpasswd') {\n if (!fs.existsSync(drv.path)) {\n this.logger.debug(` installing default 'users.htpasswd' to ${drv.path}...`);\n fs.copyFileSync(pkg.assets('users.htpasswd'), drv.path);\n }\n }\n }\n\n if (!configPath) {\n configPath = path.join(configOptions.localRoot, 'config.yaml');\n this.logger.debug(` rendering configuration '${configPath}'...`);\n fs.writeFileSync(configPath, plCfg.render(configOptions));\n }\n\n const upCommands: instanceCommand[] = [];\n if (options?.sourcesPath) {\n upCommands.push({\n cmd: 'go',\n args: ['build', '-o', plBinaryPath, '.'],\n workdir: path.resolve(options.sourcesPath, 'cmd', 'platforma'),\n runOpts: {\n stdio: 'inherit',\n },\n });\n }\n\n upCommands.push({\n async: true,\n cmd: plBinaryPath,\n args: ['-config', configPath],\n workdir: workdir,\n runOpts: { stdio: 'inherit' },\n });\n\n state.setInstanceInfo(instanceName, {\n type: 'process',\n upCommands: upCommands,\n downCommands: [],\n cleanupCommands: [],\n runInfo: {\n configPath,\n dbPath: configOptions.core.db.path,\n apiAddr: configOptions.grpc.listen,\n logPath: configOptions.log.path,\n primary: configOptions.storages.primary,\n work: configOptions.storages.work,\n library: configOptions.storages.library,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public createLocalS3(instanceName: string, options?: createLocalS3Options): instanceInfo {\n this.logger.debug('creating platforma instance in \\'local s3\\' mode...');\n\n const minioPort = options?.minioPort ?? 9000;\n\n const instance = this.createLocal(instanceName, {\n ...options,\n primaryURL: options?.primaryURL ?? `s3e://testuser:testpassword@localhost:${minioPort}/main-bucket/?region=no-region`,\n libraryURL: options?.libraryURL ?? `s3e://testuser:testpassword@localhost:${minioPort}/library-bucket/?region=no-region`,\n });\n\n const localRoot = options?.configOptions?.localRoot;\n const minioRunCmd = this.createMinio(instanceName, {\n minioPort: minioPort,\n minioConsolePort: options?.minioConsolePort,\n storage: localRoot ? path.join(localRoot, 'minio') : undefined,\n });\n\n instance.upCommands = [\n minioRunCmd.start,\n ...instance.upCommands,\n ];\n\n instance.downCommands = [\n minioRunCmd.stop,\n ...instance.downCommands,\n ];\n\n instance.cleanupCommands = [\n minioRunCmd.cleanup,\n ...instance.cleanupCommands,\n ];\n\n state.setInstanceInfo(instanceName, instance);\n return instance;\n }\n\n public createMinio(\n instanceName: string,\n options?: {\n image?: string;\n version?: string;\n minioPort?: number;\n minioConsolePort?: number;\n storage?: string;\n }): {\n start: instanceCommand;\n stop: instanceCommand;\n cleanup: instanceCommand;\n } {\n this.logger.debug(' creating docker compose for minio service...');\n const composeSrc = pkg.assets('compose-backend.yaml');\n const composeMinio = state.instanceDir(instanceName, 'compose-minio.yaml');\n\n composeCfg.render(composeSrc, composeMinio, `pl-${instanceName}-minio`,\n new Map([\n ['minio', {}],\n ]),\n { dropVolumes: true },\n );\n\n const version = options?.version ? `:${options.version}` : '';\n this.logger.debug(` minio version: ${version}`);\n const image = options?.image ?? `quay.io/minio/minio${version}`;\n this.logger.debug(` minio image: ${image}`);\n\n const storage = options?.storage ?? state.instanceDir(instanceName, 'minio');\n util.ensureDir(storage, { mode: '0775' });\n\n const minioPort = options?.minioPort ?? 9000;\n const minioConsolePort = options?.minioConsolePort ?? 9001;\n\n const envs = {\n MINIO_IMAGE: image,\n MINIO_STORAGE: path.resolve(storage),\n MINIO_PORT: minioPort.toString(),\n MINIO_CONSOLE_PORT: minioConsolePort.toString(),\n };\n\n return {\n start: {\n cmd: 'docker',\n args: ['compose', `--file=${composeMinio}`, 'up', '--detach', '--remove-orphans', '--pull=missing'],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: 'inherit' },\n },\n stop: {\n cmd: 'docker',\n args: ['compose', `--file=${composeMinio}`, 'down'],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: 'inherit' },\n },\n cleanup: {\n cmd: 'docker',\n args: ['compose', `--file=${composeMinio}`, 'down', '--volumes', '--remove-orphans'],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: 'inherit' },\n },\n };\n }\n\n public createDockerS3(\n instanceName: string,\n localRoot: string,\n options?: {\n image?: string;\n version?: string;\n platformOverride?: string;\n\n logLevel?: string;\n auth?: types.authOptions;\n\n license?: string;\n licenseFile?: string;\n\n grpcPort?: number;\n grpcAddr?: string;\n\n presignHost?: string;\n\n monitoringPort?: number;\n monitoringAddr?: string;\n\n debugPort?: number;\n debugAddr?: string;\n\n customMounts?: { hostPath: string; containerPath?: string }[];\n },\n ): instanceInfo {\n this.logger.debug('creating platforma instance in \\'docker s3\\' mode...');\n\n const composeS3Path = pkg.assets('compose-backend.yaml');\n const image = options?.image ?? pkg.plImageTag(options?.version);\n\n this.checkLicense(options?.license, options?.licenseFile);\n\n const storagePath = (...s: string[]) => path.join(localRoot, ...s);\n const storageDir = (s: string) => {\n const p = storagePath(s);\n util.ensureDir(p, { mode: '0775' });\n return p;\n };\n\n const logFilePath = storagePath('logs', 'platforma.log');\n if (!fs.existsSync(logFilePath)) {\n fs.mkdirSync(path.dirname(logFilePath), { recursive: true });\n fs.writeFileSync(logFilePath, '');\n }\n\n const presignHost = options?.presignHost ?? 'localhost';\n\n const primary = plCfg.storageSettingsFromURL(`s3e://testuser:testpassword@minio:9000/main-bucket`);\n if (primary.type !== 'S3') {\n throw new Error('primary storage must have \\'S3\\' type in \\'docker s3\\' configuration');\n } else {\n primary.presignEndpoint = `http://${presignHost}:9000`;\n }\n\n const library = plCfg.storageSettingsFromURL(`s3e://testuser:testpassword@minio:9000/library-bucket`);\n if (library.type !== 'S3') {\n throw new Error(`${library.type} storage type is not supported for library storage`);\n } else {\n library.presignEndpoint = `http://${presignHost}:9000`;\n }\n\n const dbFSPath = storageDir('db');\n const workFSPath = storageDir('work');\n const usersFSPath = storagePath('users.htpasswd');\n if (!fs.existsSync(usersFSPath)) {\n fs.copyFileSync(pkg.assets('users.htpasswd'), usersFSPath);\n }\n\n const composeDstPath = storagePath('compose.yaml');\n if (fs.existsSync(composeDstPath)) {\n this.logger.info(`replacing docker compose file ${composeDstPath}`);\n }\n\n const backendMounts: composeCfg.VolumeMountOption[] = [];\n for (const mnt of options?.customMounts ?? []) {\n backendMounts.push({\n hostPath: mnt.hostPath,\n containerPath: mnt.containerPath ?? mnt.hostPath,\n });\n }\n composeCfg.render(composeS3Path, composeDstPath, `pl-${instanceName}`, new Map([\n ['minio', {}],\n ['backend', {\n platform: options?.platformOverride,\n mounts: backendMounts,\n }],\n ]));\n\n const envs: NodeJS.ProcessEnv = {\n MINIO_IMAGE: 'quay.io/minio/minio',\n MINIO_STORAGE: storageDir('minio'),\n\n PL_IMAGE: image,\n\n PL_AUTH_HTPASSWD_PATH: usersFSPath,\n PL_LICENSE: options?.license,\n PL_LICENSE_FILE: options?.licenseFile,\n\n PL_LOG_LEVEL: options?.logLevel ?? 'info',\n PL_LOG_DIR: path.dirname(logFilePath),\n PL_LOG_ROTATION_ENABLED: 'true',\n\n PL_RUNNER_WD_CACHE_ON_FAILURE: '1h',\n\n PL_DATA_DB_ROOT: dbFSPath,\n PL_DATA_PRIMARY_ROOT: storageDir('primary'),\n PL_DATA_LIBRARY_ROOT: storageDir('library'),\n PL_DATA_WORKDIR_ROOT: workFSPath,\n\n // Mount packages storage as volume, because APFS is case-insensitive on Mac OS X and this breaks some pl software installation.\n // PL_DATA_PACKAGE_ROOT: storageDir('packages'),\n\n ...this.configureDockerStorage('primary', primary),\n ...this.configureDockerStorage('library', library),\n };\n\n if (options?.grpcAddr) envs.PL_GRPC_ADDR = options.grpcAddr;\n if (options?.grpcPort) envs.PL_GRPC_PORT = options.grpcPort.toString();\n if (options?.monitoringAddr) envs.PL_MONITORING_ADDR = options.monitoringAddr;\n if (options?.monitoringPort) envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n if (options?.debugAddr) envs.PL_DEBUG_ADDR = options.debugAddr;\n if (options?.debugPort) envs.PL_DEBUG_PORT = options.debugPort.toString();\n if (options?.auth) {\n if (options.auth.enabled) {\n envs['PL_AUTH_ENABLED'] = 'true';\n }\n if (options.auth.drivers) {\n for (const drv of options.auth.drivers) {\n if (drv.driver === 'htpasswd') {\n envs['PL_AUTH_HTPASSWD_PATH'] = path.resolve(drv.path);\n drv.path = '/etc/platforma/users.htpasswd';\n }\n }\n envs['PL_AUTH_DRIVERS'] = JSON.stringify(options.auth.drivers);\n }\n }\n\n state.setInstanceInfo(instanceName, {\n type: 'docker',\n upCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'up', '--detach', '--remove-orphans', '--pull=missing'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n downCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'down'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n cleanupCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'down', '--volumes', '--remove-orphans'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n runInfo: {\n apiPort: options?.grpcPort,\n apiAddr: options?.grpcAddr,\n logPath: logFilePath,\n primary: primary,\n work: { type: 'FS', rootPath: workFSPath },\n library: library,\n dbPath: dbFSPath,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public createDocker(\n instanceName: string,\n localRoot: string,\n options?: {\n primaryStorageURL?: string;\n workStoragePath?: string;\n libraryStorageURL?: string;\n customMounts?: { hostPath: string; containerPath?: string }[];\n\n image?: string;\n version?: string;\n platformOverride?: string;\n\n logLevel?: string;\n\n auth?: types.authOptions;\n\n license?: string;\n licenseFile?: string;\n grpcPort?: number;\n grpcAddr?: string;\n\n monitoringPort?: number;\n monitoringAddr?: string;\n\n debugPort?: number;\n debugAddr?: string;\n },\n ): instanceInfo {\n this.logger.debug('creating platforma instance in \\'docker\\' mode...');\n\n const composeFSPath = pkg.assets('compose-backend.yaml');\n const image = options?.image ?? pkg.plImageTag(options?.version);\n\n this.checkLicense(options?.license, options?.licenseFile);\n\n const storagePath = (...s: string[]) => path.join(localRoot, ...s);\n const storageDir = (s: string) => {\n const p = storagePath(s);\n util.ensureDir(p, { mode: '0775' });\n return p;\n };\n\n const logFilePath = storagePath('logs', 'platforma.log');\n if (!fs.existsSync(logFilePath)) {\n fs.mkdirSync(path.dirname(logFilePath), { recursive: true });\n fs.writeFileSync(logFilePath, '');\n }\n\n const dbFSPath = storageDir('db');\n const primaryFSPath = storageDir('primary');\n const libraryFSPath = storageDir('library');\n const workFSPath = storageDir('work');\n const usersFSPath = storagePath('users.htpasswd');\n if (!fs.existsSync(usersFSPath)) {\n fs.copyFileSync(pkg.assets('users.htpasswd'), usersFSPath);\n }\n\n const composeDstPath = storagePath('compose.yaml');\n if (fs.existsSync(composeDstPath)) {\n this.logger.info(`replacing docker compose file ${composeDstPath}`);\n }\n\n const backendMounts: composeCfg.VolumeMountOption[] = [];\n for (const mnt of options?.customMounts ?? []) {\n backendMounts.push({\n hostPath: mnt.hostPath,\n containerPath: mnt.containerPath ?? mnt.hostPath,\n });\n }\n this.logger.debug(`Rendering docker compose file '${composeDstPath}' using '${composeFSPath}' as base template`);\n composeCfg.render(composeFSPath, composeDstPath, `pl-${instanceName}`, new Map([\n ['backend', {\n platform: options?.platformOverride,\n mounts: backendMounts,\n }],\n ]));\n\n const primary = plCfg.storageSettingsFromURL(options?.primaryStorageURL ?? `file:${primaryFSPath}`, '.');\n const library = plCfg.storageSettingsFromURL(options?.libraryStorageURL ?? `file:${libraryFSPath}`, '.');\n\n const envs: NodeJS.ProcessEnv = {\n PL_IMAGE: image,\n PL_AUTH_HTPASSWD_PATH: usersFSPath,\n PL_LICENSE: options?.license,\n PL_LICENSE_FILE: options?.licenseFile,\n\n PL_LOG_LEVEL: 'info',\n PL_LOG_DIR: path.dirname(logFilePath),\n PL_LOG_ROTATION_ENABLED: 'true',\n\n PL_RUNNER_WD_CACHE_ON_FAILURE: '1h',\n\n PL_DATA_DB_ROOT: dbFSPath,\n PL_DATA_PRIMARY_ROOT: primaryFSPath,\n PL_DATA_LIBRARY_ROOT: libraryFSPath,\n PL_DATA_WORKDIR_ROOT: workFSPath,\n PL_DATA_PACKAGE_ROOT: storageDir('packages'),\n\n ...this.configureDockerStorage('primary', primary),\n ...this.configureDockerStorage('library', library),\n };\n\n if (options?.grpcAddr) envs.PL_GRPC_ADDR = options.grpcAddr;\n if (options?.grpcPort) envs.PL_GRPC_PORT = options.grpcPort.toString();\n if (options?.monitoringAddr) envs.PL_MONITORING_ADDR = options.monitoringAddr;\n if (options?.monitoringPort) envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n if (options?.debugAddr) envs.PL_DEBUG_ADDR = options.debugAddr;\n if (options?.debugPort) envs.PL_DEBUG_PORT = options.debugPort.toString();\n\n if (options?.auth) {\n if (options.auth.enabled) {\n envs['PL_AUTH_ENABLED'] = 'true';\n }\n if (options.auth.drivers) {\n for (const drv of options.auth.drivers) {\n if (drv.driver === 'htpasswd') {\n envs['PL_AUTH_HTPASSWD_PATH'] = path.resolve(drv.path);\n drv.path = '/etc/platforma/users.htpasswd';\n }\n }\n envs['PL_AUTH_DRIVERS'] = JSON.stringify(options.auth.drivers);\n }\n }\n\n state.setInstanceInfo(instanceName, {\n type: 'docker',\n upCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'up', '--detach', '--remove-orphans', '--pull=missing'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n downCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'down'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n cleanupCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'down', '--volumes', '--remove-orphans'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n runInfo: {\n apiPort: options?.grpcPort,\n apiAddr: options?.grpcAddr,\n logPath: logFilePath,\n primary: primary,\n work: { type: 'FS', rootPath: workFSPath },\n library: library,\n dbPath: dbFSPath,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public cleanupInstance(instanceName?: string) {\n const removeWarns: string[] = [];\n const instancesToDrop = new Map<string, instanceInfo>();\n let warnMessage: string = '';\n\n if (instanceName) {\n const instance = state.getInstanceInfo(instanceName);\n instancesToDrop.set(instanceName, instance);\n const iType = instance.type;\n switch (iType) {\n case 'docker':{\n removeWarns.push(`docker service 'pl-${instanceName}', including all its volumes and data in '${state.instanceDir(instanceName)}' will be destroyed`);\n break;\n }\n case 'process':{\n removeWarns.push(`directory '${state.instanceDir(instanceName)}' would be deleted`);\n if (instance.downCommands) {\n removeWarns.push(`associated docker service, including all volumes and data will be destroyed`);\n }\n break;\n }\n default:\n util.assertNever(iType);\n }\n\n if (instanceName === state.currentInstanceName) {\n removeWarns.push(\n 'last command run cache (\\'pl-dev start\\' shorthand will stop working until next full start command call)',\n );\n }\n\n warnMessage = `\nYou are going to reset the state of platforma service '${instanceName}':\n - ${removeWarns.join('\\n - ')}\n`;\n } else {\n for (const iName of state.instanceList) {\n instancesToDrop.set(iName, state.getInstanceInfo(iName));\n }\n\n removeWarns.push(\n 'last command run cache (\\'pl-dev start\\' shorthand will stop working until next full start command call)',\n `all service configurations stored in: ${state.instanceDir()} (including all associated docker containers and volumes)`,\n );\n\n warnMessage = `\nYou are going to reset the state of all platforma services configured with pl-bootstrap package.\n - ${removeWarns.join('\\n - ')}\n`;\n }\n\n this.logger.warn(warnMessage);\n if (!util.askYN('Are you sure?')) {\n this.logger.info('Reset action was canceled');\n return;\n }\n\n for (const [name, instance] of instancesToDrop.entries()) {\n if (instance.cleanupCommands.length) {\n this.logger.info(`Wiping instance ${name} services`);\n const result = run.runCommands(this.logger, instance.cleanupCommands);\n checkRunError(result.executed, `failed to wipe instance ${name} services`);\n }\n\n this.logger.info(`Destroying instance '${name}' data directory`);\n fs.rmSync(state.instanceDir(name), { recursive: true, force: true });\n }\n\n if (!instanceName) {\n this.logger.info(`Destroying state dir '${state.path()}'`);\n fs.rmSync(state.path(), { recursive: true, force: true });\n }\n\n this.logger.info(\n `\\nIf you want to remove all downloaded platforma binaries, delete '${state.binaries()}' dir manually\\n`,\n );\n }\n\n public mergeLicenseEnvs(flags: { 'license'?: string; 'license-file'?: string }) {\n if (flags.license === undefined) {\n if ((process.env.MI_LICENSE ?? '') != '') flags.license = process.env.MI_LICENSE;\n else if ((process.env.PL_LICENSE ?? '') != '') flags.license = process.env.PL_LICENSE;\n }\n\n // set 'license-file' only if license is still undefined\n if (flags['license-file'] === undefined && flags.license === undefined) {\n if ((process.env.MI_LICENSE_FILE ?? '') != '') flags['license-file'] = process.env.MI_LICENSE_FILE;\n else if ((process.env.PL_LICENSE_FILE ?? '') != '') flags['license-file'] = process.env.PL_LICENSE_FILE;\n else if (fs.existsSync(path.resolve(os.homedir(), '.pl.license')))\n flags['license-file'] = path.resolve(os.homedir(), '.pl.license');\n }\n }\n\n public initAuthDriversList(\n flags: {\n 'auth-htpasswd-file'?: string;\n\n 'auth-ldap-server'?: string;\n 'auth-ldap-default-dn'?: string;\n },\n workdir: string,\n ): types.authDriver[] | undefined {\n const authDrivers: types.authDriver[] = [];\n if (flags['auth-htpasswd-file']) {\n authDrivers.push({\n driver: 'htpasswd',\n path: path.resolve(workdir, flags['auth-htpasswd-file']),\n });\n }\n\n if (Boolean(flags['auth-ldap-server']) !== Boolean(flags['auth-ldap-default-dn'])) {\n throw new Error('LDAP auth settings require both \\'server\\' and \\'default DN\\' options to be set');\n }\n\n if (flags['auth-ldap-server']) {\n authDrivers.push({\n driver: 'ldap',\n serverUrl: flags['auth-ldap-server'],\n defaultDN: flags['auth-ldap-default-dn']!,\n });\n }\n\n if (authDrivers.length === 0) {\n return undefined;\n }\n\n return [{ driver: 'jwt', key: this.getLastJwt() }, ...authDrivers] as types.authDriver[];\n }\n\n /** Gets the last stored JWT secret key or generates it and stores in a file. */\n public getLastJwt() {\n const jwtFile = state.path('auth.jwt');\n const encoding = 'utf-8';\n\n let lastJwt = '';\n if (fs.existsSync(jwtFile)) {\n lastJwt = fs.readFileSync(jwtFile, { encoding });\n }\n\n if (lastJwt == '') {\n lastJwt = util.randomStr(64);\n fs.writeFileSync(jwtFile, lastJwt, { encoding });\n }\n\n return lastJwt;\n }\n\n private checkLicense(value?: string, file?: string) {\n if (value !== undefined && value != '') return;\n\n if (file !== undefined && file != '') return;\n\n this.logger.error(`A license for Platforma Backend must be set.\n\nYou can provide the license directly using the '--license' flag\nor use the '--license-file' flag if the license is stored in a file.\n\nAlternatively, you can set it via the environment variables 'MI_LICENSE' or 'PL_LICENSE'.\n\nThe license file can also be set with the variables 'MI_LICENSE_FILE' or 'PL_LICENSE_FILE',\nor stored in '$HOME/.pl.license'.\n\nYou can obtain the license from \"https://licensing.milaboratories.com\".`);\n\n throw new Error(`The license was not provided.`);\n }\n\n private configureDockerStorage(storageID: string, storage: types.storageOptions): NodeJS.ProcessEnv {\n const envs: NodeJS.ProcessEnv = {};\n const sType = storage.type;\n storageID = storageID.toUpperCase();\n\n switch (sType) {\n case 'S3':\n envs[`PL_DATA_${storageID}_TYPE`] = 'S3';\n envs[`PL_DATA_${storageID}_S3_BUCKET`] = storage.bucketName!;\n\n if (storage.endpoint) envs[`PL_DATA_${storageID}_S3_ENDPOINT`] = storage.endpoint;\n if (storage.presignEndpoint) envs[`PL_DATA_${storageID}_S3_PRESIGN_ENDPOINT`] = storage.presignEndpoint;\n if (storage.region) envs[`PL_DATA_${storageID}_S3_REGION`] = storage.region;\n if (storage.key) envs[`PL_DATA_${storageID}_S3_KEY`] = storage.key;\n if (storage.secret) envs[`PL_DATA_${storageID}_S3_SECRET`] = storage.secret;\n\n return envs;\n\n case 'FS':\n envs[`PL_DATA_${storageID}_TYPE`] = 'FS';\n\n return envs;\n\n default:\n util.assertNever(sType);\n }\n\n return {};\n }\n\n private renderRunInfo(\n runInfo: {\n configPath?: string;\n apiPort?: number;\n apiAddr?: string;\n logPath?: string;\n dbPath?: string;\n primary?: types.storageOptions;\n work?: types.fsStorageOptions;\n library?: types.storageOptions;\n },\n indent: number = 10,\n ) {\n const report: string[] = [];\n\n const column = (t: string) => t.padStart(indent, ' ');\n if (runInfo.configPath) {\n report.push(`${column('config')}: ${runInfo.configPath}`);\n }\n\n if (runInfo.apiAddr) {\n report.push(`${column('API')}: ${runInfo.apiAddr}`);\n } else if (runInfo.apiPort) {\n report.push(`${column('API')}: 127.0.0.1:${runInfo.apiPort.toString()}`);\n } else {\n report.push(`${column('API')}: 127.0.0.1:6345`);\n }\n\n if (runInfo.logPath) {\n report.push(`${column('log')}: ${runInfo.logPath}`);\n }\n\n const primaryType = runInfo.primary?.type;\n switch (primaryType) {\n case undefined:\n break;\n\n case 'FS':\n report.push(`${column('primary')}: ${runInfo.primary!.rootPath!}`);\n break;\n\n case 'S3':\n report.push(\n `${column('primary')}: S3 at '${runInfo.primary!.endpoint ?? 'AWS'}', bucket '${runInfo.primary!.bucketName!}', prefix: '${runInfo.primary!.keyPrefix ?? ''}'`,\n );\n break;\n\n default:\n util.assertNever(primaryType);\n }\n\n const libraryType = runInfo.library?.type;\n switch (libraryType) {\n case undefined:\n break;\n\n case 'FS':\n report.push(`${column('library')}: ${runInfo.library!.rootPath!}`);\n break;\n\n case 'S3':\n report.push(\n `${column('library')}: S3 at '${runInfo.library!.endpoint ?? 'AWS'}', bucket '${runInfo.library!.bucketName!}', prefix: '${runInfo.library!.keyPrefix ?? ''}'`,\n );\n break;\n\n default:\n util.assertNever(libraryType);\n }\n\n if (runInfo.work) {\n report.push(`${column('workdirs')}: ${runInfo.work.rootPath}`);\n }\n\n if (runInfo.dbPath) {\n report.push(`${column('db')}: ${runInfo.dbPath}`);\n }\n\n return report.join('\\n');\n }\n}\n\nexport function checkRunError(result: SpawnSyncReturns<Buffer>[], message?: string) {\n for (const buffer of result) {\n if (buffer.error) {\n throw buffer.error;\n }\n\n const msg = message ?? 'failed to run command';\n\n if (buffer.status !== 0) {\n throw new Error(`${msg}, process exited with code '${buffer.status}'`);\n }\n }\n}\n\nexport type createLocalOptions = {\n version?: string;\n sourcesPath?: string;\n binaryPath?: string;\n configPath?: string;\n configOptions?: plCfg.plOptions;\n workdir?: string;\n\n primaryURL?: string;\n libraryURL?: string;\n};\n\nexport type createLocalFSOptions = createLocalOptions;\n\nexport type createLocalS3Options = createLocalOptions & {\n minioPort?: number;\n minioConsolePort?: number;\n};\n","import { Command, Flags } from '@oclif/core';\nimport Core from '../core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Reset extends Command {\n static override description =\n 'Clear service state (forget last run command, destroy docker services, volumes and so on)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Reset);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.cleanupInstance();\n }\n}\n","import { Command } from '@oclif/core';\nimport Core from '../core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Start extends Command {\n static override description = 'Start last run service configuraiton';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Start);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n core.startLast();\n }\n}\n","import { Command } from '@oclif/core';\nimport Core from '../core';\nimport state from '../state';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Stop extends Command {\n static override description = 'Stop platforma service';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Stop);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n if (state.currentInstance) {\n core.stopInstance(state.currentInstance);\n } else {\n logger.warn('up/start command was not called for any instance, nothing to stop');\n }\n }\n}\n","import path from 'node:path';\n\nimport { Command } from '@oclif/core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as util from '../../util';\nimport type * as types from '../../templates/types';\nimport state from '../../state';\n\nexport default class Docker extends Command {\n static override description = 'Run platforma backend service with \\'FS\\' primary storage type';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n ...cmdOpts.ArchFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.MountFlag,\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Docker);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = 'docker';\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.'),\n }\n : undefined;\n const storage = flags.storage ? path.join('.', flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n\n const instance = core.createDocker(instanceName, storage, {\n primaryStorageURL: flags['storage-primary'],\n workStoragePath: flags['storage-work'],\n libraryStorageURL: flags['storage-library'],\n\n image: flags.image,\n version: flags.version,\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port'],\n });\n\n core.switchInstance(instance);\n }\n}\n","import { Command } from '@oclif/core';\nimport path from 'node:path';\nimport type { createLocalOptions } from '../../core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as platforma from '../../platforma';\nimport * as util from '../../util';\nimport state from '../../state';\n\nexport default class Local extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Local);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = 'local';\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.instanceDir(instanceName);\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n let listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n let listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n let listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const startOptions: createLocalOptions = {\n sourcesPath: flags['pl-sources'],\n binaryPath: flags['pl-binary'],\n\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: { auth: { enabled: authEnabled, drivers: authDrivers } },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] },\n },\n },\n };\n\n const instance = core.createLocal(instanceName, startOptions);\n\n if (startOptions.binaryPath || startOptions.sourcesPath) {\n core.switchInstance(instance);\n } else {\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => {\n const children = core.switchInstance(instance);\n setTimeout(() => {\n for (const child of children) {\n child.unref();\n }\n }, 1000);\n })\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n }\n}\n","import { Command, Args, Flags } from '@oclif/core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as util from '../../util';\n\nexport default class Delete extends Command {\n static override description = 'List available instances';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n all: Flags.boolean({\n description: 'remove all known instances',\n required: false,\n }),\n };\n\n static args = {\n name: Args.string({ required: false }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Delete);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n const name = args.name;\n const all = flags.all;\n\n if (all) {\n core.cleanupInstance();\n process.exit(0);\n }\n\n if (!name) {\n logger.error(`Please, specify name of instance to be removed or set '--all' flag instead`);\n process.exit(1);\n }\n\n core.cleanupInstance(name);\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as util from '../../util';\nimport state from '../../state';\n\nexport default class Down extends Command {\n static override description = 'List available instances';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n };\n\n static args = {\n name: Args.string({ required: false }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Down);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n const name = args.name ?? state.currentInstanceName;\n\n if (!name) {\n logger.info(`no pl service instance selected. No service was stopped`);\n process.exit(0);\n }\n\n core.stopInstance(state.getInstanceInfo(name));\n }\n}\n","import { Command } from '@oclif/core';\nimport state from '../../state';\n\nexport default class List extends Command {\n static override description = 'List available instances';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = { };\n\n public async run(): Promise<void> {\n await this.parse(List);\n\n const instances = state.instanceList;\n const currentInstance = state.currentInstanceName;\n\n for (const iName of instances) {\n const statusReport = [];\n const instance = state.getInstanceInfo(iName);\n if (state.isInstanceActive(instance)) statusReport.push('status:up');\n statusReport.push(`type:${instance.type}`);\n\n if (iName === currentInstance) {\n console.log(` * ${iName} (${statusReport.join(', ')})`);\n } else {\n console.log(` ${iName} (${statusReport.join(', ')})`);\n }\n }\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as util from '../../util';\nimport state from '../../state';\n\nexport default class Up extends Command {\n static override description = 'List available instances';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n };\n\n static args = {\n name: Args.string({ required: false }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Up);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n const name = args.name ?? state.currentInstanceName;\n\n if (!name) {\n logger.error(`no pl service instance is selected. Select instance with 'select' command or provide name to 'up'`);\n process.exit(1);\n }\n\n const children = core.switchInstance(state.getInstanceInfo(name));\n\n // Before we're able to 'free' the terminal from lock of the process we start,\n // we have to provide a control over the instance state.\n // Without the control, there is no difference for the user between 'service successfully started' and 'service failed to start'\n //\n // When running service in docker, we can see the state of the service in Docker Desktop or via CLI utilities.\n // Also we see the feedback on faulty service start immediately.\n // When running service as a regular local process, the state control is comlicated.\n\n // When we're ready, replace all Promises magic below wit simple\n // for (const child of children) {\n // child.unref();\n // }\n\n const results: Promise<void>[] = [];\n for (const child of children) {\n results.push(new Promise((resolve, reject) => {\n child.on('close', resolve);\n child.on('error', reject);\n }));\n }\n\n await Promise.all(results);\n }\n}\n","import path from 'node:path';\n\nimport { Command } from '@oclif/core';\nimport Core from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as util from '../../../util';\nimport type * as types from '../../../templates/types';\nimport state from '../../../state';\n\nexport default class S3 extends Command {\n static override description = 'Run platforma backend service with \\'S3\\' primary storage type';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n ...cmdOpts.ArchFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.MountFlag,\n ...cmdOpts.StorageFlag,\n ...cmdOpts.MinioPresignHostFlag,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(S3);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = 'docker-s3';\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.'),\n }\n : undefined;\n\n const storage = flags.storage ? path.join('.', flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n const presignHost = flags['minio-presign-host'] ? 'minio' : 'localhost';\n\n const instance = core.createDockerS3(instanceName, storage, {\n image: flags.image,\n version: flags.version,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port'],\n\n presignHost: presignHost,\n });\n\n core.switchInstance(instance);\n }\n}\n","import path from 'node:path';\n\nimport { Command } from '@oclif/core';\nimport type { createLocalS3Options } from '../../../core';\nimport Core from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as platforma from '../../../platforma';\nimport * as util from '../../../util';\nimport state from '../../../state';\n\nexport default class S3 extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.S3AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(S3);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = 'local-s3';\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.instanceDir(instanceName);\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n let listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n let listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n let listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const startOptions: createLocalS3Options = {\n sourcesPath: flags['pl-sources'],\n binaryPath: flags['pl-binary'],\n\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n minioPort: flags['s3-port'],\n minioConsolePort: flags['s3-console-port'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: {\n auth: { enabled: authEnabled, drivers: authDrivers },\n },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] },\n },\n },\n };\n\n const instance = core.createLocalS3(instanceName, startOptions);\n\n if (startOptions.binaryPath || startOptions.sourcesPath) {\n core.switchInstance(instance);\n } else {\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => {\n const children = core.switchInstance(instance);\n setTimeout(() => {\n for (const child of children) {\n child.unref();\n }\n }, 1000);\n })\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport path from 'node:path';\nimport type * as types from '../../../templates/types';\nimport Core from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as util from '../../../util';\nimport state from '../../../state';\n\nexport default class Docker extends Command {\n static override description = 'Run Platforma Backend service as docker container on current host';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n ...cmdOpts.ArchFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.MountFlag,\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n };\n\n static args = {\n name: Args.string({ required: true }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Docker);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = args.name;\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.'),\n }\n : undefined;\n\n const storage = flags.storage ? path.join('.', flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n\n core.createDocker(instanceName, storage, {\n primaryStorageURL: flags['storage-primary'],\n workStoragePath: flags['storage-work'],\n libraryStorageURL: flags['storage-library'],\n\n image: flags.image,\n version: flags.version,\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port'],\n });\n\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport path from 'node:path';\nimport type { createLocalOptions } from '../../../core';\nimport Core from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as util from '../../../util';\nimport state from '../../../state';\nimport * as platforma from '../../../platforma';\n\nexport default class Local extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags,\n };\n\n static args = {\n name: Args.string({ required: true }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Local);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = args.name;\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.instanceDir(instanceName);\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n let listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n let listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n let listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const createOptions: createLocalOptions = {\n sourcesPath: flags['pl-sources'],\n binaryPath: flags['pl-binary'],\n\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: { auth: { enabled: authEnabled, drivers: authDrivers } },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] },\n },\n },\n };\n\n core.createLocal(instanceName, createOptions);\n\n if (createOptions.binaryPath || createOptions.sourcesPath) {\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n return;\n }\n\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => logger.info(`Instance '${instanceName}' was created. To start it run 'svc up' command`))\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport path from 'node:path';\nimport type * as types from '../../../../templates/types';\nimport Core from '../../../../core';\nimport * as cmdOpts from '../../../../cmd-opts';\nimport * as util from '../../../../util';\nimport state from '../../../../state';\n\nexport default class S3 extends Command {\n static override description = 'Run Platforma Backend service as docker container on current host with MinIO as local S3 storage';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n ...cmdOpts.ArchFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.MountFlag,\n ...cmdOpts.StorageFlag,\n ...cmdOpts.MinioPresignHostFlag,\n };\n\n static args = {\n name: Args.string({ required: true }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(S3);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = args.name;\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.'),\n }\n : undefined;\n\n const storage = flags.storage ? path.join('.', flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n const presignHost = flags['minio-presign-host'] ? 'minio' : 'localhost';\n\n core.createDockerS3(instanceName, storage, {\n image: flags.image,\n version: flags.version,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port'],\n\n presignHost: presignHost,\n });\n\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n if (flags['minio-presign-host']) {\n logger.info(' NOTE: make sure you have \\'minio\\' host in your hosts file as 127.0.0.1 address');\n }\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport path from 'node:path';\nimport type { createLocalS3Options } from '../../../../core';\nimport Core from '../../../../core';\nimport * as cmdOpts from '../../../../cmd-opts';\nimport * as util from '../../../../util';\nimport state from '../../../../state';\nimport * as platforma from '../../../../platforma';\n\nexport default class Local extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.S3AddressesFlags,\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags,\n };\n\n static args = {\n name: Args.string({ required: true }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Local);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = args.name;\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.instanceDir(instanceName);\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n let listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n let listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n let listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const createOptions: createLocalS3Options = {\n sourcesPath: flags['pl-sources'],\n binaryPath: flags['pl-binary'],\n\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n minioPort: flags['s3-port'],\n minioConsolePort: flags['s3-console-port'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: { auth: { enabled: authEnabled, drivers: authDrivers } },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] },\n },\n },\n\n };\n\n logger.info(`Creating instance configuration, data directory and other stuff...`);\n core.createLocalS3(instanceName, createOptions);\n\n if (createOptions.binaryPath || createOptions.sourcesPath) {\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n return;\n }\n\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => logger.info(`Instance '${instanceName}' was created. To start it run 'svc up' command`))\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n}\n","// DO NOT EDIT. This file was generated by oclif-index utility.\n\nimport Cmd0 from './commands/create-block';\nimport Cmd1 from './commands/reset';\nimport Cmd2 from './commands/start';\nimport Cmd3 from './commands/stop';\nimport Cmd4 from './commands/start/docker';\nimport Cmd5 from './commands/start/local';\nimport Cmd6 from './commands/svc/delete';\nimport Cmd7 from './commands/svc/down';\nimport Cmd8 from './commands/svc/list';\nimport Cmd9 from './commands/svc/up';\nimport Cmd10 from './commands/start/docker/s3';\nimport Cmd11 from './commands/start/local/s3';\nimport Cmd12 from './commands/svc/create/docker';\nimport Cmd13 from './commands/svc/create/local';\nimport Cmd14 from './commands/svc/create/docker/s3';\nimport Cmd15 from './commands/svc/create/local/s3';\n\n// prettier-ignore\nexport const COMMANDS = {\n 'create-block': Cmd0,\n 'reset': Cmd1,\n 'start': Cmd2,\n 'stop': Cmd3,\n 'start:docker': Cmd4,\n 'start:local': Cmd5,\n 'svc:delete': Cmd6,\n 'svc:down': Cmd7,\n 'svc:list': Cmd8,\n 'svc:up': Cmd9,\n 'start:docker:s3': Cmd10,\n 'start:local:s3': Cmd11,\n 'svc:create:docker': Cmd12,\n 'svc:create:local': Cmd13,\n 'svc:create:docker:s3': Cmd14,\n 'svc:create:local:s3': Cmd15,\n};\n"],"names":["GlobalFlags","Flags","ImageFlag","VersionFlag","ArchFlag","LicenseFlags","AddressesFlags","S3AddressesFlags","StorageFlag","MinioPresignHostFlag","MountFlag","PlLogFileFlag","PlWorkdirFlag","PlBinaryFlag","PlSourcesFlag","ConfigFlag","StorageWorkPathFlag","StoragePrimaryURLFlag","StorageLibraryURLFlag","AuthEnabledFlag","HTPasswdFileFlag","LDAPAddressFlag","LDAPDefaultDNFlag","AuthFlags","askYN","prompt","readlineSync","assertNever","n","createLogger","level","winston","message","indent","messageJson","indentedMessage","line","index","l","randomStr","len","randomBytes","resolveTilde","p","path","os","ensureDir","options","fs","getProcessName","pid","execSync","command","lines","getDockerComposeInfo","serviceName","result","report","st","blockPlatformsToChoose","allPlatforms","CreateBlockPlatforms","z","CreateBlockOptions","createBlock","logger","npmOrgName","orgName","blockName","softwarePlatforms","askForOptions","targetPath","downloadAndUnzip","platformsToRemove","noPlatforms","removePlatform","removePlatformsCompletely","replaceRegexInAllFiles","needSoftware","url","pathInArchive","outputPath","content","tmpDir","tmpFile","f","Writable","createWriteStream","tmpRepo","decompress","dir","platform","deleteRegexInFile","replaceInFile","json","patterns","files","getAllFiles","from","to","fPath","replaceRegexInFile","replacer","newContent","what","_CreateBlock","Command","flags","util.createLogger","block.createBlock","__publicField","cmdOpts.GlobalFlags","CreateBlock","resolve","assets","readFileSync","plImageTag","version","getDefaultPlVersion","_State","stateDir","stateFile","pkg.readFileSync","name","iName","instanceInfoFile","jsonInfo","instanceName","info","oldInfo","instance","i","util.getDockerComposeInfo","isValidPID","util.assertNever","State","processName","util.getProcessName","state","runCommands","cmds","buffers","children","cmd","opts","child","run","runSync","args","_a","spawn","exitAfterChild","sigintHandler","code","spawnSync","render","composeSource","composeDest","deployName","services","composeSrcData","compose","YAML","svcName","svcSpec","envSpecI","envName","last","envValue","mount","emptyS3Settings","id","emptyFSSettings","storageSettingsFromURL","storageURL","baseDir","defaults","bucketName","region","keyPrefix","loadDefaults","jwtKey","localRoot","log","_b","grpc","_c","defaultBool","_e","_d","_g","_f","_i","_h","_k","_j","_l","core","_n","_m","_p","_o","primary","defaultStorageSettings","_q","work","_s","_r","types.emptyFSSettings","_u","_t","_w","_v","library","_x","monitoring","_y","_z","debug","_A","_B","license","_C","_D","storageID","defaultLocation","defaultBucket","storage","types.emptyS3Settings","disableMon","disableDbg","libraryDownloadable","miLicenseSecret","v","def","OSes","archiveOS","osName","Arches","archiveArch","archName","arch","downloadArchive","showProgress","archiveName","downloadURL","archiveFilePath","request","https","reject","response","err","totalBytes","downloadedBytes","archive","chunk","progress","extractArchive","binaryDirName","archivePath","targetDir","trimExtension","msg","tar","getBinary","binaryPath","filename","lastDotIndex","Core","runInfo","run.runCommands","checkRunError","iToStop","plBinaryPath","platforma.binaryPath","configPath","workdir","plCfg.storageSettingsFromURL","configOptions","plCfg.loadDefaults","storageDirs","drv","pkg.assets","plCfg.render","upCommands","minioPort","minioRunCmd","composeSrc","composeMinio","composeCfg.render","image","util.ensureDir","minioConsolePort","envs","composeS3Path","pkg.plImageTag","storagePath","s","storageDir","logFilePath","presignHost","dbFSPath","workFSPath","usersFSPath","composeDstPath","backendMounts","mnt","composeFSPath","primaryFSPath","libraryFSPath","removeWarns","instancesToDrop","warnMessage","util.askYN","authDrivers","jwtFile","encoding","lastJwt","util.randomStr","value","file","sType","column","t","buffer","_Reset","Reset","_Start","Start","_Stop","Stop","authEnabled","authOptions","mounts","platformOverride","cmdOpts.AddressesFlags","cmdOpts.ImageFlag","cmdOpts.VersionFlag","cmdOpts.ArchFlag","cmdOpts.AuthFlags","cmdOpts.LicenseFlags","cmdOpts.MountFlag","cmdOpts.StorageFlag","cmdOpts.StoragePrimaryURLFlag","cmdOpts.StorageWorkPathFlag","cmdOpts.StorageLibraryURLFlag","logFile","listenGrpc","listenMon","listenDbg","startOptions","platforma.getBinary","cmdOpts.PlBinaryFlag","cmdOpts.PlSourcesFlag","cmdOpts.ConfigFlag","cmdOpts.PlLogFileFlag","cmdOpts.PlWorkdirFlag","_Delete","Args","Delete","_Down","Down","_List","instances","currentInstance","statusReport","List","_Up","results","Up","cmdOpts.MinioPresignHostFlag","cmdOpts.S3AddressesFlags","_Docker","Docker","createOptions","_S3","S3","_Local","Local","COMMANDS","Cmd0","Cmd1","Cmd2","Cmd3","Cmd4","Cmd5","Cmd6","Cmd7","Cmd8","Cmd9","Cmd10","Cmd11","Cmd12","Cmd13","Cmd14","Cmd15"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/cmd-opts.ts","../src/util.ts","../src/block.ts","../src/commands/create-block.ts","../src/package.ts","../src/state.ts","../src/run.ts","../src/templates/compose.ts","../src/templates/types.ts","../src/templates/pl-config.ts","../src/platforma.ts","../src/core.ts","../src/commands/reset.ts","../src/commands/start.ts","../src/commands/stop.ts","../src/commands/start/docker.ts","../src/commands/start/local.ts","../src/commands/svc/delete.ts","../src/commands/svc/down.ts","../src/commands/svc/list.ts","../src/commands/svc/up.ts","../src/commands/start/docker/s3.ts","../src/commands/start/local/s3.ts","../src/commands/svc/create/docker.ts","../src/commands/svc/create/local.ts","../src/commands/svc/create/docker/s3.ts","../src/commands/svc/create/local/s3.ts","../src/index.ts"],"sourcesContent":["import { Flags } from '@oclif/core';\n\nexport const GlobalFlags = {\n 'log-level': Flags.string({\n description: 'logging level',\n default: 'info',\n options: ['error', 'warn', 'info', 'debug'],\n required: false,\n }),\n};\n\nexport const InstanceName = {\n name: Flags.string({\n description: 'name of instance',\n required: false,\n }),\n};\n\nexport const ImageFlag = {\n image: Flags.string({\n description: 'use custom docker image to run platforma',\n }),\n};\n\nexport const VersionFlag = {\n version: Flags.string({\n description: 'use custom platforma release (official docker image or binary package)',\n }),\n};\n\nexport const ArchFlag = {\n arch: Flags.string({\n description: 'override architecture. You can start amd64 linux image on arm-based host (say, Apple M family processor). I.e. arm64, amd64, amd64/v2',\n }),\n};\n\nexport const LicenseFlags = {\n 'license': Flags.string({\n description: 'pass a license code. The license can be got from \"https://licensing.milaboratories.com\".',\n }),\n 'license-file': Flags.file({\n exists: true,\n description:\n 'specify a path to the file with a license. The license can be got from \\'https://licensing.milaboratories.com\\'.',\n }),\n};\n\nexport const AddressesFlags = {\n 'grpc-port': Flags.integer({\n description: 'port for Platforma Backend gRPC API. Default is 6345',\n env: 'PLATFORMA_GRPC_PORT',\n }),\n\n 'grpc-listen': Flags.string({\n description: 'full listen addr for Platforma Backend gRPC API. Default is 127.0.0.1:6345',\n env: 'PLATFORMA_GRPC_LISTEN',\n }),\n\n 'monitoring-port': Flags.integer({\n description: 'port for Platforma Backend monitoring API. Default is 9090',\n env: 'PLATFORMA_MONITORING_PORT',\n }),\n\n 'monitoring-listen': Flags.string({\n description: 'full listen addr for Platforma Backend monitoring API. Default is 127.0.0.1:9090',\n env: 'PLATFORMA_MONITORING_LISTEN',\n }),\n\n 'debug-port': Flags.integer({\n description: 'port for Platforma Backend debug API. Default is 9091',\n env: 'PLATFORMA_DEBUG_PORT',\n }),\n\n 'debug-listen': Flags.string({\n description: 'full listen addr for Platforma Backend debug API. Default is 127.0.0.1:9091',\n env: 'PLATFORMA_DEBUG_LISTEN',\n }),\n};\n\nexport const S3AddressesFlags = {\n 's3-port': Flags.integer({\n description: 'port that S3 will listen, default is 9000',\n default: 9000,\n env: 'PLATFORMA_S3_PORT',\n }),\n\n 's3-console-port': Flags.integer({\n description: 'port that a console of S3 will listen, default is 9001',\n default: 9001,\n env: 'PLATFORMA_S3_CONSOLE_PORT',\n }),\n};\n\nexport const StorageFlag = {\n storage: Flags.string({\n description: 'specify path on host to be used as storage for all Platforma Backend data',\n }),\n};\n\nexport const MinioPresignHostFlag = {\n ['minio-presign-host']: Flags.boolean({\n description: 'use \\'minio\\' host instead of \\'localhost\\' in presign URLs',\n }),\n};\n\nexport const MountFlag = {\n mount: Flags.string({\n multiple: true,\n description: 'things to be mounted into platforma docker container. Targets will appear inside the container under the same absolute paths',\n }),\n};\n\nexport const PlLogFileFlag = {\n ['pl-log-file']: Flags.file({\n description: 'specify path for Platforma Backend log file',\n }),\n};\n\nexport const PlWorkdirFlag = {\n ['pl-workdir']: Flags.file({\n description: 'specify working directory for Platforma Backend process',\n }),\n};\n\nexport const PlBinaryFlag = {\n ['pl-binary']: Flags.file({\n description: 'start given Platforma Backend binary instead of automatically downloaded version',\n }),\n};\n\nexport const PlSourcesFlag = {\n ['pl-sources']: Flags.file({\n description: 'path to pl repository root: build Platforma Backend from sources and start the resulting binary',\n }),\n};\n\nexport const ConfigFlag = {\n config: Flags.string({\n description: 'use custom Platforma Backend config',\n }),\n};\n\nexport const StoragePrimaryPathFlag = {\n 'storage-primary': Flags.file({\n description: 'specify path on host to be used as \\'primary\\' storage',\n }),\n};\n\nexport const StorageWorkPathFlag = {\n 'storage-work': Flags.file({\n description: 'specify path on host to be used as \\'work\\' storage',\n }),\n};\n\nexport const StorageLibraryPathFlag = {\n 'storage-primary': Flags.file({\n description: 'specify path on host to be used as \\'library\\' storage',\n }),\n};\n\nexport const StoragePrimaryURLFlag = {\n 'storage-primary': Flags.string({\n description:\n 'specify \\'primary\\' storage destination URL.\\n'\n + '\\tfile:/path/to/dir for directory on local FS\\n'\n + '\\ts3://<bucket>/?region=<name> for real AWS bucket\\n'\n + '\\ts3e://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via http\\n'\n + '\\ts3es://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via https',\n }),\n};\n\nexport const StorageLibraryURLFlag = {\n 'storage-library': Flags.string({\n description:\n 'specify \\'library\\' storage destination URL.\\n'\n + '\\tfile:/path/to/dir for directory on local FS\\n'\n + '\\ts3://<bucket>/?region=<name> for real AWS bucket\\n'\n + '\\ts3e://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via http\\n'\n + '\\ts3es://<endpoint>/<bucket>/?region=<name> for bucket behind custom endpoint via https',\n }),\n};\n\nexport const AuthEnabledFlag = {\n 'auth-enabled': Flags.boolean({\n description: 'enable authorization',\n }),\n};\n\nexport const HTPasswdFileFlag = {\n 'auth-htpasswd-file': Flags.file({\n description: 'path to .htpasswd file with Platforma users (static user DB auth source)',\n }),\n};\n\nexport const LDAPAddressFlag = {\n 'auth-ldap-server': Flags.string({\n description: 'address of LDAP server to use for auth in Platforma (auth source)',\n }),\n};\n\nexport const LDAPDefaultDNFlag = {\n 'auth-ldap-default-dn': Flags.string({\n description: 'DN to use when checking user with LDAP bind operation: e.g. cn=%u,ou=users,dc=example,dc=com',\n }),\n};\n\nexport const AuthFlags = {\n ...AuthEnabledFlag,\n ...HTPasswdFileFlag,\n\n ...LDAPAddressFlag,\n ...LDAPDefaultDNFlag,\n};\n","import os from 'node:os';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\n\nimport winston from 'winston';\nimport { randomBytes } from 'node:crypto';\nimport readlineSync from 'readline-sync';\n\nexport function askYN(prompt: string): boolean {\n const answer = readlineSync.question(`${prompt} [y/N] `);\n return answer.toLowerCase() === 'y';\n}\n\nexport function assertNever(n: never) {\n throw new Error('this should never happen');\n}\n\nexport function createLogger(level: string = 'debug'): winston.Logger {\n return winston.createLogger({\n level: level,\n\n format: winston.format.printf(({ level, message }) => {\n const indent = ' '.repeat(level.length + 2); // For ': ' after the level\n if (typeof message !== 'string') {\n const messageJson = JSON.stringify(message);\n throw Error(`logger message ${messageJson} is not a string`);\n }\n const indentedMessage = message\n .split('\\n')\n .map((line: string, index: number) => (index === 0 ? line : indent + line))\n .join('\\n');\n\n const colorize = (l: string) => winston.format.colorize().colorize(l, l);\n\n return `${colorize(level)}: ${indentedMessage}`;\n }),\n\n transports: [\n new winston.transports.Console({\n stderrLevels: ['error', 'warn', 'info', 'debug'],\n handleExceptions: true,\n }),\n ],\n });\n}\n\nexport function randomStr(len: number): string {\n return randomBytes(Math.ceil(len / 2))\n .toString('hex')\n .slice(0, len);\n}\n\nexport function resolveTilde(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\nexport function ensureDir(p: string, options?: {\n mode?: fs.Mode;\n}) {\n if (fs.existsSync(p)) {\n return;\n }\n\n fs.mkdirSync(p, { recursive: true });\n if (options?.mode) {\n fs.chmodSync(p, options.mode);\n }\n}\n\nexport function getProcessName(pid: number): string {\n try {\n if (os.platform() !== 'win32') {\n return execSync(`ps -p ${pid} -o comm=`, { encoding: 'utf8' }).trim();\n }\n\n const command = `wmic process where processid=${pid} get Caption`;\n const lines = execSync(command, { encoding: 'utf8' }).split('\\n');\n\n // lines = [\"Caption:\", \"<process name>\"]\n if (lines.length <= 1) {\n return '';\n }\n\n return lines[1].trim();\n } catch (e) {\n return '';\n }\n}\n\nexport type dockerComposeStatus = {\n Name: string;\n Status: string;\n ConfigFiles: string;\n};\n\nexport function getDockerComposeInfo(serviceName: string): dockerComposeStatus | undefined {\n const result = execSync(`docker compose ls --filter name=${serviceName} --format json`, { encoding: 'utf8' }).trim();\n\n const report = JSON.parse(result) as dockerComposeStatus[];\n\n for (const st of report) {\n if (st.Name === serviceName) {\n return st;\n }\n }\n\n return undefined;\n}\n","import { createWriteStream } from 'node:fs';\nimport * as fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type winston from 'winston';\nimport { Writable, Transform } from 'node:stream';\nimport os from 'node:os';\nimport readlineSync from 'readline-sync';\nimport { z } from 'zod';\nimport decompress from 'decompress';\nimport yaml from 'yaml';\n\nconst blockPlatformsToChoose = ['Python'];\nconst allPlatforms = ['Tengo', 'Python'] as const;\nconst CreateBlockPlatforms = z.union([z.literal('Tengo'), z.literal('Python')]);\nexport type CreateBlockPlatform = z.infer<typeof CreateBlockPlatforms>;\n\nconst CreateBlockOptions = z.object({\n npmOrgName: z.string().min(1),\n orgName: z.string().min(1, { message: `Organization name must be provided` }),\n blockName: z.string().min(1, { message: `Block name must be provided` }),\n softwarePlatforms: z.array(CreateBlockPlatforms).refine((p) => new Set(p).size === p.length, {\n message: 'Must be an array of unique software platforms',\n }),\n});\nexport type CreateBlockOptions = z.infer<typeof CreateBlockOptions>;\n\n/** Creates a block by cloning block-boilerplate repository. */\nexport async function createBlock(logger: winston.Logger) {\n const { npmOrgName, orgName, blockName, softwarePlatforms } = askForOptions();\n const targetPath = path.join(process.cwd(), blockName);\n\n logger.info(`Downloading boilerplate code...`);\n await downloadAndUnzip(\n // 'https://github.com/milaboratory/platforma-block-boilerplate/archive/refs/heads/software_platforms.zip',\n // 'platforma-block-boilerplate-software_platforms',\n 'https://github.com/milaboratory/platforma-block-boilerplate/archive/refs/heads/main.zip',\n 'platforma-block-boilerplate-main',\n targetPath,\n );\n\n const platformsToRemove = allPlatforms.filter((p) => softwarePlatforms.indexOf(p) < 0);\n const noPlatforms = blockPlatformsToChoose.length == platformsToRemove.length;\n logger.info(`Keep platforms '${softwarePlatforms}', remove: '${platformsToRemove}'. Will remove all platforms? ${noPlatforms}`);\n for (const p of platformsToRemove) {\n await removePlatform(targetPath, p);\n }\n if (noPlatforms) {\n await removePlatformsCompletely(targetPath);\n }\n\n logger.info(`Replace everything in the template with provided options...`);\n replaceRegexInAllFiles(targetPath, [\n // '@' literal ensures only npm org name will be renamed,\n // as public registry for software also is called platforma-open, but without '@'.\n // Also, don't rename an organization for runenv-python-3 package.\n { from: /@platforma-open(?!.*runenv-python-3)/g, to: `@${npmOrgName}` },\n\n { from: /my-org/g, to: orgName },\n\n { from: /block-boilerplate/g, to: blockName },\n ]);\n}\n\nfunction askForOptions(): CreateBlockOptions {\n let npmOrgName = readlineSync.question(\n 'Write an organization name for npm. Default is \"platforma-open\": ',\n );\n if (npmOrgName === '') {\n npmOrgName = 'platforma-open';\n }\n\n let orgName = '';\n while (orgName.length < 1)\n orgName = readlineSync.question('Write an organization name, e.g. \"my-org\": ');\n\n let blockName = '';\n while (blockName.length < 1)\n blockName = readlineSync.question('Write a name of the block, e.g. \"hello-world\": ');\n\n const needSoftware = readlineSync.keyInYN('Create package for block\\'s software?');\n let softwarePlatforms = ['Tengo'];\n if (needSoftware) {\n while (softwarePlatforms.length < allPlatforms.length) {\n const index = readlineSync.keyInSelect(blockPlatformsToChoose, 'Choose software platform:');\n if (index < 0) break;\n softwarePlatforms.push(blockPlatformsToChoose[index]);\n }\n }\n softwarePlatforms = Array.from(new Set(softwarePlatforms)).sort();\n\n const result = CreateBlockOptions.safeParse({ npmOrgName, orgName, blockName, softwarePlatforms });\n if (!result.success && result.error.issues.length) {\n throw new Error(result.error.issues.map(i => i.message).join('; '));\n }\n\n return result.data!;\n}\n\nasync function downloadAndUnzip(url: string, pathInArchive: string, outputPath: string) {\n const response = await fetch(url);\n const content = await response.blob();\n\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'create-repo'));\n\n const tmpFile = path.join(tmpDir, 'packed-repo.zip');\n const f = Writable.toWeb(createWriteStream(tmpFile));\n await content.stream().pipeTo(f);\n\n const tmpRepo = path.join(tmpDir, 'unpacked-repo');\n await fs.mkdir(tmpRepo);\n await decompress(tmpFile, tmpRepo);\n\n await fs.cp(path.join(tmpRepo, pathInArchive), outputPath, { recursive: true });\n}\n\n/** Removes a bunch of dependencies to the platform. */\nasync function removePlatform(dir: string, platform: CreateBlockPlatform) {\n const p = platform.toLowerCase();\n\n // Remove <PlAlert> line from MainPage.vue\n // https://regex101.com/r/oCTyHk/1\n await deleteRegexInFile(\n path.join(dir, 'ui', 'src', 'pages', 'MainPage.vue'),\n new RegExp(`.*${p}Message.*\\\\n\\\\n`, 'g'),\n );\n\n // Remove an output from the model.\n await deleteRegexInFile(\n path.join(dir, 'model', 'src', 'index.ts'),\n new RegExp(`.*${p}Message.*\\\\n\\\\n`, 'g'),\n );\n\n // This regexp represents a block of code until the empty line.\n // https://regex101.com/r/Os8kX1/1\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'main.tpl.tengo'),\n new RegExp(`.*${p}.*exec.builder.*[\\\\s\\\\S]*?\\\\n\\\\n`, 'g'),\n );\n\n // Remove a line from the workflow output.\n // https://regex101.com/r/PkHwQ8/1\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'main.tpl.tengo'),\n new RegExp(`.*${p}Message.*\\\\n`, 'g'),\n );\n\n // Remove 2 lines: the one with the language message and the one with expect\n await deleteRegexInFile(\n path.join(dir, 'workflow', 'src', 'wf.test.ts'),\n new RegExp(`.*${p}Message.*\\\\n.*expect.*\\\\n\\\\n`, 'g'),\n );\n\n await fs.rm(path.join(dir, 'software', `src_${p}`), { recursive: true });\n\n await replaceInFile(\n path.join(dir, 'software', 'package.json'),\n (content) => {\n const json = JSON.parse(content);\n delete json['block-software']['artifacts'][`hello-${p}-artifact`];\n delete json['block-software']['entrypoints'][`hello-world-${p}`];\n return JSON.stringify(json, null, 2);\n },\n );\n}\n\n/** Removes software directory completely and all references to it from the workspace. */\nasync function removePlatformsCompletely(dir: string) {\n await fs.rm(path.join(dir, 'software'), { recursive: true });\n\n await replaceInFile(\n path.join(dir, 'workflow', 'package.json'),\n (content) => {\n const json = JSON.parse(content);\n delete json['dependencies']['@platforma-open/my-org.block-boilerplate.software'];\n return JSON.stringify(json, null, 2);\n },\n );\n\n await deleteRegexInFile(\n path.join(dir, 'pnpm-workspace.yaml'),\n /.*- software$\\n/gm,\n );\n}\n\nasync function replaceRegexInAllFiles(\n dir: string,\n patterns: { from: RegExp; to: string }[],\n) {\n const files = await getAllFiles(dir);\n for (const { from, to } of patterns) {\n for (const fPath of files) {\n await replaceRegexInFile(fPath, from, to);\n }\n }\n}\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const allDirents = await fs.readdir(dir, {\n withFileTypes: true,\n recursive: true,\n });\n\n return allDirents.filter((f: any) => f.isFile()).map((f: any) => path.join(f.parentPath, f.name));\n}\n\nasync function replaceInFile(fPath: string, replacer: (content: string) => any) {\n const content = await fs.readFile(fPath);\n const newContent = replacer(content.toString());\n await fs.writeFile(fPath, newContent);\n}\n\nasync function replaceRegexInFile(fPath: string, from: RegExp, to: string) {\n return await replaceInFile(fPath, (content) => content.replaceAll(from, to));\n}\n\nasync function deleteRegexInFile(fPath: string, what: RegExp) {\n return await replaceRegexInFile(fPath, what, '');\n}\n","import { Command, Flags } from '@oclif/core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\nimport * as block from '../block';\n\nexport default class CreateBlock extends Command {\n static override description = \"Helps to create a new block by downloading a block's template.\";\n\n static override examples = ['<%= name %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(CreateBlock);\n const logger = util.createLogger(flags['log-level']);\n\n await block.createBlock(logger);\n }\n}\n","import { resolve, join } from 'path';\nimport fs from 'fs';\nimport { getDefaultPlVersion } from '@milaboratories/pl-deployments';\n\nexport function path(...p: string[]): string {\n return resolve(__dirname, '..', ...p);\n}\n\nexport function dist(...p: string[]): string {\n return path('dist', ...p);\n}\n\nexport function assets(...p: string[]): string {\n return path('assets', ...p);\n}\n\nexport function composeFiles(): string[] {\n const dockerDirEntries = fs.readdirSync(assets());\n return dockerDirEntries\n .filter((entry) => {\n return entry.startsWith('compose-') && entry.endsWith('.yaml');\n })\n .map((value) => assets(value));\n}\n\nexport function readFileSync(...p: string[]): Buffer {\n return fs.readFileSync(path(...p));\n}\n\nexport function plImageTag(version?: string): string {\n if (!version) {\n version = getDefaultPlVersion();\n }\n\n return `quay.io/milaboratories/platforma:${version}`;\n}\n","import os from 'node:os';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as pkg from './package';\nimport * as util from './util';\nimport type { SpawnOptions } from 'node:child_process';\nimport type * as types from './templates/types';\n\nexport type runInfo = {\n configPath?: string;\n apiPort?: number;\n apiAddr?: string;\n logPath?: string;\n dbPath?: string;\n primary?: types.storageOptions;\n work?: types.fsStorageOptions;\n library?: types.storageOptions;\n};\n\nexport type instanceCommand = {\n async?: boolean;\n cmd: string;\n args: readonly string[];\n envs?: NodeJS.ProcessEnv;\n workdir?: string;\n runOpts: SpawnOptions;\n};\n\nexport type commmonInstanceInfo = {\n name: string;\n upCommands: instanceCommand[];\n downCommands: instanceCommand[];\n cleanupCommands: instanceCommand[];\n runInfo?: runInfo;\n};\n\nexport type dockerInstanceInfo = commmonInstanceInfo & {\n type: 'docker';\n};\nexport type processInstanceInfo = commmonInstanceInfo & {\n type: 'process';\n pid?: number;\n};\n\nexport type instanceInfo = dockerInstanceInfo | processInstanceInfo;\nexport type jsonInstanceInfo = Omit<dockerInstanceInfo, 'name' | 'isActive'> | Omit<processInstanceInfo, 'name' | 'isActive'>;\n\nexport function reset() {\n fs.rmSync(State.getStateInstance().filePath);\n}\n\ntype state = {\n currentInstance: string;\n};\n\nclass State {\n private static instance: State;\n\n private state: state = {\n currentInstance: '',\n };\n\n public readonly filePath: string;\n private readonly dirPath: string;\n\n constructor(stateDir?: string) {\n stateDir = stateDir ?? path.resolve(os.homedir(), '.config', 'pl-bootstrap');\n\n const stateFile = path.join(stateDir, 'state.json');\n\n this.dirPath = stateDir;\n this.filePath = stateFile;\n\n if (!fs.existsSync(stateDir)) {\n fs.mkdirSync(stateDir, { recursive: true });\n }\n\n if (fs.existsSync(stateFile)) {\n this.state = JSON.parse(pkg.readFileSync(stateFile).toString()) as state;\n }\n }\n\n public static getStateInstance(): State {\n if (!State.instance) {\n State.instance = new State();\n }\n\n return State.instance;\n }\n\n public path(...p: string[]): string {\n return path.join(this.dirPath, ...p);\n }\n\n public instanceDir(name?: string, ...p: string[]): string {\n if (name) {\n return this.path('data', name, ...p);\n }\n\n return this.path('data');\n }\n\n public binaries(...p: string[]): string {\n return this.path('binaries', ...p);\n }\n\n private writeState() {\n fs.writeFileSync(this.filePath, JSON.stringify(this.state));\n }\n\n get instanceList(): string[] {\n if (!fs.existsSync(this.instanceDir())) {\n return [];\n }\n\n const list = fs.readdirSync(this.instanceDir());\n\n return list.filter((iName) => this.instanceExists(iName));\n }\n\n instanceExists(name: string): boolean {\n return fs.existsSync(this.instanceDir(name, 'instance.json'));\n }\n\n public getInstanceInfo(name: string): instanceInfo {\n const instanceInfoFile = this.instanceDir(name, 'instance.json');\n if (!fs.existsSync(instanceInfoFile)) {\n throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);\n }\n\n const jsonInfo = JSON.parse(pkg.readFileSync(instanceInfoFile).toString()) as jsonInstanceInfo;\n return {\n name: name,\n ...jsonInfo,\n };\n }\n\n public setInstanceInfo(instanceName: string, info: jsonInstanceInfo) {\n if (!fs.existsSync(this.instanceDir(instanceName))) {\n fs.mkdirSync(this.instanceDir(instanceName), { recursive: true });\n }\n\n const instanceInfoFile = this.instanceDir(instanceName, 'instance.json');\n let oldInfo: object = {};\n\n if (fs.existsSync(instanceInfoFile)) {\n oldInfo = JSON.parse(pkg.readFileSync(instanceInfoFile).toString()) as object;\n }\n\n fs.writeFileSync(instanceInfoFile, JSON.stringify({ ...oldInfo, ...info }));\n }\n\n public isInstanceActive(instance: instanceInfo): boolean {\n const iType = instance.type;\n switch (iType) {\n case 'docker': {\n const i = util.getDockerComposeInfo(`pl-${instance.name}`);\n if (!i) {\n return false;\n }\n return i.Status.trim().startsWith('running');\n }\n\n case 'process': {\n if (!instance.pid) {\n return false;\n }\n return isValidPID(instance.pid);\n }\n\n default:\n util.assertNever(iType);\n throw new Error('cli logic error: unknown service type, cannot check its state');\n }\n }\n\n get isActive(): boolean {\n for (const iName of this.instanceList) {\n const instance = this.getInstanceInfo(iName);\n if (this.isInstanceActive(instance)) {\n return true;\n }\n }\n\n return false;\n }\n\n public isValidPID(pid: number): boolean {\n return isValidPID(pid);\n }\n\n get currentInstance(): instanceInfo | undefined {\n const name = this.state.currentInstance;\n if (name && this.instanceExists(name)) {\n return this.getInstanceInfo(name);\n }\n\n return undefined;\n }\n\n get currentInstanceName(): string {\n return this.state.currentInstance;\n }\n\n set currentInstanceName(name: string) {\n this.state.currentInstance = name;\n this.writeState();\n }\n\n selectInstance(name: string) {\n if (!this.instanceExists(name)) {\n throw new Error(`instance '${name}' does not exist`);\n }\n this.state.currentInstance = name;\n this.writeState();\n }\n}\n\nfunction isValidPID(pid: number): boolean {\n const processName = util.getProcessName(pid);\n return processName === 'platforma' || processName.endsWith('/platforma') || processName.endsWith('\\\\platforma');\n}\n\nexport default State.getStateInstance();\n","import type { SpawnOptions, SpawnSyncReturns, ChildProcess } from 'node:child_process';\nimport { spawnSync, spawn } from 'node:child_process';\nimport type { instanceCommand } from './state';\nimport state from './state';\nimport type winston from 'winston';\n\ntype runResult = {\n executed: SpawnSyncReturns<Buffer>[];\n spawned: ChildProcess[];\n};\n\nexport function runCommands(logger: winston.Logger, cmds: instanceCommand[], options?: SpawnOptions): runResult {\n const buffers: SpawnSyncReturns<Buffer>[] = [];\n const children: ChildProcess[] = [];\n for (const cmd of cmds) {\n const opts = {\n cwd: cmd.workdir,\n env: {\n ...cmd.envs,\n ...options?.env,\n },\n ...cmd.runOpts,\n ...options,\n };\n\n if (cmd.async) {\n const child = run(logger, cmd.cmd, cmd.args, opts);\n children.push(child);\n } else {\n const result = runSync(logger, cmd.cmd, cmd.args, opts);\n buffers.push(result);\n if (result.error || result.status !== 0) {\n break;\n }\n }\n };\n\n return {\n executed: buffers,\n spawned: children,\n };\n}\n\nexport function rerunLast(logger: winston.Logger, options: SpawnOptions): runResult {\n const instance = state.currentInstance;\n\n if (!instance) {\n throw new Error('no previous run info found: this is the first run after package installation');\n }\n\n return runCommands(logger, instance.upCommands, options);\n}\n\nexport function run(logger: winston.Logger, cmd: string, args: readonly string[], options: SpawnOptions): ChildProcess {\n logger.debug(\n `Running:\\n cmd: ${JSON.stringify([cmd, ...args])}\\n wd: ${options.cwd?.toString()}`,\n );\n\n options.env = { ...process.env, ...options.env };\n logger.debug(' spawning child process');\n const child = spawn(cmd, args, options);\n let exitAfterChild: boolean = false;\n\n //\n // Ensure Ctrl+C causes right finalization order: first stop child process, then stop the parent.\n //\n const sigintHandler = () => {\n child.kill('SIGINT');\n exitAfterChild = true;\n };\n\n logger.debug(' setting up signal handler');\n process.on('SIGINT', sigintHandler);\n\n child.on('close', (code) => {\n process.removeListener('SIGINT', sigintHandler);\n if (exitAfterChild) {\n process.exit(code);\n }\n });\n\n return child;\n}\n\nexport function runSync(\n logger: winston.Logger,\n cmd: string,\n args: readonly string[],\n options: SpawnOptions,\n): SpawnSyncReturns<Buffer> {\n logger.debug(\n `Running:\\n cmd: ${JSON.stringify([cmd, ...args])}\\n opts: ${JSON.stringify(options)}`,\n );\n\n options.env = { ...process.env, ...options.env };\n return spawnSync(cmd, args, options);\n}\n","import fs from 'node:fs';\nimport YAML from 'yaml';\n\nexport type VolumeMountOption = {\n hostPath: string;\n containerPath: string;\n};\n\nexport type ServiceOptions = {\n platform?: string;\n envs?: NodeJS.ProcessEnv;\n mounts?: VolumeMountOption[];\n};\n\ntype ComposeYamlSpec = {\n name: string;\n services: Record<string, {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n }>;\n\n volumes?: unknown;\n};\n\nexport function render(\n composeSource: string,\n composeDest: string,\n deployName: string,\n services?: Map<string, ServiceOptions>,\n options?: {\n dropVolumes: boolean;\n },\n) {\n const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });\n const compose = YAML.parse(composeSrcData.toString()) as ComposeYamlSpec;\n\n if (!compose.services) {\n throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);\n }\n\n if (services) {\n for (const svcName of Object.keys(compose.services)) {\n if (!services.has(svcName)) {\n delete compose.services[svcName];\n }\n }\n }\n\n compose.name = deployName;\n\n for (const [svcName, options] of services?.entries() ?? []) {\n const svcSpec = compose.services[svcName];\n\n if (!svcSpec) {\n throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);\n }\n\n if (options.platform) {\n svcSpec.platform = options.platform;\n }\n\n if (options.envs) {\n if (!svcSpec.environment) {\n svcSpec.environment = [];\n }\n for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {\n const envSpec: string = svcSpec.environment[envSpecI];\n const envName = envSpec.split('=')[0];\n if (options.envs[envName]) {\n // Drop env expression from list as we will replace it later by our custom configuration\n const last = svcSpec.environment.pop();\n\n // Do not insert back last element we just removed.\n if (last && svcSpec.environment.length !== envSpecI) {\n svcSpec.environment[envSpecI] = last;\n }\n } else {\n envSpecI++;\n }\n }\n\n for (const [envName, envValue] of Object.entries(options.envs)) {\n svcSpec.environment.push(`${envName}=${envValue}`);\n }\n }\n\n if (options.mounts) {\n if (!svcSpec.volumes) {\n svcSpec.volumes = [];\n }\n for (const mount of options.mounts) {\n svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);\n }\n }\n }\n\n if (options?.dropVolumes) {\n delete compose.volumes;\n }\n\n fs.writeFileSync(composeDest, YAML.stringify(compose));\n}\n","export type plSettings = {\n localRoot: string;\n\n license: licenseSettings;\n log: logSettings;\n grpc: grpcSettings;\n core: coreSettings;\n storages: storagesSettings;\n\n monitoring: monitoringSettings;\n debug: debugSettings;\n\n hacks: {\n libraryDownloadable: boolean;\n };\n};\nexport type plOptions = {\n localRoot?: string;\n\n license?: licenseOptions;\n log?: logOptions;\n grpc?: grpcOptions;\n core?: coreOptions;\n storages?: storagesOptions;\n\n monitoring?: monitoringOptions;\n debug?: debugOptions;\n};\n\nexport type licenseSettings = {\n value: string;\n file: string;\n};\nexport type licenseOptions = DeepPartial<licenseSettings>;\n\nexport type logSettings = {\n level: string;\n path: string;\n};\nexport type logOptions = DeepPartial<logSettings>;\n\nexport type coreSettings = {\n auth: authSettings;\n db: dbSettings;\n};\nexport type coreOptions = {\n auth?: authOptions;\n db?: dbOptions;\n};\n\nexport type authSettings = {\n enabled: boolean;\n drivers: authDriver[];\n};\nexport type authOptions = Partial<authSettings>;\n\nexport type dbSettings = {\n path: string;\n};\nexport type dbOptions = Partial<dbSettings>;\n\nexport type authDriver =\n | {\n driver: 'ldap';\n serverUrl: string; // 'ldaps://ldap.example.com:1111'\n defaultDN: string; // 'cn=%u,ou=users,ou=users,dc=example,dc=com'\n }\n | {\n driver: 'jwt';\n key: string;\n }\n | {\n driver: 'htpasswd';\n path: string;\n };\n\nexport type grpcSettings = {\n listen: string;\n tls: tlsSettings;\n};\nexport type grpcOptions = Partial<grpcSettings>;\n\nexport type tlsSettings = {\n enable: boolean;\n clientAuthMode: tlsAuthMode;\n certFile: string;\n keyFile: string;\n};\nexport type tlsOptions = Partial<tlsSettings>;\n\nexport type tlsAuthMode = 'NoAuth' | 'RequestAnyCert' | 'RequireAnyCert' | 'RequestValidCert' | 'RequireValidCert';\n\nexport type storagesSettings = {\n primary: storageSettings;\n work: fsStorageSettings;\n library: storageSettings;\n};\nexport type storagesOptions = {\n primary?: storageOptions;\n work?: storageOptions;\n library?: storageOptions;\n};\n\nexport type storageSettings = s3StorageSettings | fsStorageSettings;\nexport type storageOptions = s3StorageOptions | fsStorageOptions;\n\ntype storageID = { id: string };\ntype commonStorageSettings = {\n indexCachePeriod: string;\n};\n\nexport type s3StorageSettings = storageID & s3StorageType & commonStorageSettings & s3StorageTypeSettings;\nexport type s3StorageOptions = s3StorageType & Partial<commonStorageSettings> & Partial<s3StorageTypeSettings>;\nexport function emptyS3Settings(id: string): s3StorageSettings {\n return {\n id: id,\n type: 'S3',\n indexCachePeriod: '0s',\n endpoint: '',\n region: '',\n bucketName: '',\n createBucket: false,\n forcePathStyle: false,\n key: '',\n secret: '',\n keyPrefix: '',\n accessPrefixes: [],\n uploadKeyPrefix: '',\n };\n}\n\ntype s3StorageType = { type: 'S3' };\ntype s3StorageTypeSettings = {\n endpoint?: string;\n presignEndpoint?: string;\n region?: string;\n bucketName: string;\n createBucket: boolean;\n forcePathStyle: boolean;\n key: string;\n secret: string;\n keyPrefix: string;\n accessPrefixes: string[];\n uploadKeyPrefix: string;\n};\n\nexport type fsStorageSettings = storageID & fsStorageType & commonStorageSettings & fsStorageTypeSettings;\nexport type fsStorageOptions = fsStorageType & Partial<commonStorageSettings> & Partial<fsStorageTypeSettings>;\nexport function emptyFSSettings(id: string): fsStorageSettings {\n return {\n id: id,\n type: 'FS',\n indexCachePeriod: '0s',\n rootPath: '',\n };\n}\n\ntype fsStorageType = { type: 'FS' };\ntype fsStorageTypeSettings = {\n rootPath: string;\n};\n\nexport type monitoringSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type monitoringOptions = Partial<monitoringSettings>;\n\nexport type debugSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type debugOptions = Partial<debugSettings>;\n\n/** Makes all keys and keys in sub-objects optional. */\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n","import fs from 'node:fs';\nimport * as types from './types';\nimport { assertNever, resolveTilde } from '../util';\nimport state from '../state';\n\nexport type { plOptions } from './types';\n\nexport function storageSettingsFromURL(\n storageURL: string,\n baseDir?: string,\n defaults?: types.storageOptions,\n): types.storageOptions {\n storageURL = resolveTilde(storageURL);\n const url = new URL(storageURL, `file:${baseDir}`);\n\n switch (url.protocol) {\n case 's3:': {\n const bucketName = url.hostname;\n const region = url.searchParams.get('region');\n const keyPrefix = url.pathname.slice(1); // 's3://bucket/' will have '/' as pathname. We don't want to always have '/' prefix\n\n return {\n ...defaults,\n\n type: 'S3',\n bucketName,\n region,\n keyPrefix,\n } as types.storageOptions;\n }\n case 's3e:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `http://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 's3es:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `https://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 'file:':\n return {\n type: 'FS',\n rootPath: url.pathname,\n };\n\n default:\n throw new Error(`storage protocol '${url.protocol}' is not supported`);\n }\n}\n\nexport function loadDefaults(jwtKey: string, options?: types.plOptions): types.plSettings {\n const localRoot = options?.localRoot ?? state.instanceDir('default');\n\n const log: types.logSettings = {\n level: options?.log?.level ?? 'info',\n path: options?.log?.path ?? `${localRoot}/logs/platforma.log`,\n };\n\n const grpc: types.grpcSettings = {\n listen: options?.grpc?.listen ?? 'localhost:6345',\n tls: {\n enable: defaultBool(options?.grpc?.tls?.enable, false),\n clientAuthMode: options?.grpc?.tls?.clientAuthMode ?? 'NoAuth',\n certFile: options?.grpc?.tls?.certFile ?? `${localRoot}/certs/tls.cert`,\n keyFile: options?.grpc?.tls?.keyFile ?? `${localRoot}/certs/tls.key`,\n\n ...options?.grpc?.tls,\n },\n };\n\n const core: types.coreSettings = {\n auth: {\n enabled: options?.core?.auth?.enabled ?? false,\n drivers: options?.core?.auth?.drivers ?? [\n { driver: 'jwt', key: jwtKey },\n { driver: 'htpasswd', path: `${localRoot}/users.htpasswd` },\n ],\n },\n db: {\n path: `${localRoot}/db`,\n },\n };\n\n const primary = defaultStorageSettings(\n 'main',\n `${localRoot}/storages/main`,\n 'main-bucket',\n options?.storages?.primary,\n );\n\n let work: types.storageSettings;\n const wType = options?.storages?.work?.type;\n switch (wType) {\n case undefined:\n case 'FS':\n work = types.emptyFSSettings('work');\n work.rootPath = options?.storages?.work?.rootPath ?? `${localRoot}/storages/work`;\n work.indexCachePeriod = options?.storages?.work?.indexCachePeriod ?? '1m';\n break;\n\n default:\n throw new Error('work storage MUST have \\'FS\\' type as it is used for working directories management');\n }\n\n const library = defaultStorageSettings(\n 'library',\n `${localRoot}/storages/library`,\n 'library-bucket',\n options?.storages?.library,\n );\n\n const monitoring: types.monitoringSettings = {\n enabled: defaultBool(options?.monitoring?.enabled, true),\n listen: options?.monitoring?.listen ?? '127.0.0.1:9090',\n };\n const debug: types.debugSettings = {\n enabled: defaultBool(options?.debug?.enabled, true),\n listen: options?.debug?.listen ?? '127.0.0.1:9091',\n };\n const license: types.licenseSettings = {\n value: options?.license?.value ?? '',\n file: options?.license?.file ?? '',\n };\n\n return {\n localRoot,\n license,\n log,\n grpc,\n core,\n monitoring,\n debug,\n storages: { primary, work, library },\n hacks: { libraryDownloadable: true },\n };\n}\n\nfunction defaultStorageSettings(\n storageID: string,\n defaultLocation: string,\n defaultBucket: string,\n options?: types.storageOptions,\n): types.storageSettings {\n let storage: types.storageSettings;\n const pType = options?.type;\n switch (pType) {\n case undefined:\n case 'FS':\n storage = types.emptyFSSettings(storageID);\n storage.rootPath = options?.rootPath ?? defaultLocation;\n break;\n\n case 'S3':\n storage = types.emptyS3Settings(storageID);\n\n storage.endpoint = options?.endpoint;\n storage.region = options?.region;\n storage.presignEndpoint = options?.presignEndpoint ?? options?.endpoint;\n storage.bucketName = options?.bucketName ?? defaultBucket;\n storage.createBucket = defaultBool(options?.createBucket, true);\n storage.forcePathStyle = defaultBool(options?.forcePathStyle, true);\n storage.key = options?.key ?? '';\n storage.secret = options?.secret ?? '';\n storage.keyPrefix = options?.keyPrefix ?? '';\n storage.accessPrefixes = options?.accessPrefixes ?? [''];\n storage.uploadKeyPrefix = options?.uploadKeyPrefix ?? '';\n break;\n\n default:\n assertNever(pType);\n throw new Error('unknown storage type'); // calm down TS type analyzer\n }\n\n return storage;\n}\n\nexport function render(options: types.plSettings): string {\n const disableMon = options.monitoring.enabled ? '' : ' disabled';\n const disableDbg = options.debug.enabled ? '' : ' disabled';\n const libraryDownloadable = options.hacks.libraryDownloadable ? 'true' : 'false';\n\n let miLicenseSecret = options.license.value;\n if (options.license.file != '') {\n miLicenseSecret = fs.readFileSync(options.license.file).toString().trimEnd();\n }\n\n return `\nlicense:\n value: '${options.license.value}'\n file: '${options.license.file}'\n\nlogging:\n level: '${options.log.level}'\n destinations:\n - path: '${options.log.path}'\n rotation:\n maxSize: 1GiB\n maxBackups: 15\n compress: true\n\nmonitoring${disableMon}:\n listen: '${options.monitoring.listen}'\n\ndebug${disableDbg}:\n listen: '${options.debug.listen}'\n\ncore:\n logging:\n extendedInfo: true\n dumpResourceData: false\n\n grpc:\n listen: '${options.grpc.listen}'\n\n tlsEnabled: ${JSON.stringify(options.grpc.tls.enable)}\n tls:\n clientAuthMode: '${options.grpc.tls.clientAuthMode}'\n certificates:\n - certFile: '${options.grpc.tls.certFile}'\n keyFile: '${options.grpc.tls.keyFile}'\n\n\n authEnabled: ${JSON.stringify(options.core.auth.enabled)}\n auth: ${JSON.stringify(options.core.auth.drivers)}\n db:\n path: '${options.core.db.path}'\n\ncontrollers:\n data:\n main:\n storages:\n main:\n mode: primary\n downloadable: true\n\n library:\n mode: passive\n downloadable: ${libraryDownloadable}\n\n work:\n mode: active\n downloadable: false\n\n storages:\n - ${JSON.stringify(options.storages.primary)}\n - ${JSON.stringify(options.storages.library)}\n - ${JSON.stringify(options.storages.work)}\n\n runner:\n type: local\n storageRoot: '${(options.storages.work).rootPath}'\n workdirCacheOnFailure: 1h\n secrets:\n - map:\n MI_LICENSE: ${JSON.stringify(miLicenseSecret)}\n\n packageLoader:\n packagesRoot: '${options.localRoot}/packages'\n\n workflows: {}\n`;\n}\n\nfunction defaultBool(v: boolean | undefined, def: boolean): boolean {\n return v === undefined ? def : v;\n}\n","import os from 'node:os';\nimport fs from 'node:fs';\nimport https from 'https';\nimport path from 'node:path';\n\nimport * as tar from 'tar';\nimport type winston from 'winston';\nimport state from './state';\nimport { getDefaultPlVersion } from '@milaboratories/pl-deployments';\n\nexport const OSes = ['linux', 'macos', 'windows'] as const;\nexport type OSType = (typeof OSes)[number];\n\nexport function archiveOS(osName?: string): OSType {\n const platform = osName ?? os.platform();\n\n switch (platform) {\n case 'darwin':\n return 'macos';\n case 'linux':\n return 'linux';\n case 'win32':\n return 'windows';\n default:\n throw new Error(\n `operating system '${platform}' is not currently supported by Platforma ecosystem. The list of OSes supported: `\n + JSON.stringify(OSes),\n );\n }\n}\n\nexport const Arches = ['amd64', 'arm64'] as const;\nexport type ArchType = (typeof Arches)[number];\n\nexport function archiveArch(archName?: string): ArchType {\n const arch = archName ?? os.arch();\n\n switch (arch) {\n case 'arm64':\n return 'arm64';\n case 'x64':\n return 'amd64';\n default:\n throw new Error(\n `processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: `\n + JSON.stringify(Arches),\n );\n }\n}\n\nexport function downloadArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n showProgress?: boolean;\n downloadURL?: string;\n saveTo?: string;\n },\n): Promise<string> {\n const version = options?.version ?? getDefaultPlVersion();\n const showProgress = options?.showProgress ?? process.stdout.isTTY;\n\n const archiveName = `pl-${version}-${archiveArch()}.tgz`;\n const downloadURL = options?.downloadURL ?? `https://cdn.platforma.bio/software/pl/${archiveOS()}/${archiveName}`;\n\n const archiveFilePath = options?.saveTo ?? state.binaries(archiveName);\n if (fs.existsSync(archiveFilePath)) {\n logger.info(`Platforma Backend archive download skipped: '${archiveFilePath}' already exists`);\n return Promise.resolve(archiveFilePath);\n }\n\n fs.mkdirSync(path.dirname(archiveFilePath), { recursive: true });\n\n logger.info(`Downloading Platforma Backend archive:\\n URL: ${downloadURL}\\n Save to: ${archiveFilePath}`);\n\n const request = https.get(downloadURL);\n\n return new Promise((resolve, reject) => {\n request.on('response', (response) => {\n if (!response.statusCode) {\n const err = new Error('failed to download archive: no HTTP status code in response from server');\n request.destroy();\n reject(err);\n return;\n }\n if (response.statusCode !== 200) {\n const err = new Error(`failed to download archive: ${response.statusCode} ${response.statusMessage}`);\n request.destroy();\n reject(err);\n return;\n }\n\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\n let downloadedBytes = 0;\n\n const archive = fs.createWriteStream(archiveFilePath);\n\n response.pipe(archive);\n response.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const progress = (downloadedBytes / totalBytes) * 100;\n if (showProgress) {\n process.stdout.write(` downloading: ${progress.toFixed(2)}%\\r`);\n }\n });\n\n response.on('error', (err: Error) => {\n fs.unlinkSync(archiveFilePath);\n logger.error(`Failed to download Platforma Binary: ${err.message}`);\n request.destroy();\n reject(err);\n });\n\n archive.on('finish', () => {\n archive.close();\n logger.info(` ... download done.`);\n request.destroy();\n resolve(archiveFilePath);\n });\n });\n });\n}\n\nexport function extractArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n archivePath?: string;\n extractTo?: string;\n },\n): string {\n logger.debug('extracting archive...');\n\n const version = options?.version ?? getDefaultPlVersion();\n logger.debug(` version: '${version}'`);\n const archiveName = `${binaryDirName({ version })}.tgz`;\n\n const archivePath = options?.archivePath ?? state.binaries(archiveName);\n logger.debug(` archive path: '${archivePath}'`);\n\n const targetDir = options?.extractTo ?? trimExtension(archivePath);\n logger.debug(` target dir: '${targetDir}'`);\n\n if (fs.existsSync(targetDir)) {\n logger.info(`Platforma Backend binaries unpack skipped: '${targetDir}' exists`);\n return targetDir;\n }\n\n if (!fs.existsSync(archivePath)) {\n const msg = `Platforma Backend binary archive not found at '${archivePath}'`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n if (!fs.existsSync(targetDir)) {\n logger.debug(` creating target dir '${targetDir}'`);\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n logger.info(`Unpacking Platforma Backend archive:\\n Archive: ${archivePath}\\n Target dir: ${targetDir}`);\n\n tar.x({\n file: archivePath,\n cwd: targetDir,\n gzip: true,\n sync: true,\n });\n\n logger.info(` ... unpack done.`);\n\n return targetDir;\n}\n\nexport function getBinary(\n logger: winston.Logger,\n options?: { version?: string; showProgress?: boolean },\n): Promise<string> {\n return downloadArchive(logger, options).then((archivePath) => extractArchive(logger, { archivePath }));\n}\n\nfunction binaryDirName(options?: { version?: string }): string {\n const version = options?.version ?? getDefaultPlVersion();\n return `pl-${version}-${archiveArch()}`;\n}\n\nexport function binaryPath(version?: string, ...p: string[]): string {\n return state.binaries(binaryDirName({ version }), ...p);\n}\n\nfunction trimExtension(filename: string): string {\n const lastDotIndex = filename.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return filename;\n }\n return filename.slice(0, lastDotIndex);\n}\n","import type { ChildProcess, SpawnSyncReturns } from 'node:child_process';\nimport { spawn, spawnSync } from 'node:child_process';\nimport yaml from 'yaml';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport * as pkg from './package';\nimport * as run from './run';\nimport * as composeCfg from './templates/compose';\nimport * as plCfg from './templates/pl-config';\nimport type * as types from './templates/types';\nimport * as platforma from './platforma';\nimport type { instanceInfo, instanceCommand } from './state';\nimport state from './state';\nimport * as util from './util';\nimport type winston from 'winston';\n\nexport default class Core {\n constructor(private readonly logger: winston.Logger) { }\n\n public startLast(): ChildProcess[] {\n const instance = state.currentInstance;\n if (!instance) {\n this.logger.error('failed to bring back Platforma Backend in the last started configuration: no last configuration found');\n throw new Error('no previous run info found');\n }\n\n return this.startInstance(instance);\n }\n\n public startInstance(instance: instanceInfo): ChildProcess[] {\n if (instance.runInfo) {\n const runInfo = this.renderRunInfo(instance.runInfo);\n this.logger.info(`Starting platforma backend instance '${instance.name}':\\n${runInfo}`);\n }\n\n const result = run.runCommands(\n this.logger,\n instance.upCommands,\n );\n checkRunError(result.executed);\n\n if (result.spawned.length > 0 && instance.type === 'process') {\n instance.pid = result.spawned[result.spawned.length - 1].pid;\n state.setInstanceInfo(instance.name, instance);\n this.logger.info(`instance '${instance.name}' started`);\n }\n\n state.currentInstanceName = instance.name;\n\n return result.spawned;\n }\n\n public stopInstance(instance: instanceInfo) {\n this.logger.info(`stopping platforma backend instance '${instance.name}'...`);\n const result = run.runCommands(this.logger, instance.downCommands);\n checkRunError(result.executed);\n\n const iType = instance.type;\n switch (iType) {\n case 'docker': {\n return;\n }\n\n case 'process': {\n if (instance.pid && state.isInstanceActive(instance)) {\n process.kill(instance.pid);\n }\n\n return;\n }\n default:\n util.assertNever(iType);\n }\n }\n\n public switchInstance(instance: instanceInfo): ChildProcess[] {\n // Stop all other active instances before switching to new one;\n for (const iName of state.instanceList) {\n if (iName !== instance.name) {\n const iToStop = state.getInstanceInfo(iName);\n if (state.isInstanceActive(iToStop)) {\n this.stopInstance(iToStop);\n }\n }\n }\n\n return this.startInstance(instance);\n }\n\n public createLocal(instanceName: string, options?: createLocalOptions): instanceInfo {\n let plBinaryPath = platforma.binaryPath(options?.version, 'binaries', 'platforma');\n if (options?.sourcesPath) {\n plBinaryPath = path.join(os.tmpdir(), 'platforma-custom-build');\n }\n if (options?.binaryPath) {\n plBinaryPath = options.binaryPath;\n }\n\n let configPath = options?.configPath;\n const workdir: string = options?.workdir ?? (configPath ? process.cwd() : state.instanceDir(instanceName));\n\n if (options?.primaryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n primary: plCfg.storageSettingsFromURL(options.primaryURL, workdir, options.configOptions?.storages?.primary),\n },\n };\n }\n if (options?.libraryURL) {\n options.configOptions = {\n ...options.configOptions,\n storages: {\n ...options.configOptions?.storages,\n library: plCfg.storageSettingsFromURL(options.libraryURL, workdir, options.configOptions?.storages?.library),\n },\n };\n }\n\n const configOptions = plCfg.loadDefaults(this.getLastJwt(), options?.configOptions);\n\n this.logger.debug(` checking license...`);\n this.checkLicense(options?.configOptions?.license?.value, options?.configOptions?.license?.file);\n\n const storageDirs: string[] = [\n `${configOptions.localRoot}/packages`,\n `${configOptions.localRoot}/packages-local`,\n `${configOptions.localRoot}/blocks-local`,\n ];\n if (configOptions.storages.primary.type === 'FS') {\n storageDirs.push(configOptions.storages.primary.rootPath);\n }\n if (configOptions.storages.library.type === 'FS') {\n storageDirs.push(configOptions.storages.library.rootPath);\n configOptions.hacks.libraryDownloadable = false;\n }\n if (configOptions.storages.work.type === 'FS') {\n storageDirs.push(configOptions.storages.work.rootPath);\n }\n\n this.logger.debug(' creating pl state directories...');\n for (const dir of storageDirs) {\n if (!fs.existsSync(dir)) {\n this.logger.debug(` '${dir}'`);\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n for (const drv of configOptions.core.auth.drivers) {\n if (drv.driver === 'htpasswd') {\n if (!fs.existsSync(drv.path)) {\n this.logger.debug(` installing default 'users.htpasswd' to ${drv.path}...`);\n fs.copyFileSync(pkg.assets('users.htpasswd'), drv.path);\n }\n }\n }\n\n if (!configPath) {\n configPath = path.join(configOptions.localRoot, 'config.yaml');\n this.logger.debug(` rendering configuration '${configPath}'...`);\n fs.writeFileSync(configPath, plCfg.render(configOptions));\n }\n\n const upCommands: instanceCommand[] = [];\n if (options?.sourcesPath) {\n upCommands.push({\n cmd: 'go',\n args: ['build', '-o', plBinaryPath, '.'],\n workdir: path.resolve(options.sourcesPath, 'cmd', 'platforma'),\n runOpts: {\n stdio: 'inherit',\n },\n });\n }\n\n upCommands.push({\n async: true,\n cmd: plBinaryPath,\n args: ['--config', configPath],\n workdir: workdir,\n runOpts: { stdio: 'inherit' },\n });\n\n state.setInstanceInfo(instanceName, {\n type: 'process',\n upCommands: upCommands,\n downCommands: [],\n cleanupCommands: [],\n runInfo: {\n configPath,\n dbPath: configOptions.core.db.path,\n apiAddr: configOptions.grpc.listen,\n logPath: configOptions.log.path,\n primary: configOptions.storages.primary,\n work: configOptions.storages.work,\n library: configOptions.storages.library,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public createLocalS3(instanceName: string, options?: createLocalS3Options): instanceInfo {\n this.logger.debug('creating platforma instance in \\'local s3\\' mode...');\n\n const minioPort = options?.minioPort ?? 9000;\n\n const instance = this.createLocal(instanceName, {\n ...options,\n primaryURL: options?.primaryURL ?? `s3e://testuser:testpassword@localhost:${minioPort}/main-bucket/?region=no-region`,\n libraryURL: options?.libraryURL ?? `s3e://testuser:testpassword@localhost:${minioPort}/library-bucket/?region=no-region`,\n });\n\n const localRoot = options?.configOptions?.localRoot;\n const minioRunCmd = this.createMinio(instanceName, {\n minioPort: minioPort,\n minioConsolePort: options?.minioConsolePort,\n storage: localRoot ? path.join(localRoot, 'minio') : undefined,\n });\n\n instance.upCommands = [\n minioRunCmd.start,\n ...instance.upCommands,\n ];\n\n instance.downCommands = [\n minioRunCmd.stop,\n ...instance.downCommands,\n ];\n\n instance.cleanupCommands = [\n minioRunCmd.cleanup,\n ...instance.cleanupCommands,\n ];\n\n state.setInstanceInfo(instanceName, instance);\n return instance;\n }\n\n public createMinio(\n instanceName: string,\n options?: {\n image?: string;\n version?: string;\n minioPort?: number;\n minioConsolePort?: number;\n storage?: string;\n }): {\n start: instanceCommand;\n stop: instanceCommand;\n cleanup: instanceCommand;\n } {\n this.logger.debug(' creating docker compose for minio service...');\n const composeSrc = pkg.assets('compose-backend.yaml');\n const composeMinio = state.instanceDir(instanceName, 'compose-minio.yaml');\n\n composeCfg.render(composeSrc, composeMinio, `pl-${instanceName}-minio`,\n new Map([\n ['minio', {}],\n ]),\n { dropVolumes: true },\n );\n\n const version = options?.version ? `:${options.version}` : '';\n this.logger.debug(` minio version: ${version}`);\n const image = options?.image ?? `quay.io/minio/minio${version}`;\n this.logger.debug(` minio image: ${image}`);\n\n const storage = options?.storage ?? state.instanceDir(instanceName, 'minio');\n util.ensureDir(storage, { mode: '0775' });\n\n const minioPort = options?.minioPort ?? 9000;\n const minioConsolePort = options?.minioConsolePort ?? 9001;\n\n const envs = {\n MINIO_IMAGE: image,\n MINIO_STORAGE: path.resolve(storage),\n MINIO_PORT: minioPort.toString(),\n MINIO_CONSOLE_PORT: minioConsolePort.toString(),\n };\n\n return {\n start: {\n cmd: 'docker',\n args: ['compose', `--file=${composeMinio}`, 'up', '--detach', '--remove-orphans', '--pull=missing'],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: 'inherit' },\n },\n stop: {\n cmd: 'docker',\n args: ['compose', `--file=${composeMinio}`, 'down'],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: 'inherit' },\n },\n cleanup: {\n cmd: 'docker',\n args: ['compose', `--file=${composeMinio}`, 'down', '--volumes', '--remove-orphans'],\n envs: envs,\n workdir: state.instanceDir(instanceName),\n runOpts: { stdio: 'inherit' },\n },\n };\n }\n\n public createDockerS3(\n instanceName: string,\n localRoot: string,\n options?: {\n image?: string;\n version?: string;\n platformOverride?: string;\n\n logLevel?: string;\n auth?: types.authOptions;\n\n license?: string;\n licenseFile?: string;\n\n grpcPort?: number;\n grpcAddr?: string;\n\n presignHost?: string;\n\n monitoringPort?: number;\n monitoringAddr?: string;\n\n debugPort?: number;\n debugAddr?: string;\n\n customMounts?: { hostPath: string; containerPath?: string }[];\n },\n ): instanceInfo {\n this.logger.debug('creating platforma instance in \\'docker s3\\' mode...');\n\n const composeS3Path = pkg.assets('compose-backend.yaml');\n const image = options?.image ?? pkg.plImageTag(options?.version);\n\n this.checkLicense(options?.license, options?.licenseFile);\n\n const storagePath = (...s: string[]) => path.join(localRoot, ...s);\n const storageDir = (s: string) => {\n const p = storagePath(s);\n util.ensureDir(p, { mode: '0775' });\n return p;\n };\n\n const logFilePath = storagePath('logs', 'platforma.log');\n if (!fs.existsSync(logFilePath)) {\n fs.mkdirSync(path.dirname(logFilePath), { recursive: true });\n fs.writeFileSync(logFilePath, '');\n }\n\n const presignHost = options?.presignHost ?? 'localhost';\n\n const primary = plCfg.storageSettingsFromURL(`s3e://testuser:testpassword@minio:9000/main-bucket`);\n if (primary.type !== 'S3') {\n throw new Error('primary storage must have \\'S3\\' type in \\'docker s3\\' configuration');\n } else {\n primary.presignEndpoint = `http://${presignHost}:9000`;\n }\n\n const library = plCfg.storageSettingsFromURL(`s3e://testuser:testpassword@minio:9000/library-bucket`);\n if (library.type !== 'S3') {\n throw new Error(`${library.type} storage type is not supported for library storage`);\n } else {\n library.presignEndpoint = `http://${presignHost}:9000`;\n }\n\n const dbFSPath = storageDir('db');\n const workFSPath = storageDir('work');\n const usersFSPath = storagePath('users.htpasswd');\n if (!fs.existsSync(usersFSPath)) {\n fs.copyFileSync(pkg.assets('users.htpasswd'), usersFSPath);\n }\n\n const composeDstPath = storagePath('compose.yaml');\n if (fs.existsSync(composeDstPath)) {\n this.logger.info(`replacing docker compose file ${composeDstPath}`);\n }\n\n const backendMounts: composeCfg.VolumeMountOption[] = [];\n for (const mnt of options?.customMounts ?? []) {\n backendMounts.push({\n hostPath: mnt.hostPath,\n containerPath: mnt.containerPath ?? mnt.hostPath,\n });\n }\n composeCfg.render(composeS3Path, composeDstPath, `pl-${instanceName}`, new Map([\n ['minio', {}],\n ['backend', {\n platform: options?.platformOverride,\n mounts: backendMounts,\n }],\n ]));\n\n const envs: NodeJS.ProcessEnv = {\n MINIO_IMAGE: 'quay.io/minio/minio',\n MINIO_STORAGE: storageDir('minio'),\n\n PL_IMAGE: image,\n\n PL_AUTH_HTPASSWD_PATH: usersFSPath,\n PL_LICENSE: options?.license,\n PL_LICENSE_FILE: options?.licenseFile,\n\n PL_LOG_LEVEL: options?.logLevel ?? 'info',\n PL_LOG_DIR: path.dirname(logFilePath),\n PL_LOG_ROTATION_ENABLED: 'true',\n\n PL_RUNNER_WD_CACHE_ON_FAILURE: '1h',\n\n PL_DATA_DB_ROOT: dbFSPath,\n PL_DATA_PRIMARY_ROOT: storageDir('primary'),\n PL_DATA_LIBRARY_ROOT: storageDir('library'),\n PL_DATA_WORKDIR_ROOT: workFSPath,\n\n // Mount packages storage as volume, because APFS is case-insensitive on Mac OS X and this breaks some pl software installation.\n // PL_DATA_PACKAGE_ROOT: storageDir('packages'),\n\n ...this.configureDockerStorage('primary', primary),\n ...this.configureDockerStorage('library', library),\n };\n\n if (options?.grpcAddr) envs.PL_GRPC_ADDR = options.grpcAddr;\n if (options?.grpcPort) envs.PL_GRPC_PORT = options.grpcPort.toString();\n if (options?.monitoringAddr) envs.PL_MONITORING_ADDR = options.monitoringAddr;\n if (options?.monitoringPort) envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n if (options?.debugAddr) envs.PL_DEBUG_ADDR = options.debugAddr;\n if (options?.debugPort) envs.PL_DEBUG_PORT = options.debugPort.toString();\n if (options?.auth) {\n if (options.auth.enabled) {\n envs['PL_AUTH_ENABLED'] = 'true';\n }\n if (options.auth.drivers) {\n for (const drv of options.auth.drivers) {\n if (drv.driver === 'htpasswd') {\n envs['PL_AUTH_HTPASSWD_PATH'] = path.resolve(drv.path);\n drv.path = '/etc/platforma/users.htpasswd';\n }\n }\n envs['PL_AUTH_DRIVERS'] = JSON.stringify(options.auth.drivers);\n }\n }\n\n state.setInstanceInfo(instanceName, {\n type: 'docker',\n upCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'up', '--detach', '--remove-orphans', '--pull=missing'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n downCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'down'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n cleanupCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'down', '--volumes', '--remove-orphans'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n runInfo: {\n apiPort: options?.grpcPort,\n apiAddr: options?.grpcAddr,\n logPath: logFilePath,\n primary: primary,\n work: { type: 'FS', rootPath: workFSPath },\n library: library,\n dbPath: dbFSPath,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public createDocker(\n instanceName: string,\n localRoot: string,\n options?: {\n primaryStorageURL?: string;\n workStoragePath?: string;\n libraryStorageURL?: string;\n customMounts?: { hostPath: string; containerPath?: string }[];\n\n image?: string;\n version?: string;\n platformOverride?: string;\n\n logLevel?: string;\n\n auth?: types.authOptions;\n\n license?: string;\n licenseFile?: string;\n grpcPort?: number;\n grpcAddr?: string;\n\n monitoringPort?: number;\n monitoringAddr?: string;\n\n debugPort?: number;\n debugAddr?: string;\n },\n ): instanceInfo {\n this.logger.debug('creating platforma instance in \\'docker\\' mode...');\n\n const composeFSPath = pkg.assets('compose-backend.yaml');\n const image = options?.image ?? pkg.plImageTag(options?.version);\n\n this.checkLicense(options?.license, options?.licenseFile);\n\n const storagePath = (...s: string[]) => path.join(localRoot, ...s);\n const storageDir = (s: string) => {\n const p = storagePath(s);\n util.ensureDir(p, { mode: '0775' });\n return p;\n };\n\n const logFilePath = storagePath('logs', 'platforma.log');\n if (!fs.existsSync(logFilePath)) {\n fs.mkdirSync(path.dirname(logFilePath), { recursive: true });\n fs.writeFileSync(logFilePath, '');\n }\n\n const dbFSPath = storageDir('db');\n const primaryFSPath = storageDir('primary');\n const libraryFSPath = storageDir('library');\n const workFSPath = storageDir('work');\n const usersFSPath = storagePath('users.htpasswd');\n if (!fs.existsSync(usersFSPath)) {\n fs.copyFileSync(pkg.assets('users.htpasswd'), usersFSPath);\n }\n\n const composeDstPath = storagePath('compose.yaml');\n if (fs.existsSync(composeDstPath)) {\n this.logger.info(`replacing docker compose file ${composeDstPath}`);\n }\n\n const backendMounts: composeCfg.VolumeMountOption[] = [];\n for (const mnt of options?.customMounts ?? []) {\n backendMounts.push({\n hostPath: mnt.hostPath,\n containerPath: mnt.containerPath ?? mnt.hostPath,\n });\n }\n this.logger.debug(`Rendering docker compose file '${composeDstPath}' using '${composeFSPath}' as base template`);\n composeCfg.render(composeFSPath, composeDstPath, `pl-${instanceName}`, new Map([\n ['backend', {\n platform: options?.platformOverride,\n mounts: backendMounts,\n }],\n ]));\n\n const primary = plCfg.storageSettingsFromURL(options?.primaryStorageURL ?? `file:${primaryFSPath}`, '.');\n const library = plCfg.storageSettingsFromURL(options?.libraryStorageURL ?? `file:${libraryFSPath}`, '.');\n\n const envs: NodeJS.ProcessEnv = {\n PL_IMAGE: image,\n PL_AUTH_HTPASSWD_PATH: usersFSPath,\n PL_LICENSE: options?.license,\n PL_LICENSE_FILE: options?.licenseFile,\n\n PL_LOG_LEVEL: 'info',\n PL_LOG_DIR: path.dirname(logFilePath),\n PL_LOG_ROTATION_ENABLED: 'true',\n\n PL_RUNNER_WD_CACHE_ON_FAILURE: '1h',\n\n PL_DATA_DB_ROOT: dbFSPath,\n PL_DATA_PRIMARY_ROOT: primaryFSPath,\n PL_DATA_LIBRARY_ROOT: libraryFSPath,\n PL_DATA_WORKDIR_ROOT: workFSPath,\n PL_DATA_PACKAGE_ROOT: storageDir('packages'),\n\n ...this.configureDockerStorage('primary', primary),\n ...this.configureDockerStorage('library', library),\n };\n\n if (options?.grpcAddr) envs.PL_GRPC_ADDR = options.grpcAddr;\n if (options?.grpcPort) envs.PL_GRPC_PORT = options.grpcPort.toString();\n if (options?.monitoringAddr) envs.PL_MONITORING_ADDR = options.monitoringAddr;\n if (options?.monitoringPort) envs.PL_MONITORING_PORT = options.monitoringPort.toString();\n if (options?.debugAddr) envs.PL_DEBUG_ADDR = options.debugAddr;\n if (options?.debugPort) envs.PL_DEBUG_PORT = options.debugPort.toString();\n\n if (options?.auth) {\n if (options.auth.enabled) {\n envs['PL_AUTH_ENABLED'] = 'true';\n }\n if (options.auth.drivers) {\n for (const drv of options.auth.drivers) {\n if (drv.driver === 'htpasswd') {\n envs['PL_AUTH_HTPASSWD_PATH'] = path.resolve(drv.path);\n drv.path = '/etc/platforma/users.htpasswd';\n }\n }\n envs['PL_AUTH_DRIVERS'] = JSON.stringify(options.auth.drivers);\n }\n }\n\n state.setInstanceInfo(instanceName, {\n type: 'docker',\n upCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'up', '--detach', '--remove-orphans', '--pull=missing'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n downCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'down'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n cleanupCommands: [{\n cmd: 'docker',\n args: ['compose', `--file=${composeDstPath}`, 'down', '--volumes', '--remove-orphans'],\n envs: envs,\n runOpts: { stdio: 'inherit' },\n }],\n runInfo: {\n apiPort: options?.grpcPort,\n apiAddr: options?.grpcAddr,\n logPath: logFilePath,\n primary: primary,\n work: { type: 'FS', rootPath: workFSPath },\n library: library,\n dbPath: dbFSPath,\n },\n });\n\n return state.getInstanceInfo(instanceName);\n }\n\n public cleanupInstance(instanceName?: string) {\n const removeWarns: string[] = [];\n const instancesToDrop = new Map<string, instanceInfo>();\n let warnMessage: string = '';\n\n if (instanceName) {\n const instance = state.getInstanceInfo(instanceName);\n instancesToDrop.set(instanceName, instance);\n const iType = instance.type;\n switch (iType) {\n case 'docker':{\n removeWarns.push(`docker service 'pl-${instanceName}', including all its volumes and data in '${state.instanceDir(instanceName)}' will be destroyed`);\n break;\n }\n case 'process':{\n removeWarns.push(`directory '${state.instanceDir(instanceName)}' would be deleted`);\n if (instance.downCommands) {\n removeWarns.push(`associated docker service, including all volumes and data will be destroyed`);\n }\n break;\n }\n default:\n util.assertNever(iType);\n }\n\n if (instanceName === state.currentInstanceName) {\n removeWarns.push(\n 'last command run cache (\\'pl-dev start\\' shorthand will stop working until next full start command call)',\n );\n }\n\n warnMessage = `\nYou are going to reset the state of platforma service '${instanceName}':\n - ${removeWarns.join('\\n - ')}\n`;\n } else {\n for (const iName of state.instanceList) {\n instancesToDrop.set(iName, state.getInstanceInfo(iName));\n }\n\n removeWarns.push(\n 'last command run cache (\\'pl-dev start\\' shorthand will stop working until next full start command call)',\n `all service configurations stored in: ${state.instanceDir()} (including all associated docker containers and volumes)`,\n );\n\n warnMessage = `\nYou are going to reset the state of all platforma services configured with pl-bootstrap package.\n - ${removeWarns.join('\\n - ')}\n`;\n }\n\n this.logger.warn(warnMessage);\n if (!util.askYN('Are you sure?')) {\n this.logger.info('Reset action was canceled');\n return;\n }\n\n for (const [name, instance] of instancesToDrop.entries()) {\n if (instance.cleanupCommands.length) {\n this.logger.info(`Wiping instance ${name} services`);\n const result = run.runCommands(this.logger, instance.cleanupCommands);\n checkRunError(result.executed, `failed to wipe instance ${name} services`);\n }\n\n this.logger.info(`Destroying instance '${name}' data directory`);\n fs.rmSync(state.instanceDir(name), { recursive: true, force: true });\n }\n\n if (!instanceName) {\n this.logger.info(`Destroying state dir '${state.path()}'`);\n fs.rmSync(state.path(), { recursive: true, force: true });\n }\n\n this.logger.info(\n `\\nIf you want to remove all downloaded platforma binaries, delete '${state.binaries()}' dir manually\\n`,\n );\n }\n\n public mergeLicenseEnvs(flags: { 'license'?: string; 'license-file'?: string }) {\n if (flags.license === undefined) {\n if ((process.env.MI_LICENSE ?? '') != '') flags.license = process.env.MI_LICENSE;\n else if ((process.env.PL_LICENSE ?? '') != '') flags.license = process.env.PL_LICENSE;\n }\n\n // set 'license-file' only if license is still undefined\n if (flags['license-file'] === undefined && flags.license === undefined) {\n if ((process.env.MI_LICENSE_FILE ?? '') != '') flags['license-file'] = process.env.MI_LICENSE_FILE;\n else if ((process.env.PL_LICENSE_FILE ?? '') != '') flags['license-file'] = process.env.PL_LICENSE_FILE;\n else if (fs.existsSync(path.resolve(os.homedir(), '.pl.license')))\n flags['license-file'] = path.resolve(os.homedir(), '.pl.license');\n }\n }\n\n public initAuthDriversList(\n flags: {\n 'auth-htpasswd-file'?: string;\n\n 'auth-ldap-server'?: string;\n 'auth-ldap-default-dn'?: string;\n },\n workdir: string,\n ): types.authDriver[] | undefined {\n const authDrivers: types.authDriver[] = [];\n if (flags['auth-htpasswd-file']) {\n authDrivers.push({\n driver: 'htpasswd',\n path: path.resolve(workdir, flags['auth-htpasswd-file']),\n });\n }\n\n if (Boolean(flags['auth-ldap-server']) !== Boolean(flags['auth-ldap-default-dn'])) {\n throw new Error('LDAP auth settings require both \\'server\\' and \\'default DN\\' options to be set');\n }\n\n if (flags['auth-ldap-server']) {\n authDrivers.push({\n driver: 'ldap',\n serverUrl: flags['auth-ldap-server'],\n defaultDN: flags['auth-ldap-default-dn']!,\n });\n }\n\n if (authDrivers.length === 0) {\n return undefined;\n }\n\n return [{ driver: 'jwt', key: this.getLastJwt() }, ...authDrivers] as types.authDriver[];\n }\n\n /** Gets the last stored JWT secret key or generates it and stores in a file. */\n public getLastJwt() {\n const jwtFile = state.path('auth.jwt');\n const encoding = 'utf-8';\n\n let lastJwt = '';\n if (fs.existsSync(jwtFile)) {\n lastJwt = fs.readFileSync(jwtFile, { encoding });\n }\n\n if (lastJwt == '') {\n lastJwt = util.randomStr(64);\n fs.writeFileSync(jwtFile, lastJwt, { encoding });\n }\n\n return lastJwt;\n }\n\n private checkLicense(value?: string, file?: string) {\n if (value !== undefined && value != '') return;\n\n if (file !== undefined && file != '') return;\n\n this.logger.error(`A license for Platforma Backend must be set.\n\nYou can provide the license directly using the '--license' flag\nor use the '--license-file' flag if the license is stored in a file.\n\nAlternatively, you can set it via the environment variables 'MI_LICENSE' or 'PL_LICENSE'.\n\nThe license file can also be set with the variables 'MI_LICENSE_FILE' or 'PL_LICENSE_FILE',\nor stored in '$HOME/.pl.license'.\n\nYou can obtain the license from \"https://licensing.milaboratories.com\".`);\n\n throw new Error(`The license was not provided.`);\n }\n\n private configureDockerStorage(storageID: string, storage: types.storageOptions): NodeJS.ProcessEnv {\n const envs: NodeJS.ProcessEnv = {};\n const sType = storage.type;\n storageID = storageID.toUpperCase();\n\n switch (sType) {\n case 'S3':\n envs[`PL_DATA_${storageID}_TYPE`] = 'S3';\n envs[`PL_DATA_${storageID}_S3_BUCKET`] = storage.bucketName!;\n\n if (storage.endpoint) envs[`PL_DATA_${storageID}_S3_ENDPOINT`] = storage.endpoint;\n if (storage.presignEndpoint) envs[`PL_DATA_${storageID}_S3_PRESIGN_ENDPOINT`] = storage.presignEndpoint;\n if (storage.region) envs[`PL_DATA_${storageID}_S3_REGION`] = storage.region;\n if (storage.key) envs[`PL_DATA_${storageID}_S3_KEY`] = storage.key;\n if (storage.secret) envs[`PL_DATA_${storageID}_S3_SECRET`] = storage.secret;\n\n return envs;\n\n case 'FS':\n envs[`PL_DATA_${storageID}_TYPE`] = 'FS';\n\n return envs;\n\n default:\n util.assertNever(sType);\n }\n\n return {};\n }\n\n private renderRunInfo(\n runInfo: {\n configPath?: string;\n apiPort?: number;\n apiAddr?: string;\n logPath?: string;\n dbPath?: string;\n primary?: types.storageOptions;\n work?: types.fsStorageOptions;\n library?: types.storageOptions;\n },\n indent: number = 10,\n ) {\n const report: string[] = [];\n\n const column = (t: string) => t.padStart(indent, ' ');\n if (runInfo.configPath) {\n report.push(`${column('config')}: ${runInfo.configPath}`);\n }\n\n if (runInfo.apiAddr) {\n report.push(`${column('API')}: ${runInfo.apiAddr}`);\n } else if (runInfo.apiPort) {\n report.push(`${column('API')}: 127.0.0.1:${runInfo.apiPort.toString()}`);\n } else {\n report.push(`${column('API')}: 127.0.0.1:6345`);\n }\n\n if (runInfo.logPath) {\n report.push(`${column('log')}: ${runInfo.logPath}`);\n }\n\n const primaryType = runInfo.primary?.type;\n switch (primaryType) {\n case undefined:\n break;\n\n case 'FS':\n report.push(`${column('primary')}: ${runInfo.primary!.rootPath!}`);\n break;\n\n case 'S3':\n report.push(\n `${column('primary')}: S3 at '${runInfo.primary!.endpoint ?? 'AWS'}', bucket '${runInfo.primary!.bucketName!}', prefix: '${runInfo.primary!.keyPrefix ?? ''}'`,\n );\n break;\n\n default:\n util.assertNever(primaryType);\n }\n\n const libraryType = runInfo.library?.type;\n switch (libraryType) {\n case undefined:\n break;\n\n case 'FS':\n report.push(`${column('library')}: ${runInfo.library!.rootPath!}`);\n break;\n\n case 'S3':\n report.push(\n `${column('library')}: S3 at '${runInfo.library!.endpoint ?? 'AWS'}', bucket '${runInfo.library!.bucketName!}', prefix: '${runInfo.library!.keyPrefix ?? ''}'`,\n );\n break;\n\n default:\n util.assertNever(libraryType);\n }\n\n if (runInfo.work) {\n report.push(`${column('workdirs')}: ${runInfo.work.rootPath}`);\n }\n\n if (runInfo.dbPath) {\n report.push(`${column('db')}: ${runInfo.dbPath}`);\n }\n\n return report.join('\\n');\n }\n}\n\nexport function checkRunError(result: SpawnSyncReturns<Buffer>[], message?: string) {\n for (const buffer of result) {\n if (buffer.error) {\n throw buffer.error;\n }\n\n const msg = message ?? 'failed to run command';\n\n if (buffer.status !== 0) {\n throw new Error(`${msg}, process exited with code '${buffer.status}'`);\n }\n }\n}\n\nexport type createLocalOptions = {\n version?: string;\n sourcesPath?: string;\n binaryPath?: string;\n configPath?: string;\n configOptions?: plCfg.plOptions;\n workdir?: string;\n\n primaryURL?: string;\n libraryURL?: string;\n};\n\nexport type createLocalFSOptions = createLocalOptions;\n\nexport type createLocalS3Options = createLocalOptions & {\n minioPort?: number;\n minioConsolePort?: number;\n};\n","import { Command, Flags } from '@oclif/core';\nimport Core from '../core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Reset extends Command {\n static override description =\n 'Clear service state (forget last run command, destroy docker services, volumes and so on)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Reset);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.cleanupInstance();\n }\n}\n","import { Command } from '@oclif/core';\nimport Core from '../core';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Start extends Command {\n static override description = 'Start last run service configuraiton';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Start);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n core.startLast();\n }\n}\n","import { Command } from '@oclif/core';\nimport Core from '../core';\nimport state from '../state';\nimport * as cmdOpts from '../cmd-opts';\nimport * as util from '../util';\n\nexport default class Stop extends Command {\n static override description = 'Stop platforma service';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Stop);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n if (state.currentInstance) {\n core.stopInstance(state.currentInstance);\n } else {\n logger.warn('up/start command was not called for any instance, nothing to stop');\n }\n }\n}\n","import path from 'node:path';\n\nimport { Command } from '@oclif/core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as util from '../../util';\nimport type * as types from '../../templates/types';\nimport state from '../../state';\n\nexport default class Docker extends Command {\n static override description = 'Run platforma backend service with \\'FS\\' primary storage type';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n ...cmdOpts.ArchFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.MountFlag,\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Docker);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = 'docker';\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.'),\n }\n : undefined;\n const storage = flags.storage ? path.join('.', flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n\n const instance = core.createDocker(instanceName, storage, {\n primaryStorageURL: flags['storage-primary'],\n workStoragePath: flags['storage-work'],\n libraryStorageURL: flags['storage-library'],\n\n image: flags.image,\n version: flags.version,\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port'],\n });\n\n core.switchInstance(instance);\n }\n}\n","import { Command } from '@oclif/core';\nimport path from 'node:path';\nimport type { createLocalOptions } from '../../core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as platforma from '../../platforma';\nimport * as util from '../../util';\nimport state from '../../state';\n\nexport default class Local extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Local);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = 'local';\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.instanceDir(instanceName);\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n let listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n let listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n let listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const startOptions: createLocalOptions = {\n sourcesPath: flags['pl-sources'],\n binaryPath: flags['pl-binary'],\n\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: { auth: { enabled: authEnabled, drivers: authDrivers } },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] },\n },\n },\n };\n\n const instance = core.createLocal(instanceName, startOptions);\n\n if (startOptions.binaryPath || startOptions.sourcesPath) {\n core.switchInstance(instance);\n } else {\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => {\n const children = core.switchInstance(instance);\n setTimeout(() => {\n for (const child of children) {\n child.unref();\n }\n }, 1000);\n })\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n }\n}\n","import { Command, Args, Flags } from '@oclif/core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as util from '../../util';\n\nexport default class Delete extends Command {\n static override description = 'List available instances';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n all: Flags.boolean({\n description: 'remove all known instances',\n required: false,\n }),\n };\n\n static args = {\n name: Args.string({ required: false }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Delete);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n const name = args.name;\n const all = flags.all;\n\n if (all) {\n core.cleanupInstance();\n process.exit(0);\n }\n\n if (!name) {\n logger.error(`Please, specify name of instance to be removed or set '--all' flag instead`);\n process.exit(1);\n }\n\n core.cleanupInstance(name);\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as util from '../../util';\nimport state from '../../state';\n\nexport default class Down extends Command {\n static override description = 'List available instances';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n };\n\n static args = {\n name: Args.string({ required: false }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Down);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n const name = args.name ?? state.currentInstanceName;\n\n if (!name) {\n logger.info(`no pl service instance selected. No service was stopped`);\n process.exit(0);\n }\n\n core.stopInstance(state.getInstanceInfo(name));\n }\n}\n","import { Command } from '@oclif/core';\nimport state from '../../state';\n\nexport default class List extends Command {\n static override description = 'List available instances';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = { };\n\n public async run(): Promise<void> {\n await this.parse(List);\n\n const instances = state.instanceList;\n const currentInstance = state.currentInstanceName;\n\n for (const iName of instances) {\n const statusReport = [];\n const instance = state.getInstanceInfo(iName);\n if (state.isInstanceActive(instance)) statusReport.push('status:up');\n statusReport.push(`type:${instance.type}`);\n\n if (iName === currentInstance) {\n console.log(` * ${iName} (${statusReport.join(', ')})`);\n } else {\n console.log(` ${iName} (${statusReport.join(', ')})`);\n }\n }\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport Core from '../../core';\nimport * as cmdOpts from '../../cmd-opts';\nimport * as util from '../../util';\nimport state from '../../state';\n\nexport default class Up extends Command {\n static override description = 'List available instances';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n };\n\n static args = {\n name: Args.string({ required: false }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Up);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n\n const name = args.name ?? state.currentInstanceName;\n\n if (!name) {\n logger.error(`no pl service instance is selected. Select instance with 'select' command or provide name to 'up'`);\n process.exit(1);\n }\n\n const children = core.switchInstance(state.getInstanceInfo(name));\n\n // Before we're able to 'free' the terminal from lock of the process we start,\n // we have to provide a control over the instance state.\n // Without the control, there is no difference for the user between 'service successfully started' and 'service failed to start'\n //\n // When running service in docker, we can see the state of the service in Docker Desktop or via CLI utilities.\n // Also we see the feedback on faulty service start immediately.\n // When running service as a regular local process, the state control is comlicated.\n\n // When we're ready, replace all Promises magic below wit simple\n // for (const child of children) {\n // child.unref();\n // }\n\n const results: Promise<void>[] = [];\n for (const child of children) {\n results.push(new Promise((resolve, reject) => {\n child.on('close', resolve);\n child.on('error', reject);\n }));\n }\n\n await Promise.all(results);\n }\n}\n","import path from 'node:path';\n\nimport { Command } from '@oclif/core';\nimport Core from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as util from '../../../util';\nimport type * as types from '../../../templates/types';\nimport state from '../../../state';\n\nexport default class S3 extends Command {\n static override description = 'Run platforma backend service with \\'S3\\' primary storage type';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n ...cmdOpts.ArchFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.MountFlag,\n ...cmdOpts.StorageFlag,\n ...cmdOpts.MinioPresignHostFlag,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(S3);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = 'docker-s3';\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.'),\n }\n : undefined;\n\n const storage = flags.storage ? path.join('.', flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n const presignHost = flags['minio-presign-host'] ? 'minio' : 'localhost';\n\n const instance = core.createDockerS3(instanceName, storage, {\n image: flags.image,\n version: flags.version,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port'],\n\n presignHost: presignHost,\n });\n\n core.switchInstance(instance);\n }\n}\n","import path from 'node:path';\n\nimport { Command } from '@oclif/core';\nimport type { createLocalS3Options } from '../../../core';\nimport Core from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as platforma from '../../../platforma';\nimport * as util from '../../../util';\nimport state from '../../../state';\n\nexport default class S3 extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.S3AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags,\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(S3);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = 'local-s3';\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.instanceDir(instanceName);\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n let listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n let listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n let listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const startOptions: createLocalS3Options = {\n sourcesPath: flags['pl-sources'],\n binaryPath: flags['pl-binary'],\n\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n minioPort: flags['s3-port'],\n minioConsolePort: flags['s3-console-port'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: {\n auth: { enabled: authEnabled, drivers: authDrivers },\n },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] },\n },\n },\n };\n\n const instance = core.createLocalS3(instanceName, startOptions);\n\n if (startOptions.binaryPath || startOptions.sourcesPath) {\n core.switchInstance(instance);\n } else {\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => {\n const children = core.switchInstance(instance);\n setTimeout(() => {\n for (const child of children) {\n child.unref();\n }\n }, 1000);\n })\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport path from 'node:path';\nimport type * as types from '../../../templates/types';\nimport Core from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as util from '../../../util';\nimport state from '../../../state';\n\nexport default class Docker extends Command {\n static override description = 'Run Platforma Backend service as docker container on current host';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n ...cmdOpts.ArchFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.MountFlag,\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n };\n\n static args = {\n name: Args.string({ required: true }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Docker);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = args.name;\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.'),\n }\n : undefined;\n\n const storage = flags.storage ? path.join('.', flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n\n core.createDocker(instanceName, storage, {\n primaryStorageURL: flags['storage-primary'],\n workStoragePath: flags['storage-work'],\n libraryStorageURL: flags['storage-library'],\n\n image: flags.image,\n version: flags.version,\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port'],\n });\n\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport path from 'node:path';\nimport type { createLocalOptions } from '../../../core';\nimport Core from '../../../core';\nimport * as cmdOpts from '../../../cmd-opts';\nimport * as util from '../../../util';\nimport state from '../../../state';\nimport * as platforma from '../../../platforma';\n\nexport default class Local extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags,\n };\n\n static args = {\n name: Args.string({ required: true }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Local);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = args.name;\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.instanceDir(instanceName);\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n let listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n let listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n let listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const createOptions: createLocalOptions = {\n sourcesPath: flags['pl-sources'],\n binaryPath: flags['pl-binary'],\n\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: { auth: { enabled: authEnabled, drivers: authDrivers } },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] },\n },\n },\n };\n\n core.createLocal(instanceName, createOptions);\n\n if (createOptions.binaryPath || createOptions.sourcesPath) {\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n return;\n }\n\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => logger.info(`Instance '${instanceName}' was created. To start it run 'svc up' command`))\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport path from 'node:path';\nimport type * as types from '../../../../templates/types';\nimport Core from '../../../../core';\nimport * as cmdOpts from '../../../../cmd-opts';\nimport * as util from '../../../../util';\nimport state from '../../../../state';\n\nexport default class S3 extends Command {\n static override description = 'Run Platforma Backend service as docker container on current host with MinIO as local S3 storage';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.ImageFlag,\n ...cmdOpts.VersionFlag,\n ...cmdOpts.ArchFlag,\n\n ...cmdOpts.AuthFlags,\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.MountFlag,\n ...cmdOpts.StorageFlag,\n ...cmdOpts.MinioPresignHostFlag,\n };\n\n static args = {\n name: Args.string({ required: true }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(S3);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = args.name;\n\n const authEnabled = flags['auth-enabled'];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, '.'),\n }\n : undefined;\n\n const storage = flags.storage ? path.join('.', flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n const presignHost = flags['minio-presign-host'] ? 'minio' : 'localhost';\n\n core.createDockerS3(instanceName, storage, {\n image: flags.image,\n version: flags.version,\n\n license: flags['license'],\n licenseFile: flags['license-file'],\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n auth: authOptions,\n\n grpcAddr: flags['grpc-listen'],\n grpcPort: flags['grpc-port'],\n\n monitoringAddr: flags['monitoring-listen'],\n monitoringPort: flags['monitoring-port'],\n\n debugAddr: flags['debug-listen'],\n debugPort: flags['debug-port'],\n\n presignHost: presignHost,\n });\n\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n if (flags['minio-presign-host']) {\n logger.info(' NOTE: make sure you have \\'minio\\' host in your hosts file as 127.0.0.1 address');\n }\n }\n}\n","import { Command, Args } from '@oclif/core';\nimport path from 'node:path';\nimport type { createLocalS3Options } from '../../../../core';\nimport Core from '../../../../core';\nimport * as cmdOpts from '../../../../cmd-opts';\nimport * as util from '../../../../util';\nimport state from '../../../../state';\nimport * as platforma from '../../../../platforma';\n\nexport default class Local extends Command {\n static override description = 'Run Platforma Backend service as local process on current host (no docker container)';\n\n static override examples = ['<%= config.bin %> <%= command.id %>'];\n\n static override flags = {\n ...cmdOpts.GlobalFlags,\n ...cmdOpts.VersionFlag,\n\n ...cmdOpts.S3AddressesFlags,\n ...cmdOpts.AddressesFlags,\n ...cmdOpts.PlBinaryFlag,\n ...cmdOpts.PlSourcesFlag,\n\n ...cmdOpts.ConfigFlag,\n\n ...cmdOpts.LicenseFlags,\n\n ...cmdOpts.StorageFlag,\n ...cmdOpts.StoragePrimaryURLFlag,\n ...cmdOpts.StorageWorkPathFlag,\n ...cmdOpts.StorageLibraryURLFlag,\n\n ...cmdOpts.PlLogFileFlag,\n ...cmdOpts.PlWorkdirFlag,\n ...cmdOpts.AuthFlags,\n };\n\n static args = {\n name: Args.string({ required: true }),\n };\n\n public async run(): Promise<void> {\n const { flags, args } = await this.parse(Local);\n\n const logger = util.createLogger(flags['log-level']);\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const instanceName = args.name;\n\n const workdir = flags['pl-workdir'] ?? '.';\n const storage = flags.storage ? path.join(workdir, flags.storage) : state.instanceDir(instanceName);\n const logFile = flags['pl-log-file'] ? path.join(workdir, flags['pl-log-file']) : undefined;\n\n const authDrivers = core.initAuthDriversList(flags, workdir);\n const authEnabled = flags['auth-enabled'] ?? authDrivers !== undefined;\n\n let listenGrpc: string = '127.0.0.1:6345';\n if (flags['grpc-listen']) listenGrpc = flags['grpc-listen'];\n else if (flags['grpc-port']) listenGrpc = `127.0.0.1:${flags['grpc-port']}`;\n\n let listenMon: string = '127.0.0.1:9090';\n if (flags['monitoring-listen']) listenMon = flags['monitoring-listen'];\n else if (flags['monitoring-port']) listenMon = `127.0.0.1:${flags['monitoring-port']}`;\n\n let listenDbg: string = '127.0.0.1:9091';\n if (flags['debug-listen']) listenDbg = flags['debug-listen'];\n else if (flags['debug-port']) listenDbg = `127.0.0.1:${flags['debug-port']}`;\n\n const createOptions: createLocalS3Options = {\n sourcesPath: flags['pl-sources'],\n binaryPath: flags['pl-binary'],\n\n version: flags.version,\n configPath: flags.config,\n workdir: flags['pl-workdir'],\n\n primaryURL: flags['storage-primary'],\n libraryURL: flags['storage-library'],\n\n minioPort: flags['s3-port'],\n minioConsolePort: flags['s3-console-port'],\n\n configOptions: {\n grpc: { listen: listenGrpc },\n monitoring: { listen: listenMon },\n debug: { listen: listenDbg },\n license: { value: flags['license'], file: flags['license-file'] },\n log: { path: logFile },\n localRoot: storage,\n core: { auth: { enabled: authEnabled, drivers: authDrivers } },\n storages: {\n work: { type: 'FS', rootPath: flags['storage-work'] },\n },\n },\n\n };\n\n logger.info(`Creating instance configuration, data directory and other stuff...`);\n core.createLocalS3(instanceName, createOptions);\n\n if (createOptions.binaryPath || createOptions.sourcesPath) {\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n return;\n }\n\n platforma\n .getBinary(logger, { version: flags.version })\n .then(() => logger.info(`Instance '${instanceName}' was created. To start it run 'svc up' command`))\n .catch(function (err: Error) {\n logger.error(err.message);\n });\n }\n}\n","// DO NOT EDIT. This file was generated by oclif-index utility.\n\nimport Cmd0 from './commands/create-block';\nimport Cmd1 from './commands/reset';\nimport Cmd2 from './commands/start';\nimport Cmd3 from './commands/stop';\nimport Cmd4 from './commands/start/docker';\nimport Cmd5 from './commands/start/local';\nimport Cmd6 from './commands/svc/delete';\nimport Cmd7 from './commands/svc/down';\nimport Cmd8 from './commands/svc/list';\nimport Cmd9 from './commands/svc/up';\nimport Cmd10 from './commands/start/docker/s3';\nimport Cmd11 from './commands/start/local/s3';\nimport Cmd12 from './commands/svc/create/docker';\nimport Cmd13 from './commands/svc/create/local';\nimport Cmd14 from './commands/svc/create/docker/s3';\nimport Cmd15 from './commands/svc/create/local/s3';\n\n// prettier-ignore\nexport const COMMANDS = {\n 'create-block': Cmd0,\n 'reset': Cmd1,\n 'start': Cmd2,\n 'stop': Cmd3,\n 'start:docker': Cmd4,\n 'start:local': Cmd5,\n 'svc:delete': Cmd6,\n 'svc:down': Cmd7,\n 'svc:list': Cmd8,\n 'svc:up': Cmd9,\n 'start:docker:s3': Cmd10,\n 'start:local:s3': Cmd11,\n 'svc:create:docker': Cmd12,\n 'svc:create:local': Cmd13,\n 'svc:create:docker:s3': Cmd14,\n 'svc:create:local:s3': Cmd15,\n};\n"],"names":["GlobalFlags","Flags","ImageFlag","VersionFlag","ArchFlag","LicenseFlags","AddressesFlags","S3AddressesFlags","StorageFlag","MinioPresignHostFlag","MountFlag","PlLogFileFlag","PlWorkdirFlag","PlBinaryFlag","PlSourcesFlag","ConfigFlag","StorageWorkPathFlag","StoragePrimaryURLFlag","StorageLibraryURLFlag","AuthEnabledFlag","HTPasswdFileFlag","LDAPAddressFlag","LDAPDefaultDNFlag","AuthFlags","askYN","prompt","readlineSync","assertNever","n","createLogger","level","winston","message","indent","messageJson","indentedMessage","line","index","l","randomStr","len","randomBytes","resolveTilde","p","path","os","ensureDir","options","fs","getProcessName","pid","execSync","command","lines","getDockerComposeInfo","serviceName","result","report","st","blockPlatformsToChoose","allPlatforms","CreateBlockPlatforms","z","CreateBlockOptions","createBlock","logger","npmOrgName","orgName","blockName","softwarePlatforms","askForOptions","targetPath","downloadAndUnzip","platformsToRemove","noPlatforms","removePlatform","removePlatformsCompletely","replaceRegexInAllFiles","needSoftware","url","pathInArchive","outputPath","content","tmpDir","tmpFile","f","Writable","createWriteStream","tmpRepo","decompress","dir","platform","deleteRegexInFile","replaceInFile","json","patterns","files","getAllFiles","from","to","fPath","replaceRegexInFile","replacer","newContent","what","_CreateBlock","Command","flags","util.createLogger","block.createBlock","__publicField","cmdOpts.GlobalFlags","CreateBlock","resolve","assets","readFileSync","plImageTag","version","getDefaultPlVersion","_State","stateDir","stateFile","pkg.readFileSync","name","iName","instanceInfoFile","jsonInfo","instanceName","info","oldInfo","instance","i","util.getDockerComposeInfo","isValidPID","util.assertNever","State","processName","util.getProcessName","state","runCommands","cmds","buffers","children","cmd","opts","child","run","runSync","args","_a","spawn","exitAfterChild","sigintHandler","code","spawnSync","render","composeSource","composeDest","deployName","services","composeSrcData","compose","YAML","svcName","svcSpec","envSpecI","envName","last","envValue","mount","emptyS3Settings","id","emptyFSSettings","storageSettingsFromURL","storageURL","baseDir","defaults","bucketName","region","keyPrefix","loadDefaults","jwtKey","localRoot","log","_b","grpc","_c","defaultBool","_e","_d","_g","_f","_i","_h","_k","_j","_l","core","_n","_m","_p","_o","primary","defaultStorageSettings","_q","work","_s","_r","types.emptyFSSettings","_u","_t","_w","_v","library","_x","monitoring","_y","_z","debug","_A","_B","license","_C","_D","storageID","defaultLocation","defaultBucket","storage","types.emptyS3Settings","disableMon","disableDbg","libraryDownloadable","miLicenseSecret","v","def","OSes","archiveOS","osName","Arches","archiveArch","archName","arch","downloadArchive","showProgress","archiveName","downloadURL","archiveFilePath","request","https","reject","response","err","totalBytes","downloadedBytes","archive","chunk","progress","extractArchive","binaryDirName","archivePath","targetDir","trimExtension","msg","tar","getBinary","binaryPath","filename","lastDotIndex","Core","runInfo","run.runCommands","checkRunError","iToStop","plBinaryPath","platforma.binaryPath","configPath","workdir","plCfg.storageSettingsFromURL","configOptions","plCfg.loadDefaults","storageDirs","drv","pkg.assets","plCfg.render","upCommands","minioPort","minioRunCmd","composeSrc","composeMinio","composeCfg.render","image","util.ensureDir","minioConsolePort","envs","composeS3Path","pkg.plImageTag","storagePath","s","storageDir","logFilePath","presignHost","dbFSPath","workFSPath","usersFSPath","composeDstPath","backendMounts","mnt","composeFSPath","primaryFSPath","libraryFSPath","removeWarns","instancesToDrop","warnMessage","util.askYN","authDrivers","jwtFile","encoding","lastJwt","util.randomStr","value","file","sType","column","t","buffer","_Reset","Reset","_Start","Start","_Stop","Stop","authEnabled","authOptions","mounts","platformOverride","cmdOpts.AddressesFlags","cmdOpts.ImageFlag","cmdOpts.VersionFlag","cmdOpts.ArchFlag","cmdOpts.AuthFlags","cmdOpts.LicenseFlags","cmdOpts.MountFlag","cmdOpts.StorageFlag","cmdOpts.StoragePrimaryURLFlag","cmdOpts.StorageWorkPathFlag","cmdOpts.StorageLibraryURLFlag","logFile","listenGrpc","listenMon","listenDbg","startOptions","platforma.getBinary","cmdOpts.PlBinaryFlag","cmdOpts.PlSourcesFlag","cmdOpts.ConfigFlag","cmdOpts.PlLogFileFlag","cmdOpts.PlWorkdirFlag","_Delete","Args","Delete","_Down","Down","_List","instances","currentInstance","statusReport","List","_Up","results","Up","cmdOpts.MinioPresignHostFlag","cmdOpts.S3AddressesFlags","_Docker","Docker","createOptions","_S3","S3","_Local","Local","COMMANDS","Cmd0","Cmd1","Cmd2","Cmd3","Cmd4","Cmd5","Cmd6","Cmd7","Cmd8","Cmd9","Cmd10","Cmd11","Cmd12","Cmd13","Cmd14","Cmd15"],"mappings":"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"}
|