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
JavaScript
"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