diff --git a/src/cli/base-cli-handler.js b/src/cli/base-cli-handler.js index 7e8f17697..6b6e2c616 100644 --- a/src/cli/base-cli-handler.js +++ b/src/cli/base-cli-handler.js @@ -11,13 +11,13 @@ * */ -const commandLineArgs = require('command-line-args') -const commandLineUsage = require('command-line-usage') +const commandLineArgs = require('command-line-args'); +const commandLineUsage = require('command-line-usage'); class CLIHandler { constructor() { - this.commandDefinitions = [] - this.commands = {} + this.commandDefinitions = []; + this.commands = {}; this.name = '' } @@ -36,14 +36,14 @@ class CLIHandler { header: key, optionList: this.commandDefinitions, group: [key], - })) + })); const commandsList = { header: 'Command List', content: Object.keys(this.commands).map((key) => ({ name: key, summary: this.commands[key], })), - } + }; const sections = [ { @@ -52,16 +52,16 @@ class CLIHandler { }, ].concat(hasCommands ? commandsList : []) .concat(showOptions ? options : []) - .concat(additionalSection) + .concat(additionalSection); const usage = [ { header: 'ioFogController', content: 'Fog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2018 Edgeworx, Inc.', } - ].concat(sections) + ].concat(sections); console.log(commandLineUsage(usage)) } } -module.exports = CLIHandler \ No newline at end of file +module.exports = CLIHandler; \ No newline at end of file diff --git a/src/cli/catalog.js b/src/cli/catalog.js index 9a6b50152..155482e72 100644 --- a/src/cli/catalog.js +++ b/src/cli/catalog.js @@ -52,28 +52,93 @@ class Catalog extends BaseCLIHandler { this.name = constants.CMD_CATALOG; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: [constants.CMD] }, - { name: 'file', alias: 'f', type: String, description: 'Catalog item settings JSON file', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'item-id', alias: 'i', type: String, description: 'Catalog item ID', group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO] }, - { name: 'name', alias: 'n', type: String, description: 'Catalog item name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'description', alias: 'd', type: String, description: 'Catalog item description', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'category', alias: 'c', type: String, description: 'Catalog item category', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'x86-image', alias: 'x', type: String, description: 'x86 docker image name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'arm-image', alias: 'a', type: String, description: 'ARM docker image name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'publisher', alias: 'p', type: String, description: 'Catalog item publisher name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'disk-required', alias: 's', type: Number, description: 'Amount of disk required to run the microservice (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'ram-required', alias: 'r', type: Number, description: 'Amount of RAM required to run the microservice (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'picture', alias: 't', type: String, description: 'Catalog item picture', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'public', alias: 'P', type: Boolean, description: 'Public catalog item', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'private', alias: 'V', type: Boolean, description: 'Private catalog item', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'registry-id', alias: 'g', type: Number, description: 'Catalog item docker registry ID', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'input-type', alias: 'I', type: String, description: 'Catalog item input type', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'input-format', alias: 'F', type: String, description: 'Catalog item input format', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'output-type', alias: 'O', type: String, description: 'Catalog item output type', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'output-format', alias: 'T', type: String, description: 'Catalog item output format', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'config-example', alias: 'X', type: String, description: 'Catalog item config example', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'user-id', alias: 'u', type: Number, description: 'User\'s id', group: [constants.CMD_ADD] }, - ] + { + name: 'command', defaultOption: true, + group: [constants.CMD] + }, + { + name: 'file', alias: 'f', type: String, description: 'Catalog item settings JSON file', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'item-id', alias: 'i', type: String, description: 'Catalog item ID', + group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO] + }, + { + name: 'name', alias: 'n', type: String, description: 'Catalog item name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'description', alias: 'd', type: String, description: 'Catalog item description', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'category', alias: 'c', type: String, description: 'Catalog item category', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'x86-image', alias: 'x', type: String, description: 'x86 docker image name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'arm-image', alias: 'a', type: String, description: 'ARM docker image name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'publisher', alias: 'p', type: String, description: 'Catalog item publisher name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'disk-required', alias: 's', type: Number, + description: 'Amount of disk required to run the microservice (MB)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'ram-required', alias: 'r', type: Number, + description: 'Amount of RAM required to run the microservice (MB)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'picture', alias: 't', type: String, description: 'Catalog item picture', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'public', alias: 'P', type: Boolean, description: 'Public catalog item', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'private', alias: 'V', type: Boolean, description: 'Private catalog item', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'registry-id', alias: 'g', type: Number, description: 'Catalog item docker registry ID', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'input-type', alias: 'I', type: String, description: 'Catalog item input type', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'input-format', alias: 'F', type: String, description: 'Catalog item input format', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'output-type', alias: 'O', type: String, description: 'Catalog item output type', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'output-format', alias: 'T', type: String, description: 'Catalog item output format', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'config-example', alias: 'X', type: String, description: 'Catalog item config example', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'user-id', alias: 'u', type: Number, description: 'User\'s id', + group: [constants.CMD_ADD] + }, + ]; this.commands = { [constants.CMD_ADD]: 'Add a new catalog item.', [constants.CMD_UPDATE]: 'Update existing catalog item.', @@ -84,27 +149,31 @@ class Catalog extends BaseCLIHandler { } async run(args) { - const catalogCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv}); - - switch (catalogCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(catalogCommand, constants.CMD_ADD, _createCatalogItem, true); - break; - case constants.CMD_UPDATE: - await _executeCase(catalogCommand, constants.CMD_UPDATE, _updateCatalogItem, false); - break; - case constants.CMD_REMOVE: - await _executeCase(catalogCommand, constants.CMD_REMOVE, _deleteCatalogItem, false); - break; - case constants.CMD_LIST: - await _executeCase(catalogCommand, constants.CMD_LIST, _listCatalogItems, false); - break; - case constants.CMD_INFO: - await _executeCase(catalogCommand, constants.CMD_INFO, _listCatalogItem, false); - break; - case constants.CMD_HELP: - default: - return this.help() + try { + const catalogCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (catalogCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(catalogCommand, constants.CMD_ADD, _createCatalogItem, true); + break; + case constants.CMD_UPDATE: + await _executeCase(catalogCommand, constants.CMD_UPDATE, _updateCatalogItem, false); + break; + case constants.CMD_REMOVE: + await _executeCase(catalogCommand, constants.CMD_REMOVE, _deleteCatalogItem, false); + break; + case constants.CMD_LIST: + await _executeCase(catalogCommand, constants.CMD_LIST, _listCatalogItems, false); + break; + case constants.CMD_INFO: + await _executeCase(catalogCommand, constants.CMD_INFO, _listCatalogItem, false); + break; + case constants.CMD_HELP: + default: + return this.help() + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -121,7 +190,7 @@ class Catalog extends BaseCLIHandler { } } -const _executeCase = async function (catalogCommand, commandName, f, isUserRequired) { +const _executeCase = async function (catalogCommand, commandName, f, isUserRequired) { try { const item = catalogCommand[commandName]; diff --git a/src/cli/config.js b/src/cli/config.js index 66511d22c..c8a654279 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -25,19 +25,64 @@ class Config extends BaseCLIHandler { this.name = constants.CMD_CONFIG; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: constants.CMD }, - { name: 'port', alias: 'p', type: Number, description: 'Port', group: constants.CMD_ADD }, - { name: 'ssl-cert', alias: 'c', type: String, description: 'Path to SSL certificate file', group: constants.CMD_ADD }, - { name: 'ssl-key', alias: 'k', type: String, description: 'Path to SSL key file', group: constants.CMD_ADD }, - { name: 'intermediate-cert', alias: 'i', type: String, description: 'Path to SSL intermediate certificate file', group: constants.CMD_ADD }, - { name: 'home-url', alias: 'h', type: String, description: 'Home page url for email activation links', group: constants.CMD_ADD }, - { name: 'email-address', alias: 'a', type: String, description: 'Email address to send activations from', group: constants.CMD_ADD }, - { name: 'email-password', alias: 'w', type: String, description: 'Email password to send activations from', group: constants.CMD_ADD }, - { name: 'email-service', alias: 's', type: String, description: 'Email service to send activations', group: constants.CMD_ADD }, - { name: 'log-dir', alias: 'd', type: String, description: 'Log files directory', group: constants.CMD_ADD }, - { name: 'log-size', alias: 'z', type: Number, description: 'Log files size (MB)', group: constants.CMD_ADD }, - { name: 'on', alias: 'o', type: Boolean, description: 'Enable', group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] }, - { name: 'off', alias: 'f', type: Boolean, description: 'Disable', group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] }, + { + name: 'command', defaultOption: true, + group: constants.CMD + }, + { + name: 'port', alias: 'p', type: Number, description: 'Port', + group: constants.CMD_ADD + }, + { + name: 'ssl-cert', alias: 'c', type: String, + description: 'Path to SSL certificate file', + group: constants.CMD_ADD + }, + { + name: 'ssl-key', alias: 'k', type: String, description: 'Path to SSL key file', + group: constants.CMD_ADD + }, + { + name: 'intermediate-cert', alias: 'i', type: String, + description: 'Path to SSL intermediate certificate file', + group: constants.CMD_ADD + }, + { + name: 'home-url', alias: 'h', type: String, + description: 'Home page url for email activation links', + group: constants.CMD_ADD + }, + { + name: 'email-address', alias: 'a', type: String, + description: 'Email address to send activations from', + group: constants.CMD_ADD + }, + { + name: 'email-password', alias: 'w', type: String, + description: 'Email password to send activations from', + group: constants.CMD_ADD + }, + { + name: 'email-service', alias: 's', type: String, + description: 'Email service to send activations', + group: constants.CMD_ADD + }, + { + name: 'log-dir', alias: 'd', type: String, description: 'Log files directory', + group: constants.CMD_ADD + }, + { + name: 'log-size', alias: 'z', type: Number, + description: 'Log files size (MB)', group: constants.CMD_ADD + }, + { + name: 'on', alias: 'o', type: Boolean, description: 'Enable', + group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] + }, + { + name: 'off', alias: 'f', type: Boolean, description: 'Disable', + group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] + }, ]; this.commands = { [constants.CMD_ADD]: 'Add a new config value.', @@ -48,29 +93,33 @@ class Config extends BaseCLIHandler { } async run(args) { - const configCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv}); - - switch (configCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(configCommand, constants.CMD_ADD, _addConfigOption); - break; - case constants.CMD_LIST: - await _executeCase(configCommand, constants.CMD_LIST, _listConfigOptions); - break; - case constants.CMD_DEV_MODE: - await _executeCase(configCommand, constants.CMD_DEV_MODE, _changeDevModeState); - break; - case constants.CMD_EMAIL_ACTIVATION: - await _executeCase(configCommand, constants.CMD_EMAIL_ACTIVATION, _changeEmailActivationState); - break; - case constants.CMD_HELP: - default: - return this.help([], true, false) + try { + const configCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (configCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(configCommand, constants.CMD_ADD, _addConfigOption); + break; + case constants.CMD_LIST: + await _executeCase(configCommand, constants.CMD_LIST, _listConfigOptions); + break; + case constants.CMD_DEV_MODE: + await _executeCase(configCommand, constants.CMD_DEV_MODE, _changeDevModeState); + break; + case constants.CMD_EMAIL_ACTIVATION: + await _executeCase(configCommand, constants.CMD_EMAIL_ACTIVATION, _changeEmailActivationState); + break; + case constants.CMD_HELP: + default: + return this.help([], true, false) + } + } catch (error) { + AppHelper.handleCLIError(error); } } } -const _executeCase = async function (catalogCommand, commandName, f) { +const _executeCase = async function (catalogCommand, commandName, f) { try { const item = catalogCommand[commandName]; await f(item); @@ -162,7 +211,7 @@ const updateConfig = async function (newConfigValue, cliConfigName, configName, if (newConfigValue) { const oldConfigValue = config.get(configName); if (newConfigValue !== oldConfigValue) { - await fn(function() { + await fn(function () { const currentConfigValue = config.get(configName); logger.info(`Config option ${cliConfigName} has been set to ${currentConfigValue}`); }); @@ -197,7 +246,7 @@ const _listConfigOptions = function () { const _changeDevModeState = function (options) { const enableDevMode = AppHelper.validateBooleanCliOptions(options.on, options.off); - config.set('Server:DevMode', enableDevMode) + config.set('Server:DevMode', enableDevMode); logger.info('Dev mode state updated successfully.') }; diff --git a/src/cli/connector.js b/src/cli/connector.js index a2f76102f..353b698e5 100644 --- a/src/cli/connector.js +++ b/src/cli/connector.js @@ -11,28 +11,65 @@ * */ -const BaseCLIHandler = require('./base-cli-handler') -const constants = require('../helpers/constants') -const logger = require('../logger') -const ConnectorService = require('../services/connector-service') -const AppHelper = require('../helpers/app-helper') + +const BaseCLIHandler = require('./base-cli-handler'); +const constants = require('../helpers/constants'); +const logger = require('../logger'); +const ConnectorService = require('../services/connector-service'); +const AppHelper = require('../helpers/app-helper'); +const CliDecorator = require("../decorators/cli-decorator"); class Connector extends BaseCLIHandler { constructor() { - super() + super(); - this.name = constants.CMD_CONNECTOR + this.name = constants.CMD_CONNECTOR; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: [constants.CMD] }, - { name: 'name', alias: 'n', type: String, description: 'Connector name', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'domain', alias: 'd', type: String, description: 'Connector domain name', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'public-ip', alias: 'i', type: String, description: 'Connector public IP address', group: [constants.CMD_ADD, constants.CMD_UPDATE, constants.CMD_REMOVE] }, - { name: 'cert', alias: 'c', type: String, description: 'Certificate', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'self-signed-on', alias: 'S', type: Boolean, description: 'Switch on self-signed enabled', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'self-signed-off', alias: 's', type: Boolean, description: 'Switch off self-signed disabled', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'dev-mode-on', alias: 'H', type: Boolean, description: 'Switch on dev mode', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'dev-mode-off', alias: 'h', type: Boolean, description: 'Switch off dev mode', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - ] + { + name: 'command', defaultOption: true, + group: [constants.CMD] + }, + { + name: 'name', alias: 'n', type: String, + description: 'Connector name', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'domain', alias: 'd', type: String, + description: 'Connector domain name', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'public-ip', alias: 'i', type: String, + description: 'Connector public IP address', + group: [constants.CMD_ADD, constants.CMD_UPDATE, constants.CMD_REMOVE] + }, + { + name: 'cert', alias: 'c', type: String, + description: 'Certificate', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'self-signed-on', alias: 'S', type: Boolean, + description: 'Switch on self-signed enabled', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'self-signed-off', alias: 's', type: Boolean, + description: 'Switch off self-signed disabled', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'dev-mode-on', alias: 'H', type: Boolean, + description: 'Switch on dev mode', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'dev-mode-off', alias: 'h', type: Boolean, + description: 'Switch off dev mode', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + } + ]; this.commands = { [constants.CMD_ADD]: 'Add a new Connector.', [constants.CMD_UPDATE]: 'Update existing Connector.', @@ -42,24 +79,28 @@ class Connector extends BaseCLIHandler { } async run(args) { - const connectorCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }) - - switch (connectorCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(connectorCommand, constants.CMD_ADD, _createConnector, false) - break - case constants.CMD_UPDATE: - await _executeCase(connectorCommand, constants.CMD_UPDATE, _updateConnector, false) - break - case constants.CMD_REMOVE: - await _executeCase(connectorCommand, constants.CMD_REMOVE, _deleteConnector, false) - break - case constants.CMD_LIST: - await _executeCase(connectorCommand, constants.CMD_LIST, _getConnectorList, false) - break - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + try { + const connectorCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (connectorCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(connectorCommand, constants.CMD_ADD, _createConnector, false); + break; + case constants.CMD_UPDATE: + await _executeCase(connectorCommand, constants.CMD_UPDATE, _updateConnector, false); + break; + case constants.CMD_REMOVE: + await _executeCase(connectorCommand, constants.CMD_REMOVE, _deleteConnector, false); + break; + case constants.CMD_LIST: + await _executeCase(connectorCommand, constants.CMD_LIST, _getConnectorList, false); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -81,10 +122,10 @@ async function _executeCase(commands, commandName, f, isUserRequired) { } async function _createConnector(obj) { - const connector = _createConnectorObject(obj) + const connector = _createConnectorObject(obj); logger.info(JSON.stringify(connector)); try { - const result = await ConnectorService.createConnector(connector) + const result = await ConnectorService.createConnector(connector); logger.info(JSON.stringify(result)); logger.info('Connector has been created successfully.'); } catch (e) { @@ -93,10 +134,10 @@ async function _createConnector(obj) { } async function _updateConnector(obj) { - const connector = _createConnectorObject(obj) + const connector = _createConnectorObject(obj); logger.info(JSON.stringify(connector)); try { - await ConnectorService.updateConnector(connector) + await ConnectorService.updateConnector(connector); logger.info('Connector has been updated successfully.'); } catch (e) { logger.info(e.message) @@ -104,10 +145,10 @@ async function _updateConnector(obj) { } async function _deleteConnector(obj) { - const connector = _createConnectorObject(obj) + const connector = _createConnectorObject(obj); logger.info(JSON.stringify(connector)); try { - await ConnectorService.deleteConnector(connector) + await ConnectorService.deleteConnector(connector); logger.info('Connector has been removed successfully.'); } catch (e) { logger.info(e.message) @@ -115,7 +156,7 @@ async function _deleteConnector(obj) { } async function _getConnectorList(obj) { - const list = await ConnectorService.getConnectorList() + const list = await ConnectorService.getConnectorList(); logger.info(JSON.stringify(list, null, 2)); logger.info('Connector list has been gotten successfully'); } @@ -128,9 +169,9 @@ function _createConnectorObject(cliData) { cert: cliData.cert, isSelfSignedCert: AppHelper.validateBooleanCliOptions(cliData.selfSignedEnable, cliData.selfSignedDisable), devMode: AppHelper.validateBooleanCliOptions(cliData.devModeOn, cliData.devModeOff) - } + }; return AppHelper.deleteUndefinedFields(connectorObj); } -module.exports = new Connector() \ No newline at end of file +module.exports = new Connector(); \ No newline at end of file diff --git a/src/cli/controller.js b/src/cli/controller.js index f76e91b7e..220fa5ad3 100644 --- a/src/cli/controller.js +++ b/src/cli/controller.js @@ -24,8 +24,10 @@ class Controller extends BaseCLIHandler { this.name = constants.CMD_CONTROLLER; this.commandDefinitions = [ { - name: 'command', defaultOption: true, description: 'status, email-activation, fog-types, version', - group: constants.CMD, + name: 'command', + defaultOption: true, + description: 'status, email-activation, fog-types, version', + group: constants.CMD } ]; this.commands = { @@ -37,24 +39,28 @@ class Controller extends BaseCLIHandler { } async run(args) { - const controllerCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv}); + try { + const controllerCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); - switch (controllerCommand.command.command) { - case constants.CMD_STATUS: - await _executeCase(controllerCommand, constants.CMD_STATUS, _getStatus, false); - break; - case constants.CMD_EMAIL_ACTIVATION: - await _executeCase(controllerCommand, constants.CMD_EMAIL_ACTIVATION, _emailActivation, false); - break; - case constants.CMD_FOG_TYPES: - await _executeCase(controllerCommand, constants.CMD_FOG_TYPES, _getFogTypes, false); - break; - case constants.CMD_VERSION: - await _executeCase(controllerCommand, constants.CMD_VERSION, _getVersion, false); - break; - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + switch (controllerCommand.command.command) { + case constants.CMD_STATUS: + await _executeCase(controllerCommand, constants.CMD_STATUS, _getStatus, false); + break; + case constants.CMD_EMAIL_ACTIVATION: + await _executeCase(controllerCommand, constants.CMD_EMAIL_ACTIVATION, _emailActivation, false); + break; + case constants.CMD_FOG_TYPES: + await _executeCase(controllerCommand, constants.CMD_FOG_TYPES, _getFogTypes, false); + break; + case constants.CMD_VERSION: + await _executeCase(controllerCommand, constants.CMD_VERSION, _getVersion, false); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -82,16 +88,16 @@ const _getStatus = async function () { }; const _emailActivation = async function () { - const response = await ControllerService.emailActivation(true); + const response = await ControllerService.emailActivation(true); logger.info(JSON.stringify(response, null, 2)); }; const _getFogTypes = async function () { - const response = await ControllerService.getFogTypes(true); + const response = await ControllerService.getFogTypes(true); logger.info(JSON.stringify(response, null, 2)); }; -const _getVersion = async function() { +const _getVersion = async function () { const response = await ControllerService.getVersion(true); logger.info(response, null, 2); }; diff --git a/src/cli/diagnostics.js b/src/cli/diagnostics.js index a069abb2f..d861dc686 100644 --- a/src/cli/diagnostics.js +++ b/src/cli/diagnostics.js @@ -21,7 +21,7 @@ const AuthDecorator = require('../decorators/cli-decorator'); class Diagnostics extends BaseCLIHandler { constructor() { - super() + super(); this.name = constants.CMD_DIAGNOSTICS; this.commandDefinitions = [ @@ -35,12 +35,12 @@ class Diagnostics extends BaseCLIHandler { }, { name: 'disable', alias: 'o', type: Boolean, description: 'Disable microservice strace', - group: [constants.CMD_STRACE_UPDATE ] + group: [constants.CMD_STRACE_UPDATE] }, { name: 'microservice-id', alias: 'i', type: String, description: 'Microservice ID', group: [constants.CMD_STRACE_UPDATE, constants.CMD_STRACE_INFO, constants.CMD_STRACE_FTP_POST, - constants.CMD_IMAGE_SNAPSHOT_CREATE, constants.CMD_IMAGE_SNAPSHOT_GET] + constants.CMD_IMAGE_SNAPSHOT_CREATE, constants.CMD_IMAGE_SNAPSHOT_GET] }, { name: 'format', alias: 'f', type: String, description: 'Format of strace data to receive', @@ -66,7 +66,7 @@ class Diagnostics extends BaseCLIHandler { name: 'ftpDestDir', alias: 'd', type: String, description: 'FTP destination directory', group: [constants.CMD_STRACE_FTP_POST] }, - ] + ]; this.commands = { [constants.CMD_STRACE_UPDATE]: 'Change microservice strace status to enabled or disabled.', [constants.CMD_STRACE_INFO]: 'Get microservice strace data.', @@ -77,32 +77,36 @@ class Diagnostics extends BaseCLIHandler { } async run(args) { - const diagnosticCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }) - - switch (diagnosticCommand.command.command) { - case constants.CMD_STRACE_UPDATE: - await _executeCase(diagnosticCommand, constants.CMD_STRACE_UPDATE, _changeMicroserviceStraceState, false); - break; - case constants.CMD_STRACE_INFO: - await _executeCase(diagnosticCommand, constants.CMD_STRACE_INFO, _getMicroserviceStraceData, false); - break; - case constants.CMD_STRACE_FTP_POST: - await _executeCase(diagnosticCommand, constants.CMD_STRACE_FTP_POST, _postMicroserviceStraceDataToFtp, false); - break; - case constants.CMD_IMAGE_SNAPSHOT_CREATE: - await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_CREATE, _postMicroserviceImageSnapshotCreate, false); - break; - case constants.CMD_IMAGE_SNAPSHOT_GET: - await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_GET, _getMicroserviceImageSnapshot, false); - break; - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + try { + const diagnosticCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (diagnosticCommand.command.command) { + case constants.CMD_STRACE_UPDATE: + await _executeCase(diagnosticCommand, constants.CMD_STRACE_UPDATE, _changeMicroserviceStraceState, false); + break; + case constants.CMD_STRACE_INFO: + await _executeCase(diagnosticCommand, constants.CMD_STRACE_INFO, _getMicroserviceStraceData, false); + break; + case constants.CMD_STRACE_FTP_POST: + await _executeCase(diagnosticCommand, constants.CMD_STRACE_FTP_POST, _postMicroserviceStraceDataToFtp, false); + break; + case constants.CMD_IMAGE_SNAPSHOT_CREATE: + await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_CREATE, _postMicroserviceImageSnapshotCreate, false); + break; + case constants.CMD_IMAGE_SNAPSHOT_GET: + await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_GET, _getMicroserviceImageSnapshot, false); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } } -const _executeCase = async function (diagnosticCommand, commandName, f, isUserRequired) { +const _executeCase = async function (diagnosticCommand, commandName, f, isUserRequired) { try { const item = diagnosticCommand[commandName]; diff --git a/src/cli/flow.js b/src/cli/flow.js index 77a3f15a1..f577a6e2f 100644 --- a/src/cli/flow.js +++ b/src/cli/flow.js @@ -31,14 +31,45 @@ class Flow extends BaseCLIHandler { this.name = constants.CMD_FLOW; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: [constants.CMD] }, - { name: 'file', alias: 'f', type: String, description: 'Application flow settings JSON file', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'flow-id', alias: 'i', type: String, description: 'Application flow ID', group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO] }, - { name: 'name', alias: 'n', type: String, description: 'Application flow name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'description', alias: 'd', type: String, description: 'Application flow description', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'activate', alias: 'a', type: Boolean, description: 'Activate application flow', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'deactivate', alias: 'D', type: Boolean, description: 'Deactivate application flow', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'user-id', alias: 'u', type: Number, description: 'User\'s id', group: [constants.CMD_ADD] }, + { + name: 'command', defaultOption: true, + group: [constants.CMD] + }, + { + name: 'file', alias: 'f', type: String, + description: 'Application flow settings JSON file', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'flow-id', alias: 'i', type: String, + description: 'Application flow ID', + group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO] + }, + { + name: 'name', alias: 'n', type: String, + description: 'Application flow name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'description', alias: 'd', type: String, + description: 'Application flow description', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'activate', alias: 'a', type: Boolean, + description: 'Activate application flow', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'deactivate', alias: 'D', type: Boolean, + description: 'Deactivate application flow', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'user-id', alias: 'u', type: Number, + description: 'User\'s id', + group: [constants.CMD_ADD] + } ]; this.commands = { [constants.CMD_ADD]: 'Add a new flow.', @@ -50,27 +81,31 @@ class Flow extends BaseCLIHandler { } async run(args) { - const flowCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }); - - switch (flowCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(flowCommand, constants.CMD_ADD, _createFlow, true); - break; - case constants.CMD_UPDATE: - await _executeCase(flowCommand, constants.CMD_UPDATE, _updateFlow, false); - break; - case constants.CMD_REMOVE: - await _executeCase(flowCommand, constants.CMD_REMOVE, _deleteFlow, false); - break; - case constants.CMD_LIST: - await _executeCase(flowCommand, constants.CMD_LIST, _getAllFlows, false); - break; - case constants.CMD_INFO: - await _executeCase(flowCommand, constants.CMD_INFO, _getFlow, false); - break; - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + try { + const flowCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (flowCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(flowCommand, constants.CMD_ADD, _createFlow, true); + break; + case constants.CMD_UPDATE: + await _executeCase(flowCommand, constants.CMD_UPDATE, _updateFlow, false); + break; + case constants.CMD_REMOVE: + await _executeCase(flowCommand, constants.CMD_REMOVE, _deleteFlow, false); + break; + case constants.CMD_LIST: + await _executeCase(flowCommand, constants.CMD_LIST, _getAllFlows, false); + break; + case constants.CMD_INFO: + await _executeCase(flowCommand, constants.CMD_INFO, _getFlow, false); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -152,13 +187,13 @@ const _getFlow = async function (flowData) { function _createFlowObject(data) { const flow = { - id: data.id, - name: data.name, - description: data.description, - isActivated: AppHelper.validateBooleanCliOptions(data.activate, data.deactivate) - }; + id: data.id, + name: data.name, + description: data.description, + isActivated: AppHelper.validateBooleanCliOptions(data.activate, data.deactivate) + }; - return AppHelper.deleteUndefinedFields(flow); + return AppHelper.deleteUndefinedFields(flow); } module.exports = new Flow(); \ No newline at end of file diff --git a/src/cli/index.js b/src/cli/index.js index 9babb2044..a8fea548d 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -11,28 +11,28 @@ * */ -const BaseCLIHandler = require('./base-cli-handler') -const Start = require('./start') -const User = require('./user') -const Connector = require('./connector') -const Config = require('./config') -const Tunnel = require('./tunnel') -const IOFog = require('./iofog') -const Catalog = require('./catalog') -const Flow = require('./flow') -const Microservice = require('./microservice') -const Registry = require('./registry') -const Controller = require('./controller') -const Diagnostics = require('./diagnostics') +const BaseCLIHandler = require('./base-cli-handler'); +const Start = require('./start'); +const User = require('./user'); +const Connector = require('./connector'); +const Config = require('./config'); +const Tunnel = require('./tunnel'); +const IOFog = require('./iofog'); +const Catalog = require('./catalog'); +const Flow = require('./flow'); +const Microservice = require('./microservice'); +const Registry = require('./registry'); +const Controller = require('./controller'); +const Diagnostics = require('./diagnostics'); -const constants = require('../helpers/constants') +const constants = require('../helpers/constants'); class Cli extends BaseCLIHandler { constructor() { - super() + super(); this.commandDefinitions = [ { name: 'command', defaultOption: true }, - ] + ]; this.commands = { [constants.CMD_START]: 'Start iofog-controller service.', [constants.CMD_STOP]: 'Stop iofog-controller service.', @@ -52,36 +52,36 @@ class Cli extends BaseCLIHandler { } run(daemon) { - const mainCommand = this.parseCommandLineArgs(this.commandDefinitions) - const argv = mainCommand._unknown || [] + const mainCommand = this.parseCommandLineArgs(this.commandDefinitions); + const argv = mainCommand._unknown || []; switch (mainCommand.command) { case constants.CMD_START: - return Start.run({ daemon }) + return Start.run({ daemon }); case constants.CMD_STOP: - return daemon.stop() + return daemon.stop(); case constants.CMD_CONTROLLER: - return Controller.run({ argv }) + return Controller.run({ argv }); case constants.CMD_USER: - return User.run({ argv }) + return User.run({ argv }); case constants.CMD_CONFIG: - return Config.run({ argv }) + return Config.run({ argv }); case constants.CMD_CONNECTOR: - return Connector.run({ argv }) + return Connector.run({ argv }); case constants.CMD_TUNNEL: - return Tunnel.run({ argv }) + return Tunnel.run({ argv }); case constants.CMD_IOFOG: - return IOFog.run({ argv }) + return IOFog.run({ argv }); case constants.CMD_CATALOG: - return Catalog.run({ argv }) + return Catalog.run({ argv }); case constants.CMD_FLOW: - return Flow.run({ argv }) + return Flow.run({ argv }); case constants.CMD_MICROSERVICE: - return Microservice.run({ argv }) + return Microservice.run({ argv }); case constants.CMD_REGISTRY: - return Registry.run({ argv }) + return Registry.run({ argv }); case constants.CMD_DIAGNOSTICS: - return Diagnostics.run({ argv }) + return Diagnostics.run({ argv }); case constants.CMD_HELP: default: return this.help([], false) @@ -89,4 +89,4 @@ class Cli extends BaseCLIHandler { } } -module.exports = Cli \ No newline at end of file +module.exports = Cli; \ No newline at end of file diff --git a/src/cli/iofog.js b/src/cli/iofog.js index 2318808fe..64edcca56 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -11,13 +11,13 @@ * */ -const BaseCLIHandler = require('./base-cli-handler') -const constants = require('../helpers/constants') -const logger = require('../logger') +const BaseCLIHandler = require('./base-cli-handler'); +const constants = require('../helpers/constants'); +const logger = require('../logger'); const fs = require('fs'); -const CliDecorator = require('../decorators/cli-decorator') -const AppHelper = require('../helpers/app-helper') -const FogService = require('../services/iofog-service') +const CliDecorator = require('../decorators/cli-decorator'); +const AppHelper = require('../helpers/app-helper'); +const FogService = require('../services/iofog-service'); const JSON_SCHEMA = AppHelper.stringifyCliJsonSchema({ name: "string", @@ -44,40 +44,155 @@ const JSON_SCHEMA = AppHelper.stringifyCliJsonSchema({ class IOFog extends BaseCLIHandler { constructor() { - super() + super(); - this.name = constants.CMD_IOFOG + this.name = constants.CMD_IOFOG; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: [constants.CMD] }, - { name: 'file', alias: 'f', type: String, description: 'ioFog settings JSON file', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'node-id', alias: 'i', type: String, description: 'ioFog node ID', group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO, constants.CMD_PROVISIONING_KEY, constants.CMD_IOFOG_REBOOT, constants.CMD_VERSION, constants.CMD_HAL_HW, constants.CMD_HAL_USB] }, - { name: 'name', alias: 'n', type: String, description: 'ioFog node name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'location', alias: 'l', type: String, description: 'ioFog node location', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'latitude', alias: 't', type: Number, description: 'ioFog node latitude', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'longitude', alias: 'g', type: Number, description: 'ioFog node longitude', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'description', alias: 'd', type: String, description: 'ioFog node description', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'docker-url', alias: 'D', type: String, description: 'ioFog node docker url', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'disk-limit', alias: 'M', type: Number, description: 'ioFog node disk usage limit (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'disk-directory', alias: 'T', type: String, description: 'ioFog node disk directory', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'memory-limit', alias: 'm', type: Number, description: 'ioFog node memory usage limit (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'cpu-limit', alias: 'c', type: Number, description: 'ioFog node CPU usage limit (%)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'log-limit', alias: 'G', type: Number, description: 'ioFog node log size limit (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'log-directory', alias: 'Y', type: String, description: 'ioFog node log files directory', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'log-file-count', alias: 'C', type: Number, description: 'ioFog node log files count', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'status-frequency', alias: 's', type: Number, description: 'ioFog node status check frequency (seconds)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'change-frequency', alias: 'F', type: Number, description: 'ioFog node configuration change check frequency (seconds)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'device-frequency', alias: 'Q', type: Number, description: 'ioFog node device scan frequency (seconds)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'bluetooth-enable', alias: 'B', type: Boolean, description: 'Enable bluetooth on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'bluetooth-disable', alias: 'b', type: Boolean, description: 'Disable bluetooth on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'watchdog-enable', alias: 'W', type: Boolean, description: 'Enable watchdog on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'watchdog-disable', alias: 'w', type: Boolean, description: 'Disable watchdog on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'abs-hw-enable', alias: 'A', type: Boolean, description: 'Enable hardware abstraction on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'abs-hw-disable', alias: 'a', type: Boolean, description: 'Disable hardware abstraction on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'reboot', alias: 'o', type: Boolean, description: 'Reboot ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'fog-type', alias: 'y', type: Number, description: 'ioFog node architecture type', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'version-command', alias: 'v', type: String, description: 'ioFog version command', group: [constants.CMD_VERSION] }, - { name: 'user-id', alias: 'u', type: Number, description: 'User\'s id', group: [constants.CMD_ADD] } - ] + { + name: 'command', defaultOption: true, + group: [constants.CMD]}, + { + name: 'file', alias: 'f', type: String, + description: 'ioFog settings JSON file', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'node-id', alias: 'i', type: String, + description: 'ioFog node ID', + group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO, constants.CMD_PROVISIONING_KEY, + constants.CMD_IOFOG_REBOOT, constants.CMD_VERSION, constants.CMD_HAL_HW, constants.CMD_HAL_USB] + }, + { + name: 'name', alias: 'n', type: String, + description: 'ioFog node name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'location', alias: 'l', type: String, + description: 'ioFog node location', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'latitude', alias: 't', type: Number, + description: 'ioFog node latitude', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'longitude', alias: 'g', type: Number, + description: 'ioFog node longitude', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'description', alias: 'd', type: String, + description: 'ioFog node description', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'docker-url', alias: 'D', type: String, + description: 'ioFog node docker url', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'disk-limit', alias: 'M', type: Number, + description: 'ioFog node disk usage limit (MB)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'disk-directory', alias: 'T', type: String, + description: 'ioFog node disk directory', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'memory-limit', alias: 'm', type: Number, + description: 'ioFog node memory usage limit (MB)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'cpu-limit', alias: 'c', type: Number, + description: 'ioFog node CPU usage limit (%)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'log-limit', alias: 'G', type: Number, + description: 'ioFog node log size limit (MB)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'log-directory', alias: 'Y', type: String, + description: 'ioFog node log files directory', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'log-file-count', alias: 'C', type: Number, + description: 'ioFog node log files count', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'status-frequency', alias: 's', type: Number, + description: 'ioFog node status check frequency (seconds)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'change-frequency', alias: 'F', type: Number, + description: 'ioFog node configuration change check frequency (seconds)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'device-frequency', alias: 'Q', type: Number, + description: 'ioFog node device scan frequency (seconds)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'bluetooth-enable', alias: 'B', type: Boolean, + description: 'Enable bluetooth on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'bluetooth-disable', alias: 'b', type: Boolean, + description: 'Disable bluetooth on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'watchdog-enable', alias: 'W', type: Boolean, + description: 'Enable watchdog on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'watchdog-disable', alias: 'w', type: Boolean, + description: 'Disable watchdog on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'abs-hw-enable', alias: 'A', type: Boolean, + description: 'Enable hardware abstraction on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'abs-hw-disable', alias: 'a', type: Boolean, + description: 'Disable hardware abstraction on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'reboot', alias: 'o', type: Boolean, + description: 'Reboot ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'fog-type', alias: 'y', type: Number, + description: 'ioFog node architecture type', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'version-command', alias: 'v', type: String, + description: 'ioFog version command', + group: [constants.CMD_VERSION] + }, + { + name: 'user-id', alias: 'u', type: Number, + description: 'User\'s id', + group: [constants.CMD_ADD] + } + ]; this.commands = { [constants.CMD_ADD]: 'Add a new ioFog node.', [constants.CMD_UPDATE]: 'Update existing ioFog node.', @@ -93,42 +208,46 @@ class IOFog extends BaseCLIHandler { } async run(args) { - const iofogCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }) + try { + const iofogCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); - switch (iofogCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(iofogCommand, constants.CMD_ADD, _createFog, true); - break - case constants.CMD_UPDATE: - await _executeCase(iofogCommand, constants.CMD_UPDATE, _updateFog, false) - break - case constants.CMD_REMOVE: - await _executeCase(iofogCommand, constants.CMD_REMOVE, _deleteFog, false) - break - case constants.CMD_LIST: - await _executeCase(iofogCommand, constants.CMD_LIST, _getFogList, false) - break - case constants.CMD_INFO: - await _executeCase(iofogCommand, constants.CMD_INFO, _getFog, false) - break - case constants.CMD_PROVISIONING_KEY: - await _executeCase(iofogCommand, constants.CMD_PROVISIONING_KEY, _generateProvision, false) - break - case constants.CMD_IOFOG_REBOOT: - await _executeCase(iofogCommand, constants.CMD_IOFOG_REBOOT, _setFogRebootCommand, false) - break - case constants.CMD_VERSION: - await _executeCase(iofogCommand, constants.CMD_VERSION, _setFogVersionCommand, false) - break - case constants.CMD_HAL_HW: - await _executeCase(iofogCommand, constants.CMD_HAL_HW, _getHalHardwareInfo, false); - break; - case constants.CMD_HAL_USB: - await _executeCase(iofogCommand, constants.CMD_HAL_USB, _getHalUsbInfo, false); - break; - case constants.CMD_HELP: - default: - return this.help() + switch (iofogCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(iofogCommand, constants.CMD_ADD, _createFog, true); + break; + case constants.CMD_UPDATE: + await _executeCase(iofogCommand, constants.CMD_UPDATE, _updateFog, false); + break; + case constants.CMD_REMOVE: + await _executeCase(iofogCommand, constants.CMD_REMOVE, _deleteFog, false); + break; + case constants.CMD_LIST: + await _executeCase(iofogCommand, constants.CMD_LIST, _getFogList, false); + break; + case constants.CMD_INFO: + await _executeCase(iofogCommand, constants.CMD_INFO, _getFog, false); + break; + case constants.CMD_PROVISIONING_KEY: + await _executeCase(iofogCommand, constants.CMD_PROVISIONING_KEY, _generateProvision, false); + break; + case constants.CMD_IOFOG_REBOOT: + await _executeCase(iofogCommand, constants.CMD_IOFOG_REBOOT, _setFogRebootCommand, false); + break; + case constants.CMD_VERSION: + await _executeCase(iofogCommand, constants.CMD_VERSION, _setFogVersionCommand, false); + break; + case constants.CMD_HAL_HW: + await _executeCase(iofogCommand, constants.CMD_HAL_HW, _getHalHardwareInfo, false); + break; + case constants.CMD_HAL_USB: + await _executeCase(iofogCommand, constants.CMD_HAL_USB, _getHalUsbInfo, false); + break; + case constants.CMD_HELP: + default: + return this.help() + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -208,7 +327,7 @@ async function _generateProvision(obj, user) { const fog = _createFogObject(obj); logger.info(JSON.stringify(fog)); const res = await FogService.generateProvisioningKey(fog, user, true); - logger.info('Provisioning key: '+ JSON.stringify(res, null, 2)); + logger.info('Provisioning key: ' + JSON.stringify(res, null, 2)); logger.info('Fog provisioning key has been generated successfully.'); } @@ -278,9 +397,9 @@ function _createFogObject(cliData) { fogType: cliData.fogType, userId: cliData.userId - } + }; return AppHelper.deleteUndefinedFields(fogObj); } -module.exports = new IOFog() \ No newline at end of file +module.exports = new IOFog(); \ No newline at end of file diff --git a/src/cli/microservice.js b/src/cli/microservice.js index f96622a58..c9fb5637e 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -68,11 +68,14 @@ const JSON_SCHEMA_UPDATE = AppHelper.stringifyCliJsonSchema( class Microservice extends BaseCLIHandler { constructor() { - super() + super(); - this.name = constants.CMD_MICROSERVICE + this.name = constants.CMD_MICROSERVICE; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: [constants.CMD] }, + { + name: 'command', defaultOption: true, + group: [constants.CMD] + }, { name: 'file', alias: 'f', type: String, description: 'Microservice settings JSON file', group: [constants.CMD_ADD, constants.CMD_UPDATE] @@ -128,7 +131,9 @@ class Microservice extends BaseCLIHandler { group: [constants.CMD_PORT_MAPPING_CREATE, constants.CMD_VOLUME_MAPPING_CREATE] }, { - name: 'routes', alias: 't', type: String, description: 'Microservice route(s) (receiving microservices)', multiple: true, + name: 'routes', alias: 't', type: String, + description: 'Microservice route(s) (receiving microservices)', + multiple: true, group: [constants.CMD_ADD] }, { @@ -155,7 +160,7 @@ class Microservice extends BaseCLIHandler { name: 'mapping-id', alias: 'a', type: Number, description: 'Volume mapping id', group: [constants.CMD_VOLUME_MAPPING_REMOVE] } - ] + ]; this.commands = { [constants.CMD_ADD]: 'Add a new microservice.', [constants.CMD_UPDATE]: 'Update existing microservice.', @@ -174,51 +179,55 @@ class Microservice extends BaseCLIHandler { } async run(args) { - const microserviceCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }) - - switch (microserviceCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(microserviceCommand, constants.CMD_ADD, _createMicroservice); - break; - case constants.CMD_UPDATE: - await _executeCase(microserviceCommand, constants.CMD_UPDATE, _updateMicroservice); - break; - case constants.CMD_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_REMOVE, _removeMicroservice); - break; - case constants.CMD_LIST: - await _executeCase(microserviceCommand, constants.CMD_LIST, _listMicroservices); - break; - case constants.CMD_INFO: - await _executeCase(microserviceCommand, constants.CMD_INFO, _getMicroservice); - break; - case constants.CMD_ROUTE_CREATE: - await _executeCase(microserviceCommand, constants.CMD_ROUTE_CREATE, _createRoute); - break; - case constants.CMD_ROUTE_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_ROUTE_REMOVE, _removeRoute); - break; - case constants.CMD_PORT_MAPPING_CREATE: - await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_CREATE, _createPortMapping); - break; - case constants.CMD_PORT_MAPPING_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_REMOVE, _removePortMapping); - break; - case constants.CMD_PORT_MAPPING_LIST: - await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_LIST, _listPortMappings); - break; - case constants.CMD_VOLUME_MAPPING_CREATE: - await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_CREATE, _createVolumeMapping); - break; - case constants.CMD_VOLUME_MAPPING_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_REMOVE, _removeVolumeMapping); - break; - case constants.CMD_VOLUME_MAPPING_LIST: - await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_LIST, _listVolumeMappings); - break; - case constants.CMD_HELP: - default: - return this.help() + try { + const microserviceCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (microserviceCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(microserviceCommand, constants.CMD_ADD, _createMicroservice); + break; + case constants.CMD_UPDATE: + await _executeCase(microserviceCommand, constants.CMD_UPDATE, _updateMicroservice); + break; + case constants.CMD_REMOVE: + await _executeCase(microserviceCommand, constants.CMD_REMOVE, _removeMicroservice); + break; + case constants.CMD_LIST: + await _executeCase(microserviceCommand, constants.CMD_LIST, _listMicroservices); + break; + case constants.CMD_INFO: + await _executeCase(microserviceCommand, constants.CMD_INFO, _getMicroservice); + break; + case constants.CMD_ROUTE_CREATE: + await _executeCase(microserviceCommand, constants.CMD_ROUTE_CREATE, _createRoute); + break; + case constants.CMD_ROUTE_REMOVE: + await _executeCase(microserviceCommand, constants.CMD_ROUTE_REMOVE, _removeRoute); + break; + case constants.CMD_PORT_MAPPING_CREATE: + await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_CREATE, _createPortMapping); + break; + case constants.CMD_PORT_MAPPING_REMOVE: + await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_REMOVE, _removePortMapping); + break; + case constants.CMD_PORT_MAPPING_LIST: + await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_LIST, _listPortMappings); + break; + case constants.CMD_VOLUME_MAPPING_CREATE: + await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_CREATE, _createVolumeMapping); + break; + case constants.CMD_VOLUME_MAPPING_REMOVE: + await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_REMOVE, _removeVolumeMapping); + break; + case constants.CMD_VOLUME_MAPPING_LIST: + await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_LIST, _listVolumeMappings); + break; + case constants.CMD_HELP: + default: + return this.help() + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -287,7 +296,7 @@ class Microservice extends BaseCLIHandler { } } -const _executeCase = async function (microserviceCommand, commandName, f) { +const _executeCase = async function (microserviceCommand, commandName, f) { try { const item = microserviceCommand[commandName] || {}; await f(item); @@ -345,7 +354,7 @@ const _removePortMapping = async function (obj) { const internalPort = parseInt(obj.internalPort); await MicroserviceService.deletePortMapping(obj.microserviceId, internalPort, {}, true); logger.info('Port mapping has been deleted successfully.'); - } catch(e) { + } catch (e) { logger.error(ErrorMessages.CLI.INVALID_INTERNAL_PORT); } }; @@ -355,7 +364,7 @@ const _removeVolumeMapping = async function (obj) { try { await MicroserviceService.deleteVolumeMapping(obj.microserviceId, obj.mappingId, {}, true); logger.info('Volume mapping has been deleted successfully.'); - } catch(e) { + } catch (e) { logger.error(ErrorMessages.CLI.INVALID_VOLUME_MAPPING); } }; @@ -462,7 +471,7 @@ const parseVolumeMappingObject = function (obj, errMsg) { containerDestination: props[1], accessMode: props[2] } - } catch(e) { + } catch (e) { logger.warn(errMsg); } return result; @@ -481,11 +490,11 @@ const parsePortMappingObject = function (obj, errMsg) { external: parseInt(props[1]), publicMode: props[2] === 'true' } - } catch(e) { + } catch (e) { logger.warn(errMsg); } return result; -} +}; const parsePortMappingArray = function (arr, errMsg) { return arr.map(obj => parsePortMappingObject(obj, errMsg)); diff --git a/src/cli/registry.js b/src/cli/registry.js index 93c722d36..a748f1a57 100644 --- a/src/cli/registry.js +++ b/src/cli/registry.js @@ -24,17 +24,60 @@ class Registry extends BaseCLIHandler { this.name = constants.CMD_REGISTRY; this.commandDefinitions = [ - {name: 'command', defaultOption: true, group: [constants.CMD]}, - {name: 'uri', alias: 'u', type: String, description: 'Registry URI', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'public', alias: 'b', type: Boolean, description: 'Set registry as public', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'private', alias: 'r', type: Boolean, description: 'Set registry as private', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'username', alias: 'l', type: String, description: 'Registry\'s user name', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'password', alias: 'p', type: String, description: 'Password', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'requires-certificate', alias: 'c', type: Boolean, description: 'Requires certificate', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'certificate', alias: 'C', type: String, description: 'Certificate', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'email', alias: 'e', type: String, description: 'Email address', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'user-id', alias: 'i', type: Number, description: 'User\'s id', group: [constants.CMD_ADD]}, - {name: 'item-id', alias: 'd', type: Number, description: 'Item\'s id', group: [constants.CMD_REMOVE, constants.CMD_UPDATE]} + { + name: 'command', defaultOption: true, + group: [constants.CMD] + }, + { + name: 'uri', alias: 'u', type: String, + description: 'Registry URI', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'public', alias: 'b', type: Boolean, + description: 'Set registry as public', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'private', alias: 'r', type: Boolean, + description: 'Set registry as private', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'username', alias: 'l', type: String, + description: 'Registry\'s user name', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'password', alias: 'p', type: String, + description: 'Password', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'requires-certificate', alias: 'c', type: Boolean, + description: 'Requires certificate', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'certificate', alias: 'C', type: String, + description: 'Certificate', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'email', alias: 'e', type: String, + description: 'Email address', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'user-id', alias: 'i', type: Number, + description: 'User\'s id', + group: [constants.CMD_ADD] + }, + { + name: 'item-id', alias: 'd', type: Number, + description: 'Item\'s id', + group: [constants.CMD_REMOVE, constants.CMD_UPDATE] + } ]; this.commands = { [constants.CMD_ADD]: 'Add a new Registry.', @@ -45,24 +88,28 @@ class Registry extends BaseCLIHandler { } async run(args) { - const registryCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv}) + try { + const registryCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); - switch (registryCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(registryCommand, constants.CMD_ADD, _createRegistry, true); - break; - case constants.CMD_REMOVE: - await _executeCase(registryCommand, constants.CMD_REMOVE, _deleteRegistry, false); - break; - case constants.CMD_UPDATE: - await _executeCase(registryCommand, constants.CMD_UPDATE, _updateRegistry, false); - break; - case constants.CMD_LIST: - await _executeCase(registryCommand, constants.CMD_LIST, _getRegistries, false); - break; - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + switch (registryCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(registryCommand, constants.CMD_ADD, _createRegistry, true); + break; + case constants.CMD_REMOVE: + await _executeCase(registryCommand, constants.CMD_REMOVE, _deleteRegistry, false); + break; + case constants.CMD_UPDATE: + await _executeCase(registryCommand, constants.CMD_UPDATE, _updateRegistry, false); + break; + case constants.CMD_LIST: + await _executeCase(registryCommand, constants.CMD_LIST, _getRegistries, false); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -87,7 +134,7 @@ async function _deleteRegistry(obj, user) { logger.info('Registry has been removed successfully.'); } -async function _updateRegistry (obj) { +async function _updateRegistry(obj) { const registry = _createRegistryObject(obj); logger.info(JSON.stringify(registry)); await RegistryService.updateRegistry(registry, obj.itemId, {}, true); diff --git a/src/cli/start.js b/src/cli/start.js index 275c911f8..27189f364 100644 --- a/src/cli/start.js +++ b/src/cli/start.js @@ -11,24 +11,24 @@ * */ -const BaseCLIHandler = require('./base-cli-handler') -const config = require('../config') -const logger = require('../logger') +const BaseCLIHandler = require('./base-cli-handler'); +const config = require('../config'); +const logger = require('../logger'); class Start extends BaseCLIHandler { run(args) { - const daemon = args.daemon + const daemon = args.daemon; const configuration = { devMode: config.get('Server:DevMode'), port: config.get('Server:Port'), sslKey: config.get('Server:SslKey'), sslCert: config.get('Server:SslCert'), intermedKey: config.get('Server:IntermediateCert'), - } - const pid = daemon.status() + }; + const pid = daemon.status(); - if (pid == 0) { - daemon.start() + if (pid === 0) { + daemon.start(); checkDaemon(daemon, configuration) } else { logger.silly(`iofog-controller already running. PID: ${pid}`) @@ -37,27 +37,27 @@ class Start extends BaseCLIHandler { } function checkDaemon(daemon, configuration) { - let iterationsCount = 0 + let iterationsCount = 0; const check = () => { - iterationsCount++ - let pid = daemon.status() + iterationsCount++; + let pid = daemon.status(); if (pid === 0) { return logger.error('Error: port is probably allocated, or ssl_key or ssl_cert or intermediate_cert is either missing or invalid.') } if (iterationsCount === 5) { - checkServerProtocol(configuration) + checkServerProtocol(configuration); return logger.silly(`ioFog-Controller has started at pid: ${pid}`) } setTimeout(check, 1000) - } + }; setTimeout(check, 1000) } function checkServerProtocol(configuration) { - const { devMode, port, sslKey, sslCert, intermedKey } = configuration + const { devMode, port, sslKey, sslCert, intermedKey } = configuration; if (!devMode && sslKey && sslCert && intermedKey) { logger.silly(`==> 🌎 HTTPS server listening on port ${port}. Open up https://localhost:${port}/ in your browser.`) } else { @@ -65,4 +65,4 @@ function checkServerProtocol(configuration) { } } -module.exports = new Start() \ No newline at end of file +module.exports = new Start(); \ No newline at end of file diff --git a/src/cli/tunnel.js b/src/cli/tunnel.js index 34fcb6980..578321729 100644 --- a/src/cli/tunnel.js +++ b/src/cli/tunnel.js @@ -11,100 +11,136 @@ * */ -const BaseCLIHandler = require('./base-cli-handler') -const constants = require('../helpers/constants') +const BaseCLIHandler = require('./base-cli-handler'); +const constants = require('../helpers/constants'); const fs = require('fs'); -const logger = require('../logger') +const logger = require('../logger'); const TunnelService = require('../services/tunnel-service'); -const CliDecorator = require('../decorators/cli-decorator') -const Errors = require('../helpers/errors') -const ErrorMessages = require('../helpers/error-messages') +const CliDecorator = require('../decorators/cli-decorator'); +const Errors = require('../helpers/errors'); +const ErrorMessages = require('../helpers/error-messages'); class Tunnel extends BaseCLIHandler { constructor() { - super() + super(); - this.name = constants.CMD_TUNNEL + this.name = constants.CMD_TUNNEL; this.commandDefinitions = [ - { name: 'command', defaultOption: true, description: 'update, list', group: constants.CMD, }, - { name: 'username', alias: 'u', type: String, description: 'Tunnel username', group: [constants.CMD_UPDATE] }, - { name: 'password', alias: 'p', type: String, description: 'Tunnel password', group: [constants.CMD_UPDATE] }, - { name: 'host', alias: 's', type: String, description: 'Tunnel host address', group: [constants.CMD_UPDATE] }, - { name: 'rsa-key', alias: 'k', type: String, description: 'Tunnel RSA key', group: [constants.CMD_UPDATE] }, - { name: 'port', alias: 'o', type: Number, description: 'Tunnel port', group: [constants.CMD_UPDATE] }, - { name: 'iofogUuid', alias: 'f', type: String, description: 'Fog UUID', group: [constants.CMD_UPDATE] }, - { name: 'action', alias: 'a', type: String, description: 'Type of action. Can be "open" or "close"', group: [constants.CMD_UPDATE] } - ] + { + name: 'command', defaultOption: true, + description: 'update, list', + group: constants.CMD + }, + { + name: 'username', alias: 'u', type: String, + description: 'Tunnel username', + group: [constants.CMD_UPDATE] + }, + { + name: 'password', alias: 'p', type: String, + description: 'Tunnel password', + group: [constants.CMD_UPDATE] + }, + { + name: 'host', alias: 's', type: String, + description: 'Tunnel host address', + group: [constants.CMD_UPDATE] + }, + { + name: 'rsa-key', alias: 'k', type: String, + description: 'Tunnel RSA key', + group: [constants.CMD_UPDATE] + }, + { + name: 'port', alias: 'o', type: Number, + description: 'Tunnel port', + group: [constants.CMD_UPDATE] + }, + { + name: 'iofogUuid', alias: 'f', type: String, + description: 'Fog UUID', + group: [constants.CMD_UPDATE] + }, + { + name: 'action', alias: 'a', type: String, + description: 'Type of action. Can be "open" or "close"', + group: [constants.CMD_UPDATE] + } + ]; this.commands = { [constants.CMD_UPDATE]: 'Update existing tunnel.', [constants.CMD_LIST]: 'List all tunnels.', } } -async run(args) { - const tunnelCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }) + async run(args) { + try { + const tunnelCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); - switch (tunnelCommand.command.command) { - case constants.CMD_UPDATE: + switch (tunnelCommand.command.command) { + case constants.CMD_UPDATE: await _executeCase(tunnelCommand, constants.CMD_UPDATE, _updateTunnel, false); break; - case constants.CMD_LIST: + case constants.CMD_LIST: await _executeCase(tunnelCommand, constants.CMD_LIST, _tunnelList, false); break; - default: - return this.help([constants.CMD_HELP]) + default: + return this.help([constants.CMD_HELP]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } } async function _updateTunnel(obj, user) { - const action = obj.action; - const tunnel = _createTunnelObject(obj); - logger.info(JSON.stringify(tunnel)); - switch (action) { - case 'open': - await TunnelService.openTunnel(tunnel, user, true); - break; - case 'close': - await TunnelService.closeTunnel({iofogUuid: tunnel.iofogUuid}, user); - break; - default: - throw new Errors.ValidationError(ErrorMessages.INVALID_ACTION_PROPERTY); - } - logger.info('Tunnel has been updated successfully.'); + const action = obj.action; + const tunnel = _createTunnelObject(obj); + logger.info(JSON.stringify(tunnel)); + switch (action) { + case 'open': + await TunnelService.openTunnel(tunnel, user, true); + break; + case 'close': + await TunnelService.closeTunnel({iofogUuid: tunnel.iofogUuid}, user); + break; + default: + throw new Errors.ValidationError(ErrorMessages.INVALID_ACTION_PROPERTY); + } + logger.info('Tunnel has been updated successfully.'); } async function _tunnelList() { - const tunnels = await TunnelService.findAll(); - logger.info(JSON.stringify(tunnels, null, 2)); - logger.info('Tunnels has been received successfully.'); + const tunnels = await TunnelService.findAll(); + logger.info(JSON.stringify(tunnels, null, 2)); + logger.info('Tunnels has been received successfully.'); } async function _executeCase(commands, commandName, f, isUserRequired) { - try { - const obj = commands[commandName]; + try { + const obj = commands[commandName]; - if (isUserRequired) { - const decoratedFunction = CliDecorator.prepareUserById(f); - await decoratedFunction(obj); - } else { - await f(obj); - } - } catch (error) { - logger.error(error.message); + if (isUserRequired) { + const decoratedFunction = CliDecorator.prepareUserById(f); + await decoratedFunction(obj); + } else { + await f(obj); } + } catch (error) { + logger.error(error.message); + } } function _createTunnelObject(cliData) { - const rsa = cliData.rsaKey ? fs.readFileSync(cliData.rsaKey, 'utf8') : ""; + const rsa = cliData.rsaKey ? fs.readFileSync(cliData.rsaKey, 'utf8') : ""; return { - host: cliData.host, - username: cliData.username, - password: cliData.password, - rsakey: rsa, - lport: cliData.port, - iofogUuid: cliData.iofogUuid - }; + host: cliData.host, + username: cliData.username, + password: cliData.password, + rsakey: rsa, + lport: cliData.port, + iofogUuid: cliData.iofogUuid + }; } module.exports = new Tunnel(); \ No newline at end of file diff --git a/src/cli/user.js b/src/cli/user.js index 5be79c11a..b43ac6b36 100644 --- a/src/cli/user.js +++ b/src/cli/user.js @@ -22,31 +22,37 @@ const Validator = require('../schemas'); class User extends BaseCLIHandler { constructor() { - super() + super(); - this.name = constants.CMD_USER + this.name = constants.CMD_USER; this.commandDefinitions = [ { - name: 'command', defaultOption: true, description: 'add, remove, update, list, generate-token', + name: 'command', defaultOption: true, + description: 'add, remove, update, list, generate-token', group: constants.CMD, }, { - name: 'first-name', alias: 'f', type: String, description: 'User\'s first name', + name: 'first-name', alias: 'f', type: String, + description: 'User\'s first name', group: [constants.CMD_ADD, constants.CMD_UPDATE], }, { - name: 'last-name', alias: 'l', type: String, description: 'User\'s last name', + name: 'last-name', alias: 'l', type: String, + description: 'User\'s last name', group: [constants.CMD_ADD, constants.CMD_UPDATE], }, { - name: 'email', alias: 'e', type: String, description: 'User\'s email address', - group: [constants.CMD_ADD, constants.CMD_GENERATE_TOKEN, constants.CMD_REMOVE, constants.CMD_UPDATE, constants.CMD_ACTIVATE, constants.CMD_SUSPEND], + name: 'email', alias: 'e', type: String, + description: 'User\'s email address', + group: [constants.CMD_ADD, constants.CMD_GENERATE_TOKEN, constants.CMD_REMOVE, + constants.CMD_UPDATE, constants.CMD_ACTIVATE, constants.CMD_SUSPEND], }, { - name: 'password', alias: 'p', type: String, description: 'User\'s password', + name: 'password', alias: 'p', type: String, + description: 'User\'s password', group: [constants.CMD_ADD, constants.CMD_UPDATE], - }, - ] + } + ]; this.commands = { [constants.CMD_ADD]: 'Add a new user.', [constants.CMD_UPDATE]: 'Update existing user.', @@ -59,33 +65,37 @@ class User extends BaseCLIHandler { } async run(args) { - const userCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv,}) - - switch (userCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(userCommand, constants.CMD_ADD, _createUser, false); - break; - case constants.CMD_UPDATE: - await _executeCase(userCommand, constants.CMD_UPDATE, _updateUserDetails, true); - break; - case constants.CMD_REMOVE: - await _executeCase(userCommand, constants.CMD_REMOVE, _deleteUser, true); - break; - case constants.CMD_LIST: - await _executeCase(userCommand, constants.CMD_LIST, _getAllUsers, false); - break; - case constants.CMD_GENERATE_TOKEN: - await _executeCase(userCommand, constants.CMD_GENERATE_TOKEN, _generateToken, true); - break; - case constants.CMD_ACTIVATE: - await _executeCase(userCommand, constants.CMD_ACTIVATE, _activateUser, true); - break; - case constants.CMD_SUSPEND: - await _executeCase(userCommand, constants.CMD_SUSPEND, _suspendUser, true); - break; - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + try { + const userCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (userCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(userCommand, constants.CMD_ADD, _createUser, false); + break; + case constants.CMD_UPDATE: + await _executeCase(userCommand, constants.CMD_UPDATE, _updateUserDetails, true); + break; + case constants.CMD_REMOVE: + await _executeCase(userCommand, constants.CMD_REMOVE, _deleteUser, true); + break; + case constants.CMD_LIST: + await _executeCase(userCommand, constants.CMD_LIST, _getAllUsers, false); + break; + case constants.CMD_GENERATE_TOKEN: + await _executeCase(userCommand, constants.CMD_GENERATE_TOKEN, _generateToken, true); + break; + case constants.CMD_ACTIVATE: + await _executeCase(userCommand, constants.CMD_ACTIVATE, _activateUser, true); + break; + case constants.CMD_SUSPEND: + await _executeCase(userCommand, constants.CMD_SUSPEND, _suspendUser, true); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -161,4 +171,4 @@ const _suspendUser = async function (emailObj, user) { }; -module.exports = new User() +module.exports = new User(); diff --git a/src/helpers/app-helper.js b/src/helpers/app-helper.js index 3dd7a2b59..ea6b1bdcd 100644 --- a/src/helpers/app-helper.js +++ b/src/helpers/app-helper.js @@ -143,6 +143,20 @@ function stringifyCliJsonSchema(json) { .replace(/}/g, "\\}"); } +function handleCLIError(error) { + switch (error.name) { + case "UNKNOWN_OPTION": + console.log("Unknown parameter " + error.optionName); + break; + case "UNKNOWN_VALUE": + console.log("Unknown value " + error.value); + break; + default: + console.log(JSON.stringify(error)); + break; + } +} + module.exports = { encryptText, decryptText, @@ -158,5 +172,6 @@ module.exports = { formatMessage, findAvailablePort, stringifyCliJsonSchema, - isValidPublicIP + isValidPublicIP, + handleCLIError };