UNPKG

hzn-cli

Version:

Open Horizon CLI toolkit helps streamline the process of preparing node agents and perform tasks between orgs environments

1,057 lines 131 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Utils = exports.promptSync = void 0; const fs_1 = require("fs"); const jsonfile_1 = __importDefault(require("jsonfile")); const os_1 = __importDefault(require("os")); const prompt_1 = __importDefault(require("prompt")); const rxjs_1 = require("rxjs"); const url_1 = require("url"); const _1 = require("."); const interface_1 = require("./interface"); const hzn_model_1 = require("./interface/hzn-model"); const dotenv = require('dotenv'); const cp = require('child_process'), exec = cp.exec; const ifs = os_1.default.networkInterfaces(); exports.promptSync = require('prompt-sync')(); const env = process.env.npm_config_env || 'biz'; const isBoolean = [ 'TOP_LEVEL_SERVICE' ]; const notRequired = [ 'SERVICE_CONTAINER_CREDS', 'MMS_CONTAINER_CREDS', 'OBJECT_FILE', 'OBJECT_ID', 'OBJECT_TYPE', 'HZN_CUSTOM_NODE_ID', 'UPDATE_FILE_NAME', 'SUPPORTED_OS_APPEND', 'SUPPORTED_LINUX_DISTRO_APPEND', 'SUPPORTED_DEBIAN_VARIANTS_APPEND', 'SUPPORTED_DEBIAN_VERSION_APPEND', 'SUPPORTED_DEBIAN_ARCH_APPEND', 'SUPPORTED_REDHAT_VARIANTS_APPEND', 'SUPPORTED_REDHAT_VERSION_APPEND', 'SUPPORTED_REDHAT_ARCH_APPEND', 'DOCKER_REGISTRY', 'DOCKER_TOKEN' ]; const mustHave = [ "SERVICE_NAME", "SERVICE_CONTAINER_NAME", "SERVICE_VERSION", "SERVICE_VERSION_RANGE_UPPER", "SERVICE_VERSION_RANGE_LOWER", "SERVICE_CONTAINER_CREDS", "VOLUME_MOUNT", "MMS_SHARED_VOLUME", "MMS_OBJECT_TYPE", "MMS_OBJECT_ID", "MMS_OBJECT_FILE", "MMS_CONTAINER_CREDS", "MMS_CONTAINER_NAME", "MMS_SERVICE_NAME", "MMS_SERVICE_VERSION", "MMS_SERVICE_FALLBACK_VERSION", "UPDATE_FILE_NAME", "SERVICE_CONSTRAINTS" ]; // ToDo: use configTemplate instead const credentialVars = [ "HZN_EXCHANGE_USER_AUTH", "HZN_EXCHANGE_URL", "HZN_FSS_CSSURL", "ANAX" ]; class Utils { constructor() { this.etcDefault = '/etc/default'; this.etcHorizon = '/etc/horizon'; this.homePath = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME']; this.hznConfig = `${this.homePath}/hzn-config`; this.configJson = {}; } init() { } invalidTemplate(json) { let matched = true; const envHzn = interface_1.configTemplate.envHzn; Object.keys(json).some((key) => { Object.keys(envHzn[interface_1.keyMap[key]]).some((skey) => { matched = json[key][skey] != undefined ? true : false; if (mustHave[skey] && !matched) { console.log(`Invalid: Missing ${skey}`); } return !matched; }); return !matched; }); return matched; } randomString() { return Math.random().toString(36).slice(2); } preInstallHznCli(orgId, anax, nodeId, css, token) { return new rxjs_1.Observable((observer) => { this.installPrereq() .subscribe({ complete: () => { console.log('am i here', anax, nodeId, css, typeof css, token); this.installHznCli(anax, nodeId, css, token) .subscribe({ complete: () => { this.getDeviceArch() .subscribe({ complete: () => { this.createHznKey(orgId, this.randomString()) .subscribe({ complete: () => { observer.complete(); }, error: (err) => { observer.error(err); } }); }, error: (err) => { observer.complete(); } }); }, error: (err) => { observer.error(err); } }); }, error: (err) => { console.log('am i here'); observer.error(err); } }); }); } createHorizonSystemFiles(configJson) { return new rxjs_1.Observable((observer) => { let content = ''; const pEnv = process.env; Object.keys(interface_1.HorizonTemplate).forEach((key) => { console.log(key); if (content.length > 0) content += '\n'; if (pEnv[key]) { if (key == 'HZN_MGMT_HUB_CERT_PATH') { const cert = /[^\/]+$/.exec(pEnv.CONFIG_CERT_PATH); if (cert) { content += `${key}=/var/${cert[0]}`; } } else { content += `${key}=${pEnv[key]}`; } } else { if (interface_1.HorizonKeyMap[key]) { pEnv[key] = interface_1.HorizonTemplate[key]; content += `${key}=${pEnv[key]}`; } else if (key == 'HZN_NODE_ID') { content += `${key}=${pEnv.HZN_DEVICE_ID}`; } else if (key == 'HZN_MGMT_HUB_CERT_PATH') { const cert = /[^\/]+$/.exec(pEnv.CONFIG_CERT_PATH); if (cert) { content += `${key}=/var/${cert[0]}`; } } } }); console.log(content); this.shell('sudo rm -f /var/agent-install.crt') .subscribe(() => { if (configJson.test === 'undefined' || !configJson.test) { this.copyFile(`sudo cp ${pEnv.CONFIG_CERT_PATH} /var/agent-install.crt`).then(() => { observer.next(''); observer.complete(); }); } else { if (content.length > 0) { const dest = pEnv['VAR_DIRECTORIES_FILES'] || '/var'; (0, fs_1.writeFileSync)(`${process.cwd()}/horizon`, content); this.copyFile(`sudo mv ${process.cwd()}/horizon /var`).then(() => { const folders = configJson.folders; if ((0, fs_1.existsSync)(pEnv.CONFIG_CERT_PATH) && folders) { const option = process.platform == 'darwin' ? '' : '-u'; this.copyFile(`sudo cp ${option} ${pEnv.CONFIG_CERT_PATH} /var/agent-install.crt`).then(() => { let arg = ''; folders.forEach((folder) => { if (arg.length > 0) { arg += ' && '; } arg += `sudo mkdir -p ${folder} && sudo chmod 766 ${folder}`; }); this.shell(arg) .subscribe({ complete: () => { observer.next(); observer.complete(); }, error: (err) => observer.error(err) }); }); } else { console.log(folders ? `CONFIG_CERT_PATH env var not found.` : `Missing folders property in config.`); observer.error(''); } }); } else { console.log(`Something went wrong, unable to create /var/horizon file`); observer.error(''); } } }); }); } removeCliContainer(name = 'hzn-cli') { return this.stopRemoveContainer(name); } removeAnaxContainer(name = 'horizon1') { return this.stopRemoveContainer(name); } stopRemoveContainer(name) { return this.shell(`docker container stop ${name} && docker container rm ${name}`); } installCliAndAnaxInContainers(configJson) { return new rxjs_1.Observable((observer) => { this.installAnaxInContainer(configJson) .subscribe({ complete: () => { this.installCliInContainer(configJson) .subscribe({ complete: () => observer.complete(), error: (err) => observer.error(err) }); }, error: (err) => observer.error(err) }); }); } installAnaxInContainer(configJson) { return new rxjs_1.Observable((observer) => { this.installPrereq() .subscribe({ complete: () => { this.createHorizonSystemFiles(configJson) .subscribe({ complete: () => { if (configJson.anaxInContainer) { let containerStr = this.replaceEnvTokens(configJson.anaxInContainer, configJson.org); this.shell(containerStr) .subscribe({ complete: () => { observer.complete(); }, error: (err) => { observer.error(err); } }); } else { let pEnv = process.env; let anax = pEnv.ANAX.replace('/agent-install.sh', '') + '/agent-install.sh'; //let container = process.platform == 'darwin' ? '' : '--container' let container = '--container'; let nodeId = pEnv.HZN_NODE_ID || pEnv.HZN_DEVICE_ID || ''; nodeId = nodeId.length > 0 ? `-a ${nodeId}:some-device-token` : ''; //let containerStr = `sudo curl -sSL ${anax} | sudo -s -E bash -s -- -i ${anax} ${container} ${nodeId} -i css: -k css: -c css:` const tarFile = process.platform == 'darwin' ? interface_1.installTar['darwin'] : interface_1.installTar[os_1.default.arch()]; console.log(tarFile, process.cwd()); let containerStr = ''; if (anax && anax.indexOf('open-horizon') > 0) { anax = anax.replace('/agent-install.sh', ''); const arg = `curl -sSL https://github.com/open-horizon/anax/releases/latest/download/${tarFile} -o ${tarFile} && tar -zxvf ${tarFile}`; containerStr = `${arg} && sudo curl -sSL ${anax}/agent-install.sh -o agent-install.sh && sudo chmod +x agent-install.sh && sudo -s -E -b ./agent-install.sh -C`; } else { // anax = api/v1/objects/IBM/agent_files/agent-install.sh/data containerStr = `sudo curl -u "$HZN_ORG_ID/$HZN_EXCHANGE_USER_AUTH" -k -o agent-install.sh $HZN_FSS_CSSURL/${anax} && sudo chmod +x agent-install.sh && sudo -s -E -b ./agent-install.sh -i 'css:' -C`; //containerStr = `curl -sSL https://raw.githubusercontent.com/open-horizon/anax/refs/heads/master/anax-in-container/horizon-container -o agent-install.sh && sudo chmod +x agent-install.sh && ./agent-install.sh -i 'css:' -l 5`; } this.shell(containerStr) .subscribe({ complete: () => { observer.complete(); }, error: (err) => { observer.error(err); } }); } }, error: (err) => { observer.error(err); } }); }, error: (err) => { console.log('am i here'); observer.error(err); } }); }); } installCliInContainer(configJson) { return new rxjs_1.Observable((observer) => { if (configJson.cliInContainer) { let containerStr = this.replaceEnvTokens(configJson.cliInContainer, configJson.org); this.shell(containerStr) .subscribe({ complete: () => { observer.next(); observer.complete(); }, error: (err) => { observer.error(err); } }); } else { console.log('Missing cliInContainer property in configuration file'); observer.error(); } }); } updateConfig(configFile) { return new rxjs_1.Observable((observer) => { try { const pEnv = process.env; let hznJson = JSON.parse((0, fs_1.readFileSync)(`${this.hznConfig}/.env-hzn.json`).toString()); const config = jsonfile_1.default.readFileSync(configFile); if (this.invalidTemplate(config)) { console.log('invalid template, please check your config'); observer.next(''); observer.complete(); } const orgId = config['org']['HZN_ORG_ID']; const envHzn = interface_1.configTemplate.envHzn; const configLocal = config['local']; const envLocal = interface_1.configTemplate.envLocal; const metaVars = config['metaVars'] || {}; Object.keys(metaVars).forEach((key) => { pEnv[key] = metaVars[key]; }); if (!hznJson[orgId]) { hznJson[orgId] = {}; } Object.keys(envHzn).forEach((key) => { if (!hznJson[orgId][key]) { hznJson[orgId][key] = {}; } let obj = envHzn[key]; if (config[interface_1.keyMap[key]]) { console.log('$$$', orgId, key); Object.keys(obj).forEach((objKey) => { hznJson[orgId][key][objKey] = config[interface_1.keyMap[key]][objKey] ? config[interface_1.keyMap[key]][objKey] : obj[objKey]; pEnv[objKey] = config[interface_1.keyMap[key]][objKey]; }); //Object.keys(config[keyMap[key]]).forEach((configKey) => { // let value = envHzn[key][configKey]; // console.log(value, configKey) // if(value && value.length >= 0) { // console.log('!!!',configKey, value, hznJson[orgId][key][configKey]) // hznJson[orgId][key][configKey] = config[keyMap[key]][configKey] ? config[keyMap[key]][configKey] : value // console.log('!!',configKey, value, hznJson[orgId][key][configKey]) // } // pEnv[configKey] = config[keyMap[key]][configKey] //}) Object.keys(config[interface_1.keyMap[key]]).forEach(objKey => { //if(!hznJson[orgId][key][objKey]) { // hznJson[orgId][key][objKey] = config[keyMap[key]][objKey] ? config[keyMap[key]][objKey] : obj[objKey] //} if (!pEnv[objKey]) { pEnv[objKey] = config[interface_1.keyMap[key]][objKey]; } }); } //Object.keys(obj).forEach(objKey => { // if(!hznJson[orgId][key][objKey]) { // hznJson[orgId][key][objKey] = config[keyMap[key]][objKey] ? config[keyMap[key]][objKey] : obj[objKey] // } // pEnv[objKey] = hznJson[orgId][key][objKey] //}); // Object.keys(obj).forEach((objKey) => { // hznJson[orgId][key][objKey] = config[keyMap[key]][objKey] ? config[keyMap[key]][objKey] : obj[objKey] // pEnv[objKey] = hznJson[orgId][key][objKey] // }) }); jsonfile_1.default.writeFileSync('.env-hzn.json', hznJson, { spaces: 2 }); this.copyFile(`sudo mv .env-hzn.json ${this.hznConfig}/.env-hzn.json && sudo chmod 644 ${this.hznConfig}/.env-hzn.json`).then(() => { console.log(`config files updated for ${orgId}`); this.configJson = config; let content = ''; Object.keys(envLocal).forEach((key) => { if (content.length > 0) { content += '\n'; } content += interface_1.HorizonKeyMap[key] ? `${key}=${pEnv[interface_1.HorizonKeyMap[key]]}` : pEnv[key] ? `${key}=${pEnv[key]}` : configLocal && configLocal[key] ? `${key}=${configLocal[key]}` : `${key}=${envLocal[key]}`; }); (0, fs_1.writeFileSync)('.env-local', content); this.copyFile(`sudo mv .env-local ${this.hznConfig}/.env-local && sudo chmod 644 ${this.hznConfig}/.env-local`).then(() => { observer.next(config); observer.complete(); }); }); } catch (e) { console.log(e); observer.error(e); } }); } proceedWithAutoInstall(params, setup, purge = true) { return new rxjs_1.Observable((observer) => { console.log('proceedWithAutoInstall', setup); this.purgeManagementHub(purge) // Leverage this function to cleanup and install prerequisites, maynot need preInstallHznCli anymore .subscribe({ complete: () => { const pEnv = process.env; let action = {}; if (setup != interface_1.SetupEnvironment.autoSetupContainer && setup != interface_1.SetupEnvironment.autoSetupOpenHorizonMesh && setup != interface_1.SetupEnvironment.autoSetupAllInOne) { action['preReq'] = this.preInstallHznCli(pEnv.HZN_ORG_ID, pEnv.ANAX, pEnv.HZN_DEVICE_ID, pEnv.HZN_CSS, pEnv.HZN_DEVICE_TOKEN); } switch (setup) { case interface_1.SetupEnvironment.autoSetup: //action = this.preInstallHznCli(pEnv.HZN_ORG_ID, pEnv.ANAX, pEnv.HZN_DEVICE_ID, pEnv.HZN_CSS, pEnv.HZN_DEVICE_TOKEN) break; case interface_1.SetupEnvironment.autoSetupCliOnly: action[setup] = this.installCliOnly(pEnv.ANAX); break; case interface_1.SetupEnvironment.autoSetupAnaxInContainer: action[setup] = this.installAnaxInContainer(this.configJson); break; case interface_1.SetupEnvironment.autoSetupCliInContainer: action[setup] = this.installCliInContainer(this.configJson); break; case interface_1.SetupEnvironment.autoSetupContainer: action[setup] = this.installCliAndAnaxInContainers(this.configJson); break; case interface_1.SetupEnvironment.autoSetupAllInOne: action[setup] = this.setupManagementHub(); break; case interface_1.SetupEnvironment.autoSetupOpenHorizonMesh: action[setup] = this.setupOpenHorizonMesh(params, pEnv.ANAX); break; } (0, rxjs_1.forkJoin)(action) .subscribe({ next: (msg) => console.log('next here'), complete: () => { console.log('done installing hzn cli.'); observer.complete(); }, error: (err) => { console.log('err here'); observer.error(err); } }); }, error: (err) => observer.error(err) }); }); } autoRun(params, setup) { return new rxjs_1.Observable((observer) => { const configFile = params.configFile; if (!configFile || configFile.length == 0 || !(0, fs_1.existsSync)(configFile)) { observer.next('Please provide --config_file name'); observer.complete(); } else if (setup == interface_1.SetupEnvironment.autoSetupAllInOne || setup == interface_1.SetupEnvironment.autoSetupCliInContainer || setup == interface_1.SetupEnvironment.autoSetupAnaxInContainer || setup == interface_1.SetupEnvironment.autoSetupContainer || setup == interface_1.SetupEnvironment.autoSetupOpenHorizonMesh) { const purge = setup != interface_1.SetupEnvironment.autoSetupOpenHorizonMesh; let configJson; console.log('autoRun', setup); this.updateConfig(configFile) .subscribe({ next: (json) => { configJson = json; }, complete: () => { const config = jsonfile_1.default.readFileSync(configFile); const pEnv = process.env; const org = config.org; Object.keys(org).forEach((key) => { pEnv[key] = org[key]; }); this.proceedWithAutoInstall(params, setup, purge) .subscribe({ complete: () => { observer.next(''); observer.complete(); }, error: (err) => observer.error(err) }); } }); } else if (setup == interface_1.SetupEnvironment.autoUpdateConfigFiles) { let configJson; this.updateConfig(configFile) .subscribe({ next: (json) => { configJson = json; }, complete: () => { try { if (configJson.register && configJson.register.policy) { let arg = ''; let policy = configJson.register.policy; if (typeof policy !== 'string') { policy = JSON.stringify(configJson.register.policy); policy = policy.replace(/\"/g, '\\"'); } else { policy = policy.replace(/\\/g, ''); policy = policy.replace(/\"/g, '\\"'); } this.registerOnly() .subscribe({ complete: () => { this.updateNodePolicyFromStdin(policy) .subscribe({ complete: () => { observer.next(''); observer.complete(); }, error: (err) => observer.error(err) }); }, error: (err) => observer.error(err) }); } else { observer.next(''); observer.complete(); } } catch (e) { observer.error(e); } }, error: (err) => observer.error(err) }); } else { this.updateConfig(configFile) .subscribe({ next: (json) => this.configJson = json, complete: () => { const pEnv = process.env; const arg = 'hzn version'; this.shell(arg) .subscribe({ next: (msg) => { let answer = ''; console.log('hzn is already installed, please uninstallHorizon first.'); this.uninstallHorizon('Would you like to proceed to reinstall Horzion: Y/n?') .subscribe({ next: (resp) => answer = resp, complete: () => { if (answer === 'Y') { this.proceedWithAutoInstall(params, setup) .subscribe({ complete: () => { observer.next(''); observer.complete(); }, error: (err) => observer.error(err) }); } else { observer.next(''); observer.complete(); } }, error: (err) => { observer.next(''); observer.complete(); } }); }, error: (err) => { this.proceedWithAutoInstall(params, setup) .subscribe({ complete: () => { observer.next(''); observer.complete(); }, error: (err) => observer.error(err) }); } }); }, error: (err) => observer.error(err) }); } }); } setEnvFromEnvLocal() { const localEnv = dotenv.parse((0, fs_1.readFileSync)(`${this.hznConfig}/.env-local`)); const pEnv = process.env; for (let i in localEnv) { if (i == 'DEFAULT_ORG') { pEnv['HZN_ORG_ID'] = localEnv[i]; } else { pEnv[i] = localEnv[i]; } } } setEnvFromConfig(configFile) { return new rxjs_1.Observable((observer) => { let config = `${this.hznConfig}/.env-hzn.json`; if (configFile && configFile.length > 0 && !(0, fs_1.existsSync)(configFile)) { observer.error('Please provide --config_file name or leave out --config_file to use the default configuration.'); } else if (!configFile || configFile.length == 0) { console.log('using default config file'); } else { config = configFile; } let hznJson = JSON.parse((0, fs_1.readFileSync)(config).toString()); const pEnv = process.env; const org = pEnv['HZN_ORG_ID']; if (org) { const envVars = hznJson[org]['envVars']; for (const [key, value] of Object.entries(envVars)) { if (!pEnv[key]) { // @ts-ignore pEnv[key] = value.replace(/\r?\n|\r/g, ''); } // console.log(`${key}: ${pEnv[key]}`); } Object.keys(org).forEach((key) => { pEnv[key] = org[key]; }); observer.next('Env vars all set.'); observer.complete(); } else { observer.error('Default org not set.'); } }); } getTopLevelPatternName() { const pEnv = process.env; return `pattern-${pEnv.MMS_SERVICE_NAME}-${pEnv.ARCH}`; let name = this.getByKey(`${_1.utils.getHznConfig()}/services/top-level-service/service.pattern.json`, 'name'); } getArch() { return new rxjs_1.Observable((observer) => { const pEnv = process.env; if (!pEnv.ARCH) { let arg = `hzn architecture`; exec(arg, { maxBuffer: 1024 * 2000 }, (err, stdout, stderr) => { if (!err) { pEnv.ARCH = stdout.replace(/\r?\n|\r/g, ''); observer.next(pEnv.ARCH); observer.complete(); } else { console.log('failed to identify arch'); observer.error(err); } }); } else { observer.next(pEnv.ARCH); observer.complete(); } }); } getByKey(file, key) { let value = undefined; try { if ((0, fs_1.existsSync)(file)) { let json = JSON.parse((0, fs_1.readFileSync)(file).toString()); Object.keys(json).some((k) => { if (k === key) { value = json[k]; } return k === key; }); } } catch (e) { console.log(e); } return value; } autoCommand(params, command) { return new rxjs_1.Observable((observer) => { this.setEnvFromEnvLocal(); this.getArch() .subscribe({ complete: () => { this.setEnvFromConfig(params.configFile) .subscribe({ next: (data) => console.log(data), complete: () => { let action; switch (command) { case interface_1.AutoCommand.autoRegisterWithPolicy: action = _1.utils.registerWithPolicy('', this.getPolicyJson(interface_1.policyType.nodePolicy), true); break; case interface_1.AutoCommand.autoRegisterWithPattern: action = _1.utils.registerWithPattern(this.getTopLevelPatternName(), this.getPolicyJson(interface_1.policyType.nodePolicy), true); break; case interface_1.AutoCommand.autoUnregister: action = _1.utils.unregisterAgent(true); break; case interface_1.AutoCommand.autoListPolicy: action = _1.utils.listPolicy(); break; case interface_1.AutoCommand.autoUpdateNodePolicy: try { let policy = params.object; let policyStr = ''; if (typeof policy !== 'string') { policyStr = JSON.stringify(policy); policy = policyStr.replace(/\"/g, '\\"'); } else { policyStr = policy.replace(/\\/g, ''); policyStr = policyStr.replace(/\"/g, '\\"'); } action = _1.utils.updateNodePolicyFromStdin(`${policyStr}`); } catch (e) { } break; } if (action) { action .subscribe({ next: (msg) => console.log('msg'), complete: () => { console.log('Autocommand completed'); observer.complete(); }, error: (err) => { console.log('err here'); observer.error(err); } }); } else { observer.error('AutoCommand not found'); } }, error: (err) => observer.error(err) }); }, error: (err) => observer.error(err) }); }); } autoListPolicy(params) { return this.autoCommand(params, interface_1.AutoCommand.autoListPolicy); } autoUpdateNodePolicy(params) { return this.autoCommand(params, interface_1.AutoCommand.autoUpdateNodePolicy); } autoRegisterWithPolicy(params) { return this.autoCommand(params, interface_1.AutoCommand.autoRegisterWithPolicy); } autoRegisterWithPattern(params) { return this.autoCommand(params, interface_1.AutoCommand.autoRegisterWithPattern); } autoUnregister(params) { return this.autoCommand(params, interface_1.AutoCommand.autoUnregister); } replaceEnvTokens(input, tokens) { let envTokens = {}; Object.keys(tokens).forEach((key) => { envTokens[key] = process.env[key]; }); this.tokenReplace(input, envTokens); return input; } autoSetup(params) { return this.autoRun(params, interface_1.SetupEnvironment.autoSetup); } autoSetupCliOnly(params) { return this.autoRun(params, interface_1.SetupEnvironment.autoSetupCliOnly); } autoSetupAnaxInContainer(params) { return this.autoRun(params, interface_1.SetupEnvironment.autoSetupAnaxInContainer); } autoSetupCliInContainer(params) { return this.autoRun(params, interface_1.SetupEnvironment.autoSetupCliInContainer); } autoSetupContainer(params) { return this.autoRun(params, interface_1.SetupEnvironment.autoSetupContainer); } autoSetupAllInOne(params) { return this.autoRun(params, interface_1.SetupEnvironment.autoSetupAllInOne); } autoUpdateConfigFiles(params) { return this.autoRun(params, interface_1.SetupEnvironment.autoUpdateConfigFiles); } autoSetupOpenHorizonMesh(params) { return this.autoRun(params, interface_1.SetupEnvironment.autoSetupOpenHorizonMesh); } getEtcDefault() { return this.etcDefault; } getHznConfig() { return this.hznConfig; } listAgreement(param) { const arg = `${param.watch} hzn agreement list`; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } listService(param) { return new rxjs_1.Observable((observer) => { this.listAllServices(param) .subscribe({ next: (res) => { const pEnv = process.env; let services = res.replace(/\r?\n|\r|\[|\]|"/g, '').split(','); let filter = param.filter && param.filter.length > 0 ? param.filter : pEnv.ARCH; let archFilter = services.filter((r) => r.indexOf(filter) > 0); if (archFilter.length < services.length) { console.log(`Services for ${filter}:\n${archFilter.join(',\n')}`); } observer.next(''); observer.complete(); }, error: (err) => observer.error(err) }); }); } removeService(name) { return new rxjs_1.Observable((observer) => { const arg = `yes | hzn exchange service remove ${name}`; const msg = `\nAre you sure you want to remove ${name} service from the Horizon Exchange? [y/N]:`; this.areYouSure(arg, msg) .subscribe({ complete: () => { observer.complete(); }, error: (err) => observer.error(err) }); }); } listAllServices(param) { const arg = param.name.length > 0 ? `hzn exchange service list ${param.name} --org ${param.org}` : `hzn exchange service list --org ${param.org}`; return param.name.length > 0 ? this.shell(arg, 'commande executed successfully', 'failed to execute command', false) : this.shell(arg); } listPattern(name) { const arg = name.length > 0 ? `hzn exchange pattern list ${name}` : 'hzn exchange pattern list'; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } listNode(param) { const arg = 'hzn node list'; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } listNodes(param) { const arg = 'hzn exchange node list'; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } listOrg(param) { const arg = 'hzn exchange org list'; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } listExchangeNode(param) { const arg = param.name.length > 0 ? `hzn exchange node list ${param.name}` : 'hzn exchange node list'; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } listPolicy() { const arg = 'hzn policy list'; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } listExchangeNodePolicy(param) { const arg = `hzn exchange node listpolicy ${param.name}`; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } listServicePolicy(name) { const arg = `hzn exchange service listpolicy ${name}`; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } listDeploymentPolicy(name) { const arg = name.length > 0 ? `hzn exchange deployment listpolicy ${name}` : 'hzn exchange deployment listpolicy'; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } removeDeploymentPolicy(name) { return new rxjs_1.Observable((observer) => { const arg = `yes | hzn exchange deployment removepolicy ${name}`; const msg = `\nAre you sure you want to remove ${name} deployment policy from the Horizon Exchange? [y/N]:`; this.areYouSure(arg, msg) .subscribe({ complete: () => { observer.complete(); }, error: (err) => observer.error(err) }); }); } removeServicePolicy(name) { //hzn exchange service removepolicy chunk-saved-model-service_1.0.0_amd64 return new rxjs_1.Observable((observer) => { const arg = `yes | hzn exchange service removepolicy ${name}`; const msg = `\nAre you sure you want to remove ${name} service policy from the Horizon Exchange? [y/N]:`; this.areYouSure(arg, msg) .subscribe({ complete: () => { observer.complete(); }, error: (err) => observer.error(err) }); }); } deployCheck(name, nodeName) { //hzn deploycheck all -b policy-chunk-saved-model-service_amd64 -n biz/jeff-work-vm const arg = `hzn deploycheck all -b ${name} -n ${nodeName}`; return this.shell(arg, 'commande executed successfully', 'failed to execute command', false); } areYouSure(arg, msg) { return new rxjs_1.Observable((observer) => { console.log(msg); prompt_1.default.get({ name: 'answer', required: true }, (err, question) => { if (question.answer.toUpperCase() === 'Y') { this.shell(arg) .subscribe({ complete: () => { observer.complete(); }, error: (err) => observer.error(err) }); } else { observer.complete(); } }); }); } removeNode(name) { return new rxjs_1.Observable((observer) => { const arg = `yes | hzn exchange node remove ${name}`; const msg = `\nAre you sure you want to remove node ${name} from the Horizon Exchange? [y/N]:`; this.areYouSure(arg, msg) .subscribe({ complete: () => { observer.complete(); }, error: (err) => observer.error(err) }); }); } listObject(param) { const arg = param.name.length > 0 ? `${param.watch}hzn mms object list ${param.name}` : `${param.watch}hzn mms object list -t ${param.objectType} -i ${param.objectId} -d`; return _1.utils.shell(arg, 'done listing object', 'failed to list object', false); } removeObject(param) { return new rxjs_1.Observable((observer) => { const object = `--type=${param.objectType} --id=${param.objectId}`; const arg = `yes | hzn mms object delete ${object}`; const msg = `\nAre you sure you want to remove object with ${object} from MMS? [y/N]:`; this.areYouSure(arg, msg) .subscribe({ complete: () => { observer.complete(); }, error: (err) => observer.error(err) }); }); } createHznKey(org, id) { if (org && id) { return this.shell(`hzn key create ${org} ${id} -f`); } else { console.log('please provide both <YOUR_DOCKERHUB_ID> and <HZN_ORG_ID> in .env-hzn.json'); return (0, rxjs_1.of)(); } } checkConfigState() { const arg = `hzn node list | jq '.configstate.state,.organization,.configuration.exchange_api,.configuration.mms_api'`; return this.shell(arg, 'check node configure state', 'failed to execute', true); } listNodePattern() { return this.shell(`hzn node list | jq .pattern`); } getDeviceArch() { return this.shell(`hzn architecture`); } checkOS() { return this.shell(`cat /etc/os-release`); } getIpAddress() { return Object.keys(ifs) .map(x => [x, ifs[x].filter(x => x.family === 'IPv4')[0]]) .filter(x => x[1]) .map(x => x[1].address); } aptUpdate() { // TODO, if failed run sudo apt-get -y --fix-missing full-upgrade // cat info.cfg return this.shell(`sudo apt-get -y update && sudo apt-get -yq install jq curl git`); } installPrereq() { console.log('platform = ', process.platform); if (process.platform == 'darwin') { return (0, rxjs_1.of)('MacOS...'); } return new rxjs_1.Observable((observer) => { this.aptUpdate() .subscribe({ complete: () => { console.log('am i here'); observer.complete(); }, error: () => observer.complete() // Ignore errors }); }); } clearUnconfiguring() { const arg = `docker exec horizon1 rm -rf /var/horizon/anax.db`; return this.shell(arg); } purgeManagementHub(purge) { if (purge && (os_1.default.arch() == 'x64')) { // TODO: darwin not supported const arg = `curl -sSL https://raw.githubusercontent.com/open-horizon/devops/master/mgmt-hub/deploy-mgmt-hub.sh --output deploy-mgmt-hub.sh && chmod +x deploy-mgmt-hub.sh && sudo ./deploy-mgmt-hub.sh -PS && sudo rm -rf /tmp/horizon-all-in-1`; return this.shell(arg); } else { console.log('not supported yet.'); return (0, rxjs_1.of)(); } } cleanUp() { console.log('cleaning up', (0, fs_1.existsSync)(`${this.etcDefault}/horizon`), (0, fs_1.existsSync)(this.etcHorizon), this.etcHorizon); let arg = (0, fs_1.existsSync)(`${process.cwd()}/agent-install.cfg`) ? `sudo rm ${process.cwd()}/agent-install.* -f -y || true && ` : ''; arg += (0, fs_1.existsSync)(this.etcHorizon) ? `sudo rm -rf ${this.etcHorizon} -y || true && ` : ''; arg += (0, fs_1.existsSync)(`${this.etcDefault}/horizon`) ? `sudo rm ${this.etcDefault}/horizon || true && ` : ''; arg += (0, fs_1.existsSync)(`${this.homePath}/.hzn`) ? `sudo rm -rf ${this.homePath}/.hzn -y || true && ` : ''; arg += (0, fs_1.existsSync)(`/var/tmp/horizon`) ? `sudo rm -rf /var/tmp/horizon -y || true && ` : ''; arg += ':'; return this.shell(arg); } uninstallK3s(msg = 'Would you like to uninstall K3S? Y/n ') { return new rxjs_1.Observable((observer) => { console.log(`\n${msg}`); prompt_1.default.get({ name: 'answer', required: true }, (err, question) => { if (question.answer.toUpperCase() === 'Y') { this.shell(`sudo systemctl stop k3s && /usr/local/bin/k3s-uninstall.sh`) .subscribe(() => { observer.next(); observer.complete(); }); } else { observer.next(); observer.complete(); } }); }); } unregisterMeshAgent(params, msg = 'Would you like to unregister this Mesh agent? Y/n ') { return new rxjs_1.Observable((observer) => { console.log(`\n${msg}`); prompt_1.default.get({ name: 'answer', required: true }, (err, question) => { if (question.answer.toUpperCase() === 'Y') { const pEnv = process.env; console.log(pEnv.HZN_ORG_ID, pEnv.HZN_EXCHANGE_USER_AUTH); //curl -sL --insecure -u "Tenant3_Corp/ohus