From f6c48779dc24c2858f62bb025d1aa12d3e422015 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Thu, 3 Mar 2016 12:44:43 -0600 Subject: [PATCH 01/23] [pack installer] moved existing files into new structure --- bin/kibana-plugin | 24 +++++++++++++++ bin/kibana-plugin.bat | 29 ++++++++++++++++++ src/cli_plugin/index.js | 5 +++ .../install}/__tests__/file_type.js | 0 .../install}/__tests__/plugin.js | 0 .../install}/__tests__/plugin_cleaner.js | 0 .../install}/__tests__/plugin_downloader.js | 0 .../install}/__tests__/plugin_extractor.js | 0 .../install}/__tests__/plugin_installer.js | 0 .../install}/__tests__/progress_reporter.js | 0 .../install}/__tests__/replies/banana.jpg | Bin .../install}/__tests__/replies/corrupt.tar.gz | Bin .../install}/__tests__/replies/corrupt.zip | 0 .../__tests__/replies/plugin_no_package.gz | Bin .../replies/test_plugin_master.tar.gz | Bin .../__tests__/replies/test_plugin_master.zip | Bin .../install}/__tests__/setting_parser.js | 0 .../install}/downloaders/file.js | 0 .../install}/downloaders/http.js | 0 .../install}/extractors/tar_gz.js | 0 .../install}/extractors/zip.js | 0 .../install}/file_type.js | 0 .../install}/plugin_cleaner.js | 0 .../install}/plugin_downloader.js | 0 .../install}/plugin_extractor.js | 0 .../install}/plugin_installer.js | 0 .../install}/progress_reporter.js | 0 .../install}/setting_parser.js | 0 .../lib}/__tests__/plugin_logger.js | 0 .../lib}/plugin_logger.js | 0 .../list}/plugin_lister.js | 0 src/{cli/plugin => cli_plugin}/plugin.js | 0 .../remove}/plugin_remover.js | 0 33 files changed, 58 insertions(+) create mode 100644 bin/kibana-plugin create mode 100644 bin/kibana-plugin.bat create mode 100644 src/cli_plugin/index.js rename src/{cli/plugin => cli_plugin/install}/__tests__/file_type.js (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/plugin.js (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/plugin_cleaner.js (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/plugin_downloader.js (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/plugin_extractor.js (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/plugin_installer.js (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/progress_reporter.js (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/replies/banana.jpg (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/replies/corrupt.tar.gz (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/replies/corrupt.zip (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/replies/plugin_no_package.gz (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/replies/test_plugin_master.tar.gz (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/replies/test_plugin_master.zip (100%) rename src/{cli/plugin => cli_plugin/install}/__tests__/setting_parser.js (100%) rename src/{cli/plugin => cli_plugin/install}/downloaders/file.js (100%) rename src/{cli/plugin => cli_plugin/install}/downloaders/http.js (100%) rename src/{cli/plugin => cli_plugin/install}/extractors/tar_gz.js (100%) rename src/{cli/plugin => cli_plugin/install}/extractors/zip.js (100%) rename src/{cli/plugin => cli_plugin/install}/file_type.js (100%) rename src/{cli/plugin => cli_plugin/install}/plugin_cleaner.js (100%) rename src/{cli/plugin => cli_plugin/install}/plugin_downloader.js (100%) rename src/{cli/plugin => cli_plugin/install}/plugin_extractor.js (100%) rename src/{cli/plugin => cli_plugin/install}/plugin_installer.js (100%) rename src/{cli/plugin => cli_plugin/install}/progress_reporter.js (100%) rename src/{cli/plugin => cli_plugin/install}/setting_parser.js (100%) rename src/{cli/plugin => cli_plugin/lib}/__tests__/plugin_logger.js (100%) rename src/{cli/plugin => cli_plugin/lib}/plugin_logger.js (100%) rename src/{cli/plugin => cli_plugin/list}/plugin_lister.js (100%) rename src/{cli/plugin => cli_plugin}/plugin.js (100%) rename src/{cli/plugin => cli_plugin/remove}/plugin_remover.js (100%) diff --git a/bin/kibana-plugin b/bin/kibana-plugin new file mode 100644 index 000000000000..7e8481fa71a2 --- /dev/null +++ b/bin/kibana-plugin @@ -0,0 +1,24 @@ +#!/bin/sh +SCRIPT=$0 + +# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path. +while [ -h "$SCRIPT" ] ; do + ls=$(ls -ld "$SCRIPT") + # Drop everything prior to -> + link=$(expr "$ls" : '.*-> \(.*\)$') + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=$(dirname "$SCRIPT")/"$link" + fi +done + +DIR="$(dirname "${SCRIPT}")/.." +NODE="${DIR}/node/bin/node" +test -x "$NODE" || NODE=$(which node) +if [ ! -x "$NODE" ]; then + echo "unable to find usable node.js executable." + exit 1 +fi + +exec "${NODE}" $NODE_OPTIONS "${DIR}/src/cli_plugin" ${@} diff --git a/bin/kibana-plugin.bat b/bin/kibana-plugin.bat new file mode 100644 index 000000000000..9d8bdc477812 --- /dev/null +++ b/bin/kibana-plugin.bat @@ -0,0 +1,29 @@ +@echo off + +SETLOCAL + +set SCRIPT_DIR=%~dp0 +for %%I in ("%SCRIPT_DIR%..") do set DIR=%%~dpfI + +set NODE=%DIR%\node\node.exe + +WHERE /Q node +IF %ERRORLEVEL% EQU 0 ( + for /f "delims=" %%i in ('WHERE node') do set SYS_NODE=%%i +) + +If Not Exist "%NODE%" ( + IF Exist "%SYS_NODE%" ( + set "NODE=%SYS_NODE%" + ) else ( + Echo unable to find usable node.js executable. + Exit /B 1 + ) +) + +TITLE Kibana Server +"%NODE%" %NODE_OPTIONS% "%DIR%\src\cli_plugin" %* + +:finally + +ENDLOCAL diff --git a/src/cli_plugin/index.js b/src/cli_plugin/index.js new file mode 100644 index 000000000000..9abf4b02b789 --- /dev/null +++ b/src/cli_plugin/index.js @@ -0,0 +1,5 @@ +// load the babel options seperately so that they can modify the process.env +// before calling babel/register +const babelOptions = require('../optimize/babelOptions').node; +require('babel/register')(babelOptions); +require('./plugin'); diff --git a/src/cli/plugin/__tests__/file_type.js b/src/cli_plugin/install/__tests__/file_type.js similarity index 100% rename from src/cli/plugin/__tests__/file_type.js rename to src/cli_plugin/install/__tests__/file_type.js diff --git a/src/cli/plugin/__tests__/plugin.js b/src/cli_plugin/install/__tests__/plugin.js similarity index 100% rename from src/cli/plugin/__tests__/plugin.js rename to src/cli_plugin/install/__tests__/plugin.js diff --git a/src/cli/plugin/__tests__/plugin_cleaner.js b/src/cli_plugin/install/__tests__/plugin_cleaner.js similarity index 100% rename from src/cli/plugin/__tests__/plugin_cleaner.js rename to src/cli_plugin/install/__tests__/plugin_cleaner.js diff --git a/src/cli/plugin/__tests__/plugin_downloader.js b/src/cli_plugin/install/__tests__/plugin_downloader.js similarity index 100% rename from src/cli/plugin/__tests__/plugin_downloader.js rename to src/cli_plugin/install/__tests__/plugin_downloader.js diff --git a/src/cli/plugin/__tests__/plugin_extractor.js b/src/cli_plugin/install/__tests__/plugin_extractor.js similarity index 100% rename from src/cli/plugin/__tests__/plugin_extractor.js rename to src/cli_plugin/install/__tests__/plugin_extractor.js diff --git a/src/cli/plugin/__tests__/plugin_installer.js b/src/cli_plugin/install/__tests__/plugin_installer.js similarity index 100% rename from src/cli/plugin/__tests__/plugin_installer.js rename to src/cli_plugin/install/__tests__/plugin_installer.js diff --git a/src/cli/plugin/__tests__/progress_reporter.js b/src/cli_plugin/install/__tests__/progress_reporter.js similarity index 100% rename from src/cli/plugin/__tests__/progress_reporter.js rename to src/cli_plugin/install/__tests__/progress_reporter.js diff --git a/src/cli/plugin/__tests__/replies/banana.jpg b/src/cli_plugin/install/__tests__/replies/banana.jpg similarity index 100% rename from src/cli/plugin/__tests__/replies/banana.jpg rename to src/cli_plugin/install/__tests__/replies/banana.jpg diff --git a/src/cli/plugin/__tests__/replies/corrupt.tar.gz b/src/cli_plugin/install/__tests__/replies/corrupt.tar.gz similarity index 100% rename from src/cli/plugin/__tests__/replies/corrupt.tar.gz rename to src/cli_plugin/install/__tests__/replies/corrupt.tar.gz diff --git a/src/cli/plugin/__tests__/replies/corrupt.zip b/src/cli_plugin/install/__tests__/replies/corrupt.zip similarity index 100% rename from src/cli/plugin/__tests__/replies/corrupt.zip rename to src/cli_plugin/install/__tests__/replies/corrupt.zip diff --git a/src/cli/plugin/__tests__/replies/plugin_no_package.gz b/src/cli_plugin/install/__tests__/replies/plugin_no_package.gz similarity index 100% rename from src/cli/plugin/__tests__/replies/plugin_no_package.gz rename to src/cli_plugin/install/__tests__/replies/plugin_no_package.gz diff --git a/src/cli/plugin/__tests__/replies/test_plugin_master.tar.gz b/src/cli_plugin/install/__tests__/replies/test_plugin_master.tar.gz similarity index 100% rename from src/cli/plugin/__tests__/replies/test_plugin_master.tar.gz rename to src/cli_plugin/install/__tests__/replies/test_plugin_master.tar.gz diff --git a/src/cli/plugin/__tests__/replies/test_plugin_master.zip b/src/cli_plugin/install/__tests__/replies/test_plugin_master.zip similarity index 100% rename from src/cli/plugin/__tests__/replies/test_plugin_master.zip rename to src/cli_plugin/install/__tests__/replies/test_plugin_master.zip diff --git a/src/cli/plugin/__tests__/setting_parser.js b/src/cli_plugin/install/__tests__/setting_parser.js similarity index 100% rename from src/cli/plugin/__tests__/setting_parser.js rename to src/cli_plugin/install/__tests__/setting_parser.js diff --git a/src/cli/plugin/downloaders/file.js b/src/cli_plugin/install/downloaders/file.js similarity index 100% rename from src/cli/plugin/downloaders/file.js rename to src/cli_plugin/install/downloaders/file.js diff --git a/src/cli/plugin/downloaders/http.js b/src/cli_plugin/install/downloaders/http.js similarity index 100% rename from src/cli/plugin/downloaders/http.js rename to src/cli_plugin/install/downloaders/http.js diff --git a/src/cli/plugin/extractors/tar_gz.js b/src/cli_plugin/install/extractors/tar_gz.js similarity index 100% rename from src/cli/plugin/extractors/tar_gz.js rename to src/cli_plugin/install/extractors/tar_gz.js diff --git a/src/cli/plugin/extractors/zip.js b/src/cli_plugin/install/extractors/zip.js similarity index 100% rename from src/cli/plugin/extractors/zip.js rename to src/cli_plugin/install/extractors/zip.js diff --git a/src/cli/plugin/file_type.js b/src/cli_plugin/install/file_type.js similarity index 100% rename from src/cli/plugin/file_type.js rename to src/cli_plugin/install/file_type.js diff --git a/src/cli/plugin/plugin_cleaner.js b/src/cli_plugin/install/plugin_cleaner.js similarity index 100% rename from src/cli/plugin/plugin_cleaner.js rename to src/cli_plugin/install/plugin_cleaner.js diff --git a/src/cli/plugin/plugin_downloader.js b/src/cli_plugin/install/plugin_downloader.js similarity index 100% rename from src/cli/plugin/plugin_downloader.js rename to src/cli_plugin/install/plugin_downloader.js diff --git a/src/cli/plugin/plugin_extractor.js b/src/cli_plugin/install/plugin_extractor.js similarity index 100% rename from src/cli/plugin/plugin_extractor.js rename to src/cli_plugin/install/plugin_extractor.js diff --git a/src/cli/plugin/plugin_installer.js b/src/cli_plugin/install/plugin_installer.js similarity index 100% rename from src/cli/plugin/plugin_installer.js rename to src/cli_plugin/install/plugin_installer.js diff --git a/src/cli/plugin/progress_reporter.js b/src/cli_plugin/install/progress_reporter.js similarity index 100% rename from src/cli/plugin/progress_reporter.js rename to src/cli_plugin/install/progress_reporter.js diff --git a/src/cli/plugin/setting_parser.js b/src/cli_plugin/install/setting_parser.js similarity index 100% rename from src/cli/plugin/setting_parser.js rename to src/cli_plugin/install/setting_parser.js diff --git a/src/cli/plugin/__tests__/plugin_logger.js b/src/cli_plugin/lib/__tests__/plugin_logger.js similarity index 100% rename from src/cli/plugin/__tests__/plugin_logger.js rename to src/cli_plugin/lib/__tests__/plugin_logger.js diff --git a/src/cli/plugin/plugin_logger.js b/src/cli_plugin/lib/plugin_logger.js similarity index 100% rename from src/cli/plugin/plugin_logger.js rename to src/cli_plugin/lib/plugin_logger.js diff --git a/src/cli/plugin/plugin_lister.js b/src/cli_plugin/list/plugin_lister.js similarity index 100% rename from src/cli/plugin/plugin_lister.js rename to src/cli_plugin/list/plugin_lister.js diff --git a/src/cli/plugin/plugin.js b/src/cli_plugin/plugin.js similarity index 100% rename from src/cli/plugin/plugin.js rename to src/cli_plugin/plugin.js diff --git a/src/cli/plugin/plugin_remover.js b/src/cli_plugin/remove/plugin_remover.js similarity index 100% rename from src/cli/plugin/plugin_remover.js rename to src/cli_plugin/remove/plugin_remover.js From fa1fd274b473c27fd6c2ff9f8a1e22c72b13ea53 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Thu, 3 Mar 2016 12:52:12 -0600 Subject: [PATCH 02/23] [pack installer] renamed existing files --- src/cli/cli.js | 1 - src/cli_plugin/cli.js | 40 ++++++++++ src/cli_plugin/index.js | 2 +- .../{plugin_cleaner.js => cleanup.js} | 0 .../{plugin_downloader.js => download.js} | 0 src/cli_plugin/install/__tests__/file_type.js | 31 -------- .../install/__tests__/{plugin.js => index.js} | 0 .../{plugin_installer.js => kibana.js} | 0 .../{progress_reporter.js => progress.js} | 0 .../{setting_parser.js => settings.js} | 0 .../__tests__/{plugin_extractor.js => zip.js} | 0 .../install/{plugin_cleaner.js => cleanup.js} | 0 .../{plugin_downloader.js => download.js} | 0 src/cli_plugin/install/extractors/tar_gz.js | 34 --------- src/cli_plugin/install/file_type.js | 14 ---- src/cli_plugin/install/index.js | 47 ++++++++++++ .../{plugin_installer.js => install.js} | 0 src/cli_plugin/install/plugin_extractor.js | 16 ---- .../{progress_reporter.js => progress.js} | 0 .../{setting_parser.js => settings.js} | 0 .../install/{extractors => }/zip.js | 0 .../__tests__/{plugin_logger.js => logger.js} | 0 .../lib/{plugin_logger.js => logger.js} | 0 .../list/{plugin_lister.js => list.js} | 0 src/cli_plugin/plugin.js | 75 ------------------- .../remove/{plugin_remover.js => remove.js} | 0 26 files changed, 88 insertions(+), 172 deletions(-) create mode 100644 src/cli_plugin/cli.js rename src/cli_plugin/install/__tests__/{plugin_cleaner.js => cleanup.js} (100%) rename src/cli_plugin/install/__tests__/{plugin_downloader.js => download.js} (100%) delete mode 100644 src/cli_plugin/install/__tests__/file_type.js rename src/cli_plugin/install/__tests__/{plugin.js => index.js} (100%) rename src/cli_plugin/install/__tests__/{plugin_installer.js => kibana.js} (100%) rename src/cli_plugin/install/__tests__/{progress_reporter.js => progress.js} (100%) rename src/cli_plugin/install/__tests__/{setting_parser.js => settings.js} (100%) rename src/cli_plugin/install/__tests__/{plugin_extractor.js => zip.js} (100%) rename src/cli_plugin/install/{plugin_cleaner.js => cleanup.js} (100%) rename src/cli_plugin/install/{plugin_downloader.js => download.js} (100%) delete mode 100644 src/cli_plugin/install/extractors/tar_gz.js delete mode 100644 src/cli_plugin/install/file_type.js create mode 100644 src/cli_plugin/install/index.js rename src/cli_plugin/install/{plugin_installer.js => install.js} (100%) delete mode 100644 src/cli_plugin/install/plugin_extractor.js rename src/cli_plugin/install/{progress_reporter.js => progress.js} (100%) rename src/cli_plugin/install/{setting_parser.js => settings.js} (100%) rename src/cli_plugin/install/{extractors => }/zip.js (100%) rename src/cli_plugin/lib/__tests__/{plugin_logger.js => logger.js} (100%) rename src/cli_plugin/lib/{plugin_logger.js => logger.js} (100%) rename src/cli_plugin/list/{plugin_lister.js => list.js} (100%) delete mode 100644 src/cli_plugin/plugin.js rename src/cli_plugin/remove/{plugin_remover.js => remove.js} (100%) diff --git a/src/cli/cli.js b/src/cli/cli.js index 0de588a87ab0..96f98301ae5c 100644 --- a/src/cli/cli.js +++ b/src/cli/cli.js @@ -15,7 +15,6 @@ program // attach commands require('./serve/serve')(program); -require('./plugin/plugin')(program); program .command('help ') diff --git a/src/cli_plugin/cli.js b/src/cli_plugin/cli.js new file mode 100644 index 000000000000..61751806f778 --- /dev/null +++ b/src/cli_plugin/cli.js @@ -0,0 +1,40 @@ +import _ from 'lodash'; +import pkg from '../utils/packageJson'; +import Command from '../cli/Command'; + +let argv = process.env.kbnWorkerArgv ? JSON.parse(process.env.kbnWorkerArgv) : process.argv.slice(); +let program = new Command('bin/kibana-plugin'); + +program +.version(pkg.version) +.description( + 'Kibana is an open source (Apache Licensed), browser ' + + 'based analytics and search dashboard for Elasticsearch.' +); + +require('./list')(program); +require('./install')(program); +require('./remove')(program); + +program +.command('help ') +.description('Get the help for a specific command') +.action(function (cmdName) { + var cmd = _.find(program.commands, { _name: cmdName }); + if (!cmd) return this.error(`unknown command ${cmdName}`); + cmd.help(); +}); + +program +.command('*', null, { noHelp: true }) +.action(function (cmd, options) { + program.error(`unknown command ${cmd}`); +}); + +// check for no command name +var subCommand = argv[2] && !String(argv[2][0]).match(/^-|^\.|\//); +if (!subCommand) { + program.defaultHelp(); +} + +program.parse(argv); diff --git a/src/cli_plugin/index.js b/src/cli_plugin/index.js index 9abf4b02b789..e7f562b57115 100644 --- a/src/cli_plugin/index.js +++ b/src/cli_plugin/index.js @@ -2,4 +2,4 @@ // before calling babel/register const babelOptions = require('../optimize/babelOptions').node; require('babel/register')(babelOptions); -require('./plugin'); +require('./cli'); diff --git a/src/cli_plugin/install/__tests__/plugin_cleaner.js b/src/cli_plugin/install/__tests__/cleanup.js similarity index 100% rename from src/cli_plugin/install/__tests__/plugin_cleaner.js rename to src/cli_plugin/install/__tests__/cleanup.js diff --git a/src/cli_plugin/install/__tests__/plugin_downloader.js b/src/cli_plugin/install/__tests__/download.js similarity index 100% rename from src/cli_plugin/install/__tests__/plugin_downloader.js rename to src/cli_plugin/install/__tests__/download.js diff --git a/src/cli_plugin/install/__tests__/file_type.js b/src/cli_plugin/install/__tests__/file_type.js deleted file mode 100644 index e21a9bbe25ed..000000000000 --- a/src/cli_plugin/install/__tests__/file_type.js +++ /dev/null @@ -1,31 +0,0 @@ -import expect from 'expect.js'; -import fileType, { ZIP, TAR } from '../file_type'; - -describe('kibana cli', function () { - describe('file_type', function () { - it('returns ZIP for .zip filename', function () { - const type = fileType('wat.zip'); - expect(type).to.equal(ZIP); - }); - it('returns TAR for .tar.gz filename', function () { - const type = fileType('wat.tar.gz'); - expect(type).to.equal(TAR); - }); - it('returns TAR for .tgz filename', function () { - const type = fileType('wat.tgz'); - expect(type).to.equal(TAR); - }); - it('returns undefined for unknown file type', function () { - const type = fileType('wat.unknown'); - expect(type).to.equal(undefined); - }); - it('accepts paths', function () { - const type = fileType('/some/path/to/wat.zip'); - expect(type).to.equal(ZIP); - }); - it('accepts urls', function () { - const type = fileType('http://example.com/wat.zip'); - expect(type).to.equal(ZIP); - }); - }); -}); diff --git a/src/cli_plugin/install/__tests__/plugin.js b/src/cli_plugin/install/__tests__/index.js similarity index 100% rename from src/cli_plugin/install/__tests__/plugin.js rename to src/cli_plugin/install/__tests__/index.js diff --git a/src/cli_plugin/install/__tests__/plugin_installer.js b/src/cli_plugin/install/__tests__/kibana.js similarity index 100% rename from src/cli_plugin/install/__tests__/plugin_installer.js rename to src/cli_plugin/install/__tests__/kibana.js diff --git a/src/cli_plugin/install/__tests__/progress_reporter.js b/src/cli_plugin/install/__tests__/progress.js similarity index 100% rename from src/cli_plugin/install/__tests__/progress_reporter.js rename to src/cli_plugin/install/__tests__/progress.js diff --git a/src/cli_plugin/install/__tests__/setting_parser.js b/src/cli_plugin/install/__tests__/settings.js similarity index 100% rename from src/cli_plugin/install/__tests__/setting_parser.js rename to src/cli_plugin/install/__tests__/settings.js diff --git a/src/cli_plugin/install/__tests__/plugin_extractor.js b/src/cli_plugin/install/__tests__/zip.js similarity index 100% rename from src/cli_plugin/install/__tests__/plugin_extractor.js rename to src/cli_plugin/install/__tests__/zip.js diff --git a/src/cli_plugin/install/plugin_cleaner.js b/src/cli_plugin/install/cleanup.js similarity index 100% rename from src/cli_plugin/install/plugin_cleaner.js rename to src/cli_plugin/install/cleanup.js diff --git a/src/cli_plugin/install/plugin_downloader.js b/src/cli_plugin/install/download.js similarity index 100% rename from src/cli_plugin/install/plugin_downloader.js rename to src/cli_plugin/install/download.js diff --git a/src/cli_plugin/install/extractors/tar_gz.js b/src/cli_plugin/install/extractors/tar_gz.js deleted file mode 100644 index f9b8b538fdb4..000000000000 --- a/src/cli_plugin/install/extractors/tar_gz.js +++ /dev/null @@ -1,34 +0,0 @@ -import zlib from 'zlib'; -import fs from 'fs'; -import tar from 'tar'; - -async function extractArchive(settings) { - await new Promise((resolve, reject) => { - const gunzip = zlib.createGunzip(); - const tarExtract = new tar.Extract({ path: settings.workingPath, strip: 1 }); - const readStream = fs.createReadStream(settings.tempArchiveFile); - - readStream.on('error', reject); - gunzip.on('error', reject); - tarExtract.on('error', reject); - - readStream - .pipe(gunzip) - .pipe(tarExtract); - - tarExtract.on('finish', resolve); - }); -} - -export default async function extractTarball(settings, logger) { - try { - logger.log('Extracting plugin archive'); - - await extractArchive(settings); - - logger.log('Extraction complete'); - } catch (err) { - logger.error(err); - throw new Error('Error extracting plugin archive'); - } -}; diff --git a/src/cli_plugin/install/file_type.js b/src/cli_plugin/install/file_type.js deleted file mode 100644 index 78c76d8eee91..000000000000 --- a/src/cli_plugin/install/file_type.js +++ /dev/null @@ -1,14 +0,0 @@ -export const TAR = '.tar.gz'; -export const ZIP = '.zip'; - -export default function fileType(filename) { - if (/\.zip$/i.test(filename)) { - return ZIP; - } - if (/\.tar\.gz$/i.test(filename)) { - return TAR; - } - if (/\.tgz$/i.test(filename)) { - return TAR; - } -} diff --git a/src/cli_plugin/install/index.js b/src/cli_plugin/install/index.js new file mode 100644 index 000000000000..d54f3dcda52a --- /dev/null +++ b/src/cli_plugin/install/index.js @@ -0,0 +1,47 @@ +import fromRoot from '../../utils/fromRoot'; +import install from './install'; +import Logger from '../lib/logger'; +import pkg from '../../utils/packageJson'; +import { parse, parseMilliseconds } from './settings'; + +export default function pluginInstall(program) { + function processCommand(command, options) { + let settings; + try { + settings = parse(command, options, pkg); + } catch (ex) { + //The logger has not yet been initialized. + console.error(ex.message); + process.exit(64); // eslint-disable-line no-process-exit + } + + const logger = new Logger(settings); + install(settings, logger); + } + + program + .command('install ') + .option('-q, --quiet', 'Disable all process messaging except errors') + .option('-s, --silent', 'Disable all process messaging') + .option( + '-c, --config ', + 'Path to the config file', + fromRoot('config/kibana.yml') + ) + .option( + '-t, --timeout ', + 'Length of time before failing; 0 for never fail', + parseMilliseconds + ) + .option( + '-d, --plugin-dir ', + 'The path to the directory where plugins are stored', + fromRoot('installedPlugins') + ) + .description('Install a plugin', +`Common examples: + install xpack + install file:///Path/to/my/xpack.zip + install https://path.to/my/xpack.zip`) + .action(processCommand); +}; diff --git a/src/cli_plugin/install/plugin_installer.js b/src/cli_plugin/install/install.js similarity index 100% rename from src/cli_plugin/install/plugin_installer.js rename to src/cli_plugin/install/install.js diff --git a/src/cli_plugin/install/plugin_extractor.js b/src/cli_plugin/install/plugin_extractor.js deleted file mode 100644 index 0dc67f3e9948..000000000000 --- a/src/cli_plugin/install/plugin_extractor.js +++ /dev/null @@ -1,16 +0,0 @@ -import zipExtract from './extractors/zip'; -import tarGzExtract from './extractors/tar_gz'; -import { ZIP, TAR } from './file_type'; - -export default function extractArchive(settings, logger, archiveType) { - switch (archiveType) { - case ZIP: - return zipExtract(settings, logger); - break; - case TAR: - return tarGzExtract(settings, logger); - break; - default: - throw new Error('Unsupported archive format.'); - } -}; diff --git a/src/cli_plugin/install/progress_reporter.js b/src/cli_plugin/install/progress.js similarity index 100% rename from src/cli_plugin/install/progress_reporter.js rename to src/cli_plugin/install/progress.js diff --git a/src/cli_plugin/install/setting_parser.js b/src/cli_plugin/install/settings.js similarity index 100% rename from src/cli_plugin/install/setting_parser.js rename to src/cli_plugin/install/settings.js diff --git a/src/cli_plugin/install/extractors/zip.js b/src/cli_plugin/install/zip.js similarity index 100% rename from src/cli_plugin/install/extractors/zip.js rename to src/cli_plugin/install/zip.js diff --git a/src/cli_plugin/lib/__tests__/plugin_logger.js b/src/cli_plugin/lib/__tests__/logger.js similarity index 100% rename from src/cli_plugin/lib/__tests__/plugin_logger.js rename to src/cli_plugin/lib/__tests__/logger.js diff --git a/src/cli_plugin/lib/plugin_logger.js b/src/cli_plugin/lib/logger.js similarity index 100% rename from src/cli_plugin/lib/plugin_logger.js rename to src/cli_plugin/lib/logger.js diff --git a/src/cli_plugin/list/plugin_lister.js b/src/cli_plugin/list/list.js similarity index 100% rename from src/cli_plugin/list/plugin_lister.js rename to src/cli_plugin/list/list.js diff --git a/src/cli_plugin/plugin.js b/src/cli_plugin/plugin.js deleted file mode 100644 index 390d2e48baee..000000000000 --- a/src/cli_plugin/plugin.js +++ /dev/null @@ -1,75 +0,0 @@ -import fromRoot from '../../utils/from_root'; -import settingParser from './setting_parser'; -import installer from './plugin_installer'; -import remover from './plugin_remover'; -import lister from './plugin_lister'; -import pluginLogger from './plugin_logger'; - -export default function pluginCli(program) { - function processCommand(command, options) { - let settings; - try { - settings = settingParser(command).parse(); - } catch (ex) { - //The logger has not yet been initialized. - console.error(ex.message); - process.exit(64); // eslint-disable-line no-process-exit - } - - const logger = pluginLogger(settings); - - switch (settings.action) { - case 'install': - installer.install(settings, logger); - break; - case 'remove': - remover.remove(settings, logger); - break; - case 'list': - lister.list(settings, logger); - break; - } - } - - program - .command('plugin') - .option('-i, --install //', 'The plugin to install') - .option('-r, --remove ', 'The plugin to remove') - .option('-l, --list', 'List installed plugins') - .option('-q, --quiet', 'Disable all process messaging except errors') - .option('-s, --silent', 'Disable all process messaging') - .option('-u, --url ', 'Specify download url') - .option( - '-c, --config ', - 'Path to the config file', - fromRoot('config/kibana.yml') - ) - .option( - '-t, --timeout ', - 'Length of time before failing; 0 for never fail', - settingParser.parseMilliseconds - ) - .option( - '-d, --plugin-dir ', - 'The path to the directory where plugins are stored', - fromRoot('installedPlugins') - ) - .description( - 'Maintain Plugins', -` - Common examples: - -i username/sample - attempts to download the latest version from the following url: - https://download.elastic.co/username/sample/sample-latest.tar.gz - - -i username/sample/v1.1.1 - attempts to download version v1.1.1 from the following url: - https://download.elastic.co/username/sample/sample-v1.1.1.tar.gz - - -i sample -u http://www.example.com/other_name.tar.gz - attempts to download from the specified url, - and installs the plugin found at that url as "sample" -` - ) - .action(processCommand); -}; diff --git a/src/cli_plugin/remove/plugin_remover.js b/src/cli_plugin/remove/remove.js similarity index 100% rename from src/cli_plugin/remove/plugin_remover.js rename to src/cli_plugin/remove/remove.js From 6830296e2e3997b4e8af31c192e953be2f83e9e2 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Thu, 3 Mar 2016 12:54:37 -0600 Subject: [PATCH 03/23] [pack installer] reworked Logger into a constructable object --- src/cli_plugin/lib/__tests__/logger.js | 16 +++--- src/cli_plugin/lib/logger.js | 71 +++++++++++++------------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/src/cli_plugin/lib/__tests__/logger.js b/src/cli_plugin/lib/__tests__/logger.js index 13ce90c9e76f..26bcca9ea488 100644 --- a/src/cli_plugin/lib/__tests__/logger.js +++ b/src/cli_plugin/lib/__tests__/logger.js @@ -1,6 +1,6 @@ import expect from 'expect.js'; import sinon from 'sinon'; -import pluginLogger from '../plugin_logger'; +import Logger from '../logger'; describe('kibana cli', function () { @@ -20,7 +20,7 @@ describe('kibana cli', function () { }); it('should log messages to the console and append a new line', function () { - logger = pluginLogger({ silent: false, quiet: false }); + logger = new Logger({ silent: false, quiet: false }); const message = 'this is my message'; logger.log(message); @@ -31,7 +31,7 @@ describe('kibana cli', function () { }); it('should log messages to the console and append not append a new line', function () { - logger = pluginLogger({ silent: false, quiet: false }); + logger = new Logger({ silent: false, quiet: false }); for (let i = 0; i < 10; i++) { logger.log('.', true); } @@ -54,7 +54,7 @@ describe('kibana cli', function () { }); it('should not log any messages when quiet is set', function () { - logger = pluginLogger({ silent: false, quiet: true }); + logger = new Logger({ silent: false, quiet: true }); const message = 'this is my message'; logger.log(message); @@ -68,7 +68,7 @@ describe('kibana cli', function () { }); it('should not log any messages when silent is set', function () { - logger = pluginLogger({ silent: true, quiet: false }); + logger = new Logger({ silent: true, quiet: false }); const message = 'this is my message'; logger.log(message); @@ -94,7 +94,7 @@ describe('kibana cli', function () { }); it('should log error messages to the console and append a new line', function () { - logger = pluginLogger({ silent: false, quiet: false }); + logger = new Logger({ silent: false, quiet: false }); const message = 'this is my error'; logger.error(message); @@ -102,7 +102,7 @@ describe('kibana cli', function () { }); it('should log error messages to the console when quiet is set', function () { - logger = pluginLogger({ silent: false, quiet: true }); + logger = new Logger({ silent: false, quiet: true }); const message = 'this is my error'; logger.error(message); @@ -110,7 +110,7 @@ describe('kibana cli', function () { }); it('should not log any error messages when silent is set', function () { - logger = pluginLogger({ silent: true, quiet: false }); + logger = new Logger({ silent: true, quiet: false }); const message = 'this is my error'; logger.error(message); diff --git a/src/cli_plugin/lib/logger.js b/src/cli_plugin/lib/logger.js index 489bec040df1..647caef5bf41 100644 --- a/src/cli_plugin/lib/logger.js +++ b/src/cli_plugin/lib/logger.js @@ -1,44 +1,45 @@ -export default function createPluginLogger(settings) { - let previousLineEnded = true; - const silent = !!settings.silent; - const quiet = !!settings.quiet; +export default function Logger(settings) { + const self = this; - function log(data, sameLine) { - if (silent || quiet) return; + self.previousLineEnded = true; + self.silent = !!settings.silent; + self.quiet = !!settings.quiet; +} - if (!sameLine && !previousLineEnded) { - process.stdout.write('\n'); - } +Logger.prototype.log = function (data, sameLine) { + const self = this; - //if data is a stream, pipe it. - if (data.readable) { - data.pipe(process.stdout); - return; - } + if (self.silent || self.quiet) return; - process.stdout.write(data); - if (!sameLine) process.stdout.write('\n'); - previousLineEnded = !sameLine; + if (!sameLine && !self.previousLineEnded) { + process.stdout.write('\n'); } - function error(data) { - if (silent) return; - - if (!previousLineEnded) { - process.stderr.write('\n'); - } - - //if data is a stream, pipe it. - if (data.readable) { - data.pipe(process.stderr); - return; - } - process.stderr.write(`${data}\n`); - previousLineEnded = true; + //if data is a stream, pipe it. + if (data.readable) { + data.pipe(process.stdout); + return; } - return { - log: log, - error: error - }; + process.stdout.write(data); + if (!sameLine) process.stdout.write('\n'); + self.previousLineEnded = !sameLine; +}; + +Logger.prototype.error = function (data) { + const self = this; + + if (self.silent) return; + + if (!self.previousLineEnded) { + process.stderr.write('\n'); + } + + //if data is a stream, pipe it. + if (data.readable) { + data.pipe(process.stderr); + return; + } + process.stderr.write(`${data}\n`); + self.previousLineEnded = true; }; From 7401cac1793988e5483827a81e1ac598eb114768 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Thu, 3 Mar 2016 13:09:34 -0600 Subject: [PATCH 04/23] [pack installer] updated the list command --- src/cli_plugin/list/__tests__/list.js | 61 +++++++++++++++++++++++ src/cli_plugin/list/__tests__/settings.js | 46 +++++++++++++++++ src/cli_plugin/list/index.js | 30 +++++++++++ src/cli_plugin/list/list.js | 9 ++-- src/cli_plugin/list/settings.js | 9 ++++ 5 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 src/cli_plugin/list/__tests__/list.js create mode 100644 src/cli_plugin/list/__tests__/settings.js create mode 100644 src/cli_plugin/list/index.js create mode 100644 src/cli_plugin/list/settings.js diff --git a/src/cli_plugin/list/__tests__/list.js b/src/cli_plugin/list/__tests__/list.js new file mode 100644 index 000000000000..201321a7cb89 --- /dev/null +++ b/src/cli_plugin/list/__tests__/list.js @@ -0,0 +1,61 @@ +import expect from 'expect.js'; +import sinon from 'sinon'; +import rimraf from 'rimraf'; +import mkdirp from 'mkdirp'; +import Logger from '../../lib/logger'; +import list from '../list'; +import { join } from 'path'; + +describe('kibana cli', function () { + + describe('plugin lister', function () { + + const pluginDir = join(__dirname, '.test.data'); + let logger; + + const settings = { + pluginDir: pluginDir + }; + + beforeEach(function () { + logger = new Logger(settings); + sinon.stub(logger, 'log'); + sinon.stub(logger, 'error'); + rimraf.sync(pluginDir); + mkdirp.sync(pluginDir); + }); + + afterEach(function () { + logger.log.restore(); + logger.error.restore(); + rimraf.sync(pluginDir); + }); + + it('list all of the directories in the plugin folder', function () { + mkdirp.sync(join(pluginDir, 'plugin1')); + mkdirp.sync(join(pluginDir, 'plugin2')); + mkdirp.sync(join(pluginDir, 'plugin3')); + + list(settings, logger); + + expect(logger.log.calledWith('plugin1')).to.be(true); + expect(logger.log.calledWith('plugin2')).to.be(true); + expect(logger.log.calledWith('plugin3')).to.be(true); + }); + + it('ignore folders that start with a period', function () { + mkdirp.sync(join(pluginDir, '.foo')); + mkdirp.sync(join(pluginDir, 'plugin1')); + mkdirp.sync(join(pluginDir, 'plugin2')); + mkdirp.sync(join(pluginDir, 'plugin3')); + mkdirp.sync(join(pluginDir, '.bar')); + + list(settings, logger); + + expect(logger.log.calledWith('.foo')).to.be(false); + expect(logger.log.calledWith('.bar')).to.be(false); + }); + + }); + +}); diff --git a/src/cli_plugin/list/__tests__/settings.js b/src/cli_plugin/list/__tests__/settings.js new file mode 100644 index 000000000000..8cb5dd733ea0 --- /dev/null +++ b/src/cli_plugin/list/__tests__/settings.js @@ -0,0 +1,46 @@ +import path from 'path'; +import expect from 'expect.js'; + +const utils = require('requirefrom')('src/utils'); +const fromRoot = utils('fromRoot'); +import { resolve } from 'path'; +import { parseMilliseconds, parse } from '../settings'; + +describe('kibana cli', function () { + + describe('plugin installer', function () { + + describe('command line option parsing', function () { + + describe('parse function', function () { + + let command; + const options = {}; + beforeEach(function () { + command = { pluginDir: fromRoot('installedPlugins') }; + }); + + describe('pluginDir option', function () { + + it('should default to installedPlugins', function () { + const settings = parse(command, options); + + expect(settings.pluginDir).to.be(fromRoot('installedPlugins')); + }); + + it('should set settings.config property', function () { + command.pluginDir = 'foo bar baz'; + const settings = parse(command, options); + + expect(settings.pluginDir).to.be('foo bar baz'); + }); + + }); + + }); + + }); + + }); + +}); diff --git a/src/cli_plugin/list/index.js b/src/cli_plugin/list/index.js new file mode 100644 index 000000000000..d1d8b8e8c66c --- /dev/null +++ b/src/cli_plugin/list/index.js @@ -0,0 +1,30 @@ +import fromRoot from '../../utils/fromRoot'; +import list from './list'; +import Logger from '../lib/logger'; +import { parse } from './settings'; + +export default function pluginList(program) { + function processCommand(command, options) { + let settings; + try { + settings = parse(command, options); + } catch (ex) { + //The logger has not yet been initialized. + console.error(ex.message); + process.exit(64); // eslint-disable-line no-process-exit + } + + const logger = new Logger(settings); + list(settings, logger); + } + + program + .command('list') + .option( + '-d, --plugin-dir ', + 'The path to the directory where plugins are stored', + fromRoot('installedPlugins') + ) + .description('List installed plugins') + .action(processCommand); +}; diff --git a/src/cli_plugin/list/list.js b/src/cli_plugin/list/list.js index c12154b60a73..576b4b277c98 100644 --- a/src/cli_plugin/list/list.js +++ b/src/cli_plugin/list/list.js @@ -1,8 +1,11 @@ import fs from 'fs'; -export function list(settings, logger) { +export default function list(settings, logger) { fs.readdirSync(settings.pluginDir) - .forEach(function (pluginFile) { - logger.log(pluginFile); + .forEach((filename) => { + if (filename[0] !== '.') { + logger.log(filename); + } }); + logger.log(''); } diff --git a/src/cli_plugin/list/settings.js b/src/cli_plugin/list/settings.js new file mode 100644 index 000000000000..c6a770feb74b --- /dev/null +++ b/src/cli_plugin/list/settings.js @@ -0,0 +1,9 @@ +import { resolve } from 'path'; + +export function parse(command, options) { + const settings = { + pluginDir: command.pluginDir ? command.pluginDir : '' + }; + + return settings; +}; From 8f4ea5678f5c2798afefbe981e39f3fd0b239b65 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Thu, 3 Mar 2016 13:22:12 -0600 Subject: [PATCH 05/23] [pack installer] updated remove command --- src/cli_plugin/remove/__tests__/remove.js | 56 ++++++++++ src/cli_plugin/remove/__tests__/settings.js | 108 ++++++++++++++++++++ src/cli_plugin/remove/index.js | 39 +++++++ src/cli_plugin/remove/remove.js | 12 +-- src/cli_plugin/remove/settings.js | 15 +++ 5 files changed, 222 insertions(+), 8 deletions(-) create mode 100644 src/cli_plugin/remove/__tests__/remove.js create mode 100644 src/cli_plugin/remove/__tests__/settings.js create mode 100644 src/cli_plugin/remove/index.js create mode 100644 src/cli_plugin/remove/settings.js diff --git a/src/cli_plugin/remove/__tests__/remove.js b/src/cli_plugin/remove/__tests__/remove.js new file mode 100644 index 000000000000..e136f0da3378 --- /dev/null +++ b/src/cli_plugin/remove/__tests__/remove.js @@ -0,0 +1,56 @@ +import expect from 'expect.js'; +import sinon from 'sinon'; +import glob from 'glob'; +import rimraf from 'rimraf'; +import mkdirp from 'mkdirp'; +import Logger from '../../lib/logger'; +import remove from '../remove'; +import { join } from 'path'; + +describe('kibana cli', function () { + + describe('plugin lister', function () { + + const pluginDir = join(__dirname, '.test.data'); + let logger; + + const settings = { + pluginDir: pluginDir + }; + + beforeEach(function () { + logger = new Logger(settings); + sinon.stub(logger, 'log'); + sinon.stub(logger, 'error'); + rimraf.sync(pluginDir); + mkdirp.sync(pluginDir); + }); + + afterEach(function () { + logger.log.restore(); + logger.error.restore(); + rimraf.sync(pluginDir); + }); + + it('log a message if the plugin is not installed.', function () { + settings.pluginPath = join(pluginDir, 'foo'); + remove(settings, logger); + + expect(logger.log.firstCall.args[0]).to.match(/not installed/i); + }); + + it('delete the specified folder.', function () { + settings.pluginPath = join(pluginDir, 'foo'); + mkdirp.sync(join(pluginDir, 'foo')); + mkdirp.sync(join(pluginDir, 'bar')); + + remove(settings, logger); + + const files = glob.sync('**/*', { cwd: pluginDir }); + const expected = ['bar']; + expect(files.sort()).to.eql(expected.sort()); + }); + + }); + +}); diff --git a/src/cli_plugin/remove/__tests__/settings.js b/src/cli_plugin/remove/__tests__/settings.js new file mode 100644 index 000000000000..eff22618dd02 --- /dev/null +++ b/src/cli_plugin/remove/__tests__/settings.js @@ -0,0 +1,108 @@ +import path from 'path'; +import expect from 'expect.js'; + +const utils = require('requirefrom')('src/utils'); +const fromRoot = utils('fromRoot'); +import { resolve } from 'path'; +import { parseMilliseconds, parse } from '../settings'; + +describe('kibana cli', function () { + + describe('plugin installer', function () { + + describe('command line option parsing', function () { + + describe('parse function', function () { + + const command = 'plugin name'; + let options = {}; + const kbnPackage = { version: 1234 }; + beforeEach(function () { + options = { pluginDir: fromRoot('installedPlugins') }; + }); + + describe('quiet option', function () { + + it('should default to false', function () { + const settings = parse(command, options, kbnPackage); + + expect(settings.quiet).to.be(false); + }); + + it('should set settings.quiet property to true', function () { + options.quiet = true; + const settings = parse(command, options, kbnPackage); + + expect(settings.quiet).to.be(true); + }); + + }); + + describe('silent option', function () { + + it('should default to false', function () { + const settings = parse(command, options, kbnPackage); + + expect(settings.silent).to.be(false); + }); + + it('should set settings.silent property to true', function () { + options.silent = true; + const settings = parse(command, options, kbnPackage); + + expect(settings.silent).to.be(true); + }); + + }); + + describe('config option', function () { + + it('should default to ZLS', function () { + const settings = parse(command, options, kbnPackage); + + expect(settings.config).to.be(''); + }); + + it('should set settings.config property', function () { + options.config = 'foo bar baz'; + const settings = parse(command, options, kbnPackage); + + expect(settings.config).to.be('foo bar baz'); + }); + + }); + + describe('pluginDir option', function () { + + it('should default to installedPlugins', function () { + const settings = parse(command, options, kbnPackage); + + expect(settings.pluginDir).to.be(fromRoot('installedPlugins')); + }); + + it('should set settings.config property', function () { + options.pluginDir = 'foo bar baz'; + const settings = parse(command, options, kbnPackage); + + expect(settings.pluginDir).to.be('foo bar baz'); + }); + + }); + + describe('command value', function () { + + it('should set settings.plugin property', function () { + const settings = parse(command, options, kbnPackage); + + expect(settings.plugin).to.be(command); + }); + + }); + + }); + + }); + + }); + +}); diff --git a/src/cli_plugin/remove/index.js b/src/cli_plugin/remove/index.js new file mode 100644 index 000000000000..92377882e56b --- /dev/null +++ b/src/cli_plugin/remove/index.js @@ -0,0 +1,39 @@ +import fromRoot from '../../utils/fromRoot'; +import remove from './remove'; +import Logger from '../lib/logger'; +import { parse } from './settings'; + +export default function pluginList(program) { + function processCommand(command, options) { + let settings; + try { + settings = parse(command, options); + } catch (ex) { + //The logger has not yet been initialized. + console.error(ex.message); + process.exit(64); // eslint-disable-line no-process-exit + } + + const logger = new Logger(settings); + remove(settings, logger); + } + + program + .command('remove ') + .option('-q, --quiet', 'Disable all process messaging except errors') + .option('-s, --silent', 'Disable all process messaging') + .option( + '-c, --config ', + 'Path to the config file', + fromRoot('config/kibana.yml') + ) + .option( + '-d, --plugin-dir ', + 'The path to the directory where plugins are stored', + fromRoot('installedPlugins') + ) + .description('Remove a plugin', +`Common examples: + remove xpack`) + .action(processCommand); +}; diff --git a/src/cli_plugin/remove/remove.js b/src/cli_plugin/remove/remove.js index ff4c22e0feeb..2103864b0869 100644 --- a/src/cli_plugin/remove/remove.js +++ b/src/cli_plugin/remove/remove.js @@ -1,23 +1,19 @@ import fs from 'fs'; import rimraf from 'rimraf'; -module.exports = { - remove: remove -}; - -function remove(settings, logger) { +export default function remove(settings, logger) { try { try { fs.statSync(settings.pluginPath); } catch (e) { - logger.log(`Plugin ${settings.package} does not exist`); + logger.log(`Plugin ${settings.plugin} is not installed`); return; } - logger.log(`Removing ${settings.package}...`); + logger.log(`Removing ${settings.plugin}...`); rimraf.sync(settings.pluginPath); } catch (err) { - logger.error(`Unable to remove plugin "${settings.package}" because of error: "${err.message}"`); + logger.error(`Unable to remove plugin "${settings.plugin}" because of error: "${err.message}"`); process.exit(74); // eslint-disable-line no-process-exit } } diff --git a/src/cli_plugin/remove/settings.js b/src/cli_plugin/remove/settings.js new file mode 100644 index 000000000000..94f3b8ee5f40 --- /dev/null +++ b/src/cli_plugin/remove/settings.js @@ -0,0 +1,15 @@ +import { resolve } from 'path'; + +export function parse(command, options) { + const settings = { + quiet: options.quiet ? options.quiet : false, + silent: options.silent ? options.silent : false, + config: options.config ? options.config : '', + pluginDir: options.pluginDir ? options.pluginDir : '', + plugin: command + }; + + settings.pluginPath = resolve(settings.pluginDir, settings.plugin); + + return settings; +}; From e50a79166a4a06cd6a5dda099c8f434714246f93 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Thu, 3 Mar 2016 13:31:58 -0600 Subject: [PATCH 06/23] [pack installer] modified install action --- src/cli_plugin/install/__tests__/cleanup.js | 25 +- src/cli_plugin/install/__tests__/download.js | 203 +++------- src/cli_plugin/install/__tests__/index.js | 22 +- src/cli_plugin/install/__tests__/kibana.js | 115 ++++-- src/cli_plugin/install/__tests__/pack.js | 164 ++++++++ src/cli_plugin/install/__tests__/progress.js | 9 +- .../install/__tests__/replies/corrupt.tar.gz | Bin 1981 -> 0 bytes .../__tests__/replies/package.no_version.json | 3 + .../__tests__/replies/plugin_no_package.gz | Bin 533 -> 0 bytes .../install/__tests__/replies/test_plugin.zip | Bin 0 -> 2314 bytes .../__tests__/replies/test_plugin_many.zip | Bin 0 -> 421587 bytes .../replies/test_plugin_master.tar.gz | Bin 828 -> 0 bytes .../__tests__/replies/test_plugin_master.zip | Bin 1882 -> 0 bytes .../replies/test_plugin_no_kibana.zip | Bin 0 -> 292 bytes src/cli_plugin/install/__tests__/settings.js | 352 +++++------------- src/cli_plugin/install/__tests__/zip.js | 168 +++++---- src/cli_plugin/install/cleanup.js | 59 ++- src/cli_plugin/install/download.js | 72 ++-- src/cli_plugin/install/downloaders/file.js | 19 +- src/cli_plugin/install/downloaders/http.js | 32 +- src/cli_plugin/install/install.js | 82 +--- src/cli_plugin/install/kibana.js | 56 +++ src/cli_plugin/install/pack.js | 119 ++++++ src/cli_plugin/install/progress.js | 61 +-- src/cli_plugin/install/settings.js | 144 ++----- src/cli_plugin/install/zip.js | 73 +++- 26 files changed, 904 insertions(+), 874 deletions(-) create mode 100644 src/cli_plugin/install/__tests__/pack.js delete mode 100644 src/cli_plugin/install/__tests__/replies/corrupt.tar.gz create mode 100644 src/cli_plugin/install/__tests__/replies/package.no_version.json delete mode 100644 src/cli_plugin/install/__tests__/replies/plugin_no_package.gz create mode 100644 src/cli_plugin/install/__tests__/replies/test_plugin.zip create mode 100644 src/cli_plugin/install/__tests__/replies/test_plugin_many.zip delete mode 100644 src/cli_plugin/install/__tests__/replies/test_plugin_master.tar.gz delete mode 100644 src/cli_plugin/install/__tests__/replies/test_plugin_master.zip create mode 100644 src/cli_plugin/install/__tests__/replies/test_plugin_no_kibana.zip create mode 100644 src/cli_plugin/install/kibana.js create mode 100644 src/cli_plugin/install/pack.js diff --git a/src/cli_plugin/install/__tests__/cleanup.js b/src/cli_plugin/install/__tests__/cleanup.js index e97ae39f1709..4fb81a9d1bcd 100644 --- a/src/cli_plugin/install/__tests__/cleanup.js +++ b/src/cli_plugin/install/__tests__/cleanup.js @@ -3,8 +3,8 @@ import sinon from 'sinon'; import fs from 'fs'; import rimraf from 'rimraf'; -import pluginCleaner from '../plugin_cleaner'; -import pluginLogger from '../plugin_logger'; +import { cleanPrevious, cleanError } from '../cleanup'; +import Logger from '../../lib/logger'; describe('kibana cli', function () { @@ -24,8 +24,7 @@ describe('kibana cli', function () { beforeEach(function () { errorStub = sinon.stub(); - logger = pluginLogger(false); - cleaner = pluginCleaner(settings, logger); + logger = new Logger(settings); sinon.stub(logger, 'log'); sinon.stub(logger, 'error'); request = { @@ -49,7 +48,7 @@ describe('kibana cli', function () { throw error; }); - return cleaner.cleanPrevious(logger) + return cleanPrevious(settings, logger) .catch(errorStub) .then(function (data) { expect(errorStub.called).to.be(false); @@ -64,7 +63,7 @@ describe('kibana cli', function () { }); errorStub = sinon.stub(); - return cleaner.cleanPrevious(logger) + return cleanPrevious(settings, logger) .catch(errorStub) .then(function () { expect(errorStub.called).to.be(true); @@ -75,7 +74,7 @@ describe('kibana cli', function () { sinon.stub(rimraf, 'sync'); sinon.stub(fs, 'statSync'); - return cleaner.cleanPrevious(logger) + return cleanPrevious(settings, logger) .catch(errorStub) .then(function (data) { expect(logger.log.calledWith('Found previous install attempt. Deleting...')).to.be(true); @@ -89,7 +88,7 @@ describe('kibana cli', function () { }); errorStub = sinon.stub(); - return cleaner.cleanPrevious(logger) + return cleanPrevious(settings, logger) .catch(errorStub) .then(function () { expect(errorStub.called).to.be(true); @@ -100,7 +99,7 @@ describe('kibana cli', function () { sinon.stub(rimraf, 'sync'); sinon.stub(fs, 'statSync'); - return cleaner.cleanPrevious(logger) + return cleanPrevious(settings, logger) .catch(errorStub) .then(function (data) { expect(errorStub.called).to.be(false); @@ -110,12 +109,10 @@ describe('kibana cli', function () { }); describe('cleanError', function () { - let cleaner; let logger; beforeEach(function () { - logger = pluginLogger(false); - cleaner = pluginCleaner(settings, logger); + logger = new Logger(settings); }); afterEach(function () { @@ -125,7 +122,7 @@ describe('kibana cli', function () { it('should attempt to delete the working directory', function () { sinon.stub(rimraf, 'sync'); - cleaner.cleanError(); + cleanError(settings); expect(rimraf.sync.calledWith(settings.workingPath)).to.be(true); }); @@ -134,7 +131,7 @@ describe('kibana cli', function () { throw new Error('Something bad happened.'); }); - expect(cleaner.cleanError).withArgs(settings).to.not.throwError(); + expect(cleanError).withArgs(settings).to.not.throwError(); }); }); diff --git a/src/cli_plugin/install/__tests__/download.js b/src/cli_plugin/install/__tests__/download.js index 5fd05dd21d3f..86ac43237155 100644 --- a/src/cli_plugin/install/__tests__/download.js +++ b/src/cli_plugin/install/__tests__/download.js @@ -1,11 +1,11 @@ import expect from 'expect.js'; import sinon from 'sinon'; import nock from 'nock'; -import glob from 'glob-all'; +import glob from 'glob'; import rimraf from 'rimraf'; import mkdirp from 'mkdirp'; -import pluginLogger from '../plugin_logger'; -import pluginDownloader from '../plugin_downloader'; +import Logger from '../../lib/logger'; +import { download, _downloadSingle } from '../download'; import { join } from 'path'; describe('kibana cli', function () { @@ -13,8 +13,14 @@ describe('kibana cli', function () { describe('plugin downloader', function () { const testWorkingPath = join(__dirname, '.test.data'); const tempArchiveFilePath = join(testWorkingPath, 'archive.part'); - let logger; - let downloader; + + const settings = { + urls: [], + workingPath: testWorkingPath, + tempArchiveFile: tempArchiveFilePath, + timeout: 0 + }; + const logger = new Logger(settings); function expectWorkingPathEmpty() { const files = glob.sync('**/*', { cwd: testWorkingPath }); @@ -35,7 +41,6 @@ describe('kibana cli', function () { } beforeEach(function () { - logger = pluginLogger(false); sinon.stub(logger, 'log'); sinon.stub(logger, 'error'); rimraf.sync(testWorkingPath); @@ -51,35 +56,10 @@ describe('kibana cli', function () { describe('_downloadSingle', function () { beforeEach(function () { - const settings = { - urls: [], - workingPath: testWorkingPath, - tempArchiveFile: tempArchiveFilePath, - timeout: 0 - }; - downloader = pluginDownloader(settings, logger); }); describe('http downloader', function () { - it('should download an unsupported file type, but return undefined for archiveType', function () { - const filePath = join(__dirname, 'replies/banana.jpg'); - const couchdb = nock('http://www.files.com') - .defaultReplyHeaders({ - 'content-length': '10', - 'content-type': 'image/jpeg' - }) - .get('/banana.jpg') - .replyWithFile(200, filePath); - - const sourceUrl = 'http://www.files.com/banana.jpg'; - return downloader._downloadSingle(sourceUrl) - .then(function (data) { - expect(data.archiveType).to.be(undefined); - expectWorkingPathNotEmpty(); - }); - }); - it('should throw an ENOTFOUND error for a http ulr that returns 404', function () { const couchdb = nock('http://www.files.com') .get('/plugin.tar.gz') @@ -87,7 +67,7 @@ describe('kibana cli', function () { const sourceUrl = 'http://www.files.com/plugin.tar.gz'; - return downloader._downloadSingle(sourceUrl) + return _downloadSingle(settings, logger, sourceUrl) .then(shouldReject, function (err) { expect(err.message).to.match(/ENOTFOUND/); expectWorkingPathEmpty(); @@ -97,54 +77,15 @@ describe('kibana cli', function () { it('should throw an ENOTFOUND error for an invalid url', function () { const sourceUrl = 'i am an invalid url'; - return downloader._downloadSingle(sourceUrl) + return _downloadSingle(settings, logger, sourceUrl) .then(shouldReject, function (err) { expect(err.message).to.match(/ENOTFOUND/); expectWorkingPathEmpty(); }); }); - it('should download a tarball from a valid http url', function () { - const filePath = join(__dirname, 'replies/test_plugin_master.tar.gz'); - - const couchdb = nock('http://www.files.com') - .defaultReplyHeaders({ - 'content-length': '10', - 'content-type': 'application/x-gzip' - }) - .get('/plugin.tar.gz') - .replyWithFile(200, filePath); - - const sourceUrl = 'http://www.files.com/plugin.tar.gz'; - - return downloader._downloadSingle(sourceUrl) - .then(function (data) { - expect(data.archiveType).to.be('.tar.gz'); - expectWorkingPathNotEmpty(); - }); - }); - - it('should consider .tgz files as archive type .tar.gz', function () { - const filePath = join(__dirname, 'replies/test_plugin_master.tar.gz'); - - const couchdb = nock('http://www.files.com') - .defaultReplyHeaders({ - 'content-length': '10' - }) - .get('/plugin.tgz') - .replyWithFile(200, filePath); - - const sourceUrl = 'http://www.files.com/plugin.tgz'; - - return downloader._downloadSingle(sourceUrl) - .then(function (data) { - expect(data.archiveType).to.be('.tar.gz'); - expectWorkingPathNotEmpty(); - }); - }); - - it('should download a zip from a valid http url', function () { - const filePath = join(__dirname, 'replies/test_plugin_master.zip'); + it('should download a file from a valid http url', function () { + const filePath = join(__dirname, 'replies/banana.jpg'); const couchdb = nock('http://www.files.com') .defaultReplyHeaders({ @@ -156,9 +97,8 @@ describe('kibana cli', function () { const sourceUrl = 'http://www.files.com/plugin.zip'; - return downloader._downloadSingle(sourceUrl) - .then(function (data) { - expect(data.archiveType).to.be('.zip'); + return _downloadSingle(settings, logger, sourceUrl) + .then(function () { expectWorkingPathNotEmpty(); }); }); @@ -167,54 +107,23 @@ describe('kibana cli', function () { describe('local file downloader', function () { - it('should copy an unsupported file type, but return undefined for archiveType', function () { - const filePath = join(__dirname, 'replies/banana.jpg'); - const sourceUrl = 'file://' + filePath.replace(/\\/g, '/'); - - const couchdb = nock('http://www.files.com') - .defaultReplyHeaders({ - 'content-length': '10', - 'content-type': 'image/jpeg' - }) - .get('/banana.jpg') - .replyWithFile(200, filePath); - - return downloader._downloadSingle(sourceUrl) - .then(function (data) { - expect(data.archiveType).to.be(undefined); - expectWorkingPathNotEmpty(); - }); - }); - it('should throw an ENOTFOUND error for an invalid local file', function () { - const filePath = join(__dirname, 'replies/i-am-not-there.tar.gz'); + const filePath = join(__dirname, 'replies/i-am-not-there.zip'); const sourceUrl = 'file://' + filePath.replace(/\\/g, '/'); - return downloader._downloadSingle(sourceUrl) + return _downloadSingle(settings, logger, sourceUrl) .then(shouldReject, function (err) { expect(err.message).to.match(/ENOTFOUND/); expectWorkingPathEmpty(); }); }); - it('should copy a tarball from a valid local file', function () { - const filePath = join(__dirname, 'replies/test_plugin_master.tar.gz'); + it('should copy a valid local file', function () { + const filePath = join(__dirname, 'replies/banana.jpg'); const sourceUrl = 'file://' + filePath.replace(/\\/g, '/'); - return downloader._downloadSingle(sourceUrl) - .then(function (data) { - expect(data.archiveType).to.be('.tar.gz'); - expectWorkingPathNotEmpty(); - }); - }); - - it('should copy a zip from a valid local file', function () { - const filePath = join(__dirname, 'replies/test_plugin_master.zip'); - const sourceUrl = 'file://' + filePath.replace(/\\/g, '/'); - - return downloader._downloadSingle(sourceUrl) - .then(function (data) { - expect(data.archiveType).to.be('.zip'); + return _downloadSingle(settings, logger, sourceUrl) + .then(function () { expectWorkingPathNotEmpty(); }); }); @@ -225,19 +134,13 @@ describe('kibana cli', function () { describe('download', function () { it('should loop through bad urls until it finds a good one.', function () { - const filePath = join(__dirname, 'replies/test_plugin_master.tar.gz'); - const settings = { - urls: [ - 'http://www.files.com/badfile1.tar.gz', - 'http://www.files.com/badfile2.tar.gz', - 'I am a bad uri', - 'http://www.files.com/goodfile.tar.gz' - ], - workingPath: testWorkingPath, - tempArchiveFile: tempArchiveFilePath, - timeout: 0 - }; - downloader = pluginDownloader(settings, logger); + const filePath = join(__dirname, 'replies/test_plugin.zip'); + settings.urls = [ + 'http://www.files.com/badfile1.tar.gz', + 'http://www.files.com/badfile2.tar.gz', + 'I am a bad uri', + 'http://www.files.com/goodfile.tar.gz' + ]; const couchdb = nock('http://www.files.com') .defaultReplyHeaders({ @@ -250,8 +153,8 @@ describe('kibana cli', function () { .get('/goodfile.tar.gz') .replyWithFile(200, filePath); - return downloader.download(settings, logger) - .then(function (data) { + return download(settings, logger) + .then(function () { expect(logger.log.getCall(0).args[0]).to.match(/badfile1.tar.gz/); expect(logger.log.getCall(1).args[0]).to.match(/badfile2.tar.gz/); expect(logger.log.getCall(2).args[0]).to.match(/I am a bad uri/); @@ -261,19 +164,13 @@ describe('kibana cli', function () { }); it('should stop looping through urls when it finds a good one.', function () { - const filePath = join(__dirname, 'replies/test_plugin_master.tar.gz'); - const settings = { - urls: [ - 'http://www.files.com/badfile1.tar.gz', - 'http://www.files.com/badfile2.tar.gz', - 'http://www.files.com/goodfile.tar.gz', - 'http://www.files.com/badfile3.tar.gz' - ], - workingPath: testWorkingPath, - tempArchiveFile: tempArchiveFilePath, - timeout: 0 - }; - downloader = pluginDownloader(settings, logger); + const filePath = join(__dirname, 'replies/test_plugin.zip'); + settings.urls = [ + 'http://www.files.com/badfile1.tar.gz', + 'http://www.files.com/badfile2.tar.gz', + 'http://www.files.com/goodfile.tar.gz', + 'http://www.files.com/badfile3.tar.gz' + ]; const couchdb = nock('http://www.files.com') .defaultReplyHeaders({ @@ -288,8 +185,8 @@ describe('kibana cli', function () { .get('/badfile3.tar.gz') .reply(404); - return downloader.download(settings, logger) - .then(function (data) { + return download(settings, logger) + .then(function () { for (let i = 0; i < logger.log.callCount; i++) { expect(logger.log.getCall(i).args[0]).to.not.match(/badfile3.tar.gz/); } @@ -298,17 +195,11 @@ describe('kibana cli', function () { }); it('should throw an error when it doesn\'t find a good url.', function () { - const settings = { - urls: [ - 'http://www.files.com/badfile1.tar.gz', - 'http://www.files.com/badfile2.tar.gz', - 'http://www.files.com/badfile3.tar.gz' - ], - workingPath: testWorkingPath, - tempArchiveFile: tempArchiveFilePath, - timeout: 0 - }; - downloader = pluginDownloader(settings, logger); + settings.urls = [ + 'http://www.files.com/badfile1.tar.gz', + 'http://www.files.com/badfile2.tar.gz', + 'http://www.files.com/badfile3.tar.gz' + ]; const couchdb = nock('http://www.files.com') .defaultReplyHeaders({ @@ -321,7 +212,7 @@ describe('kibana cli', function () { .get('/badfile3.tar.gz') .reply(404); - return downloader.download(settings, logger) + return download(settings, logger) .then(shouldReject, function (err) { expect(err.message).to.match(/no valid url specified/i); expectWorkingPathEmpty(); diff --git a/src/cli_plugin/install/__tests__/index.js b/src/cli_plugin/install/__tests__/index.js index 0da19de19d0c..4b5e0eb8d367 100644 --- a/src/cli_plugin/install/__tests__/index.js +++ b/src/cli_plugin/install/__tests__/index.js @@ -1,6 +1,6 @@ import expect from 'expect.js'; import sinon from 'sinon'; -import plugin from '../plugin'; +import index from '../index'; describe('kibana cli', function () { @@ -18,8 +18,8 @@ describe('kibana cli', function () { it('should define the command', function () { sinon.spy(program, 'command'); - plugin(program); - expect(program.command.calledWith('plugin')).to.be(true); + index(program); + expect(program.command.calledWith('install ')).to.be(true); program.command.restore(); }); @@ -27,8 +27,8 @@ describe('kibana cli', function () { it('should define the description', function () { sinon.spy(program, 'description'); - plugin(program); - expect(program.description.calledWith('Maintain Plugins')).to.be(true); + index(program); + expect(program.description.calledWith('Install a plugin')).to.be(true); program.description.restore(); }); @@ -37,14 +37,14 @@ describe('kibana cli', function () { const spy = sinon.spy(program, 'option'); const options = [ - /-i/, - /-r/, + /-q/, /-s/, - /-u/, - /-t/ + /-c/, + /-t/, + /-d/ ]; - plugin(program); + index(program); for (let i = 0; i < spy.callCount; i++) { const call = spy.getCall(i); @@ -63,7 +63,7 @@ describe('kibana cli', function () { it('should call the action function', function () { sinon.spy(program, 'action'); - plugin(program); + index(program); expect(program.action.calledOnce).to.be(true); program.action.restore(); diff --git a/src/cli_plugin/install/__tests__/kibana.js b/src/cli_plugin/install/__tests__/kibana.js index a8988052fdf4..792cb32b5262 100644 --- a/src/cli_plugin/install/__tests__/kibana.js +++ b/src/cli_plugin/install/__tests__/kibana.js @@ -1,51 +1,104 @@ import expect from 'expect.js'; import sinon from 'sinon'; -import rimraf from 'rimraf'; -import pluginLogger from '../plugin_logger'; -import pluginInstaller from '../plugin_installer'; -import { mkdirSync } from 'fs'; +import Logger from '../../lib/logger'; import { join } from 'path'; +import rimraf from 'rimraf'; +import mkdirp from 'mkdirp'; +import { existingInstall, checkVersion } from '../kibana'; describe('kibana cli', function () { describe('plugin installer', function () { - describe('pluginInstaller', function () { - let logger; - let testWorkingPath; - let processExitStub; + describe('kibana', function () { + const testWorkingPath = join(__dirname, '.test.data'); + const tempArchiveFilePath = join(testWorkingPath, 'archive.part'); - beforeEach(function () { - processExitStub = undefined; - logger = pluginLogger(false); - testWorkingPath = join(__dirname, '.test.data'); - rimraf.sync(testWorkingPath); - sinon.stub(logger, 'log'); - sinon.stub(logger, 'error'); + const settings = { + workingPath: testWorkingPath, + tempArchiveFile: tempArchiveFilePath, + plugin: 'test-plugin', + version: '1.0.0', + plugins: [ { name: 'foo', path: join(testWorkingPath, 'foo') } ] + }; + + const logger = new Logger(settings); + + describe('checkVersion', function () { + + beforeEach(function () { + rimraf.sync(testWorkingPath); + mkdirp.sync(testWorkingPath); + sinon.stub(logger, 'log'); + sinon.stub(logger, 'error'); + }); + + afterEach(function () { + logger.log.restore(); + logger.error.restore(); + rimraf.sync(testWorkingPath); + }); + + it('should throw an error if plugin does contain a version.', function () { + const errorStub = sinon.stub(); + + try { + checkVersion(settings); + } + catch (err) { + errorStub(err); + } + + expect(errorStub.firstCall.args[0]).to.match(/plugin version not found/i); + }); + + it('should throw an error if plugin version does does not match kibana version', function () { + const errorStub = sinon.stub(); + settings.plugins[0].version = '1.2.3.4'; + + try { + checkVersion(settings); + } + catch (err) { + errorStub(err); + } + + expect(errorStub.firstCall.args[0]).to.match(/incorrect version/i); + }); }); - afterEach(function () { - if (processExitStub) processExitStub.restore(); - logger.log.restore(); - logger.error.restore(); - rimraf.sync(testWorkingPath); - }); + describe('existingInstall', function () { + let testWorkingPath; + let processExitStub; - it('should throw an error if the workingPath already exists.', function () { - processExitStub = sinon.stub(process, 'exit'); - mkdirSync(testWorkingPath); + beforeEach(function () { + processExitStub = sinon.stub(process, 'exit'); + testWorkingPath = join(__dirname, '.test.data'); + rimraf.sync(testWorkingPath); + sinon.stub(logger, 'log'); + sinon.stub(logger, 'error'); + }); - let settings = { - pluginPath: testWorkingPath - }; + afterEach(function () { + processExitStub.restore(); + logger.log.restore(); + logger.error.restore(); + rimraf.sync(testWorkingPath); + }); + + it('should throw an error if the workingPath already exists.', function () { + mkdirp.sync(settings.plugins[0].path); + existingInstall(settings, logger); - var errorStub = sinon.stub(); - return pluginInstaller.install(settings, logger) - .catch(errorStub) - .then(function (data) { expect(logger.error.firstCall.args[0]).to.match(/already exists/); expect(process.exit.called).to.be(true); }); + + it('should not throw an error if the workingPath does not exist.', function () { + existingInstall(settings, logger); + expect(logger.error.called).to.be(false); + }); + }); }); diff --git a/src/cli_plugin/install/__tests__/pack.js b/src/cli_plugin/install/__tests__/pack.js new file mode 100644 index 000000000000..b434160b2c72 --- /dev/null +++ b/src/cli_plugin/install/__tests__/pack.js @@ -0,0 +1,164 @@ +import expect from 'expect.js'; +import sinon from 'sinon'; +import glob from 'glob'; +import rimraf from 'rimraf'; +import mkdirp from 'mkdirp'; +import Logger from '../../lib/logger'; +import { extract, getPackData } from '../pack'; +import { _downloadSingle } from '../download'; +import { join } from 'path'; + +describe('kibana cli', function () { + + describe('plugin extractor', function () { + + const testWorkingPath = join(__dirname, '.test.data'); + const tempArchiveFilePath = join(testWorkingPath, 'archive.part'); + const testPluginPath = join(testWorkingPath, '.installedPlugins'); + let logger; + + const settings = { + workingPath: testWorkingPath, + tempArchiveFile: tempArchiveFilePath, + pluginDir: testPluginPath, + plugin: 'test-plugin' + }; + + beforeEach(function () { + logger = new Logger(settings); + sinon.stub(logger, 'log'); + sinon.stub(logger, 'error'); + rimraf.sync(testWorkingPath); + mkdirp.sync(testWorkingPath); + }); + + afterEach(function () { + logger.log.restore(); + logger.error.restore(); + rimraf.sync(testWorkingPath); + }); + + function copyReplyFile(filename) { + const filePath = join(__dirname, 'replies', filename); + const sourceUrl = 'file://' + filePath.replace(/\\/g, '/'); + + return _downloadSingle(settings, logger, sourceUrl); + } + + function shouldReject() { + throw new Error('expected the promise to reject'); + } + + describe('extract', function () { + + //Also only extracts the content from the kibana folder. + //Ignores the others. + it('successfully extract a valid zip', function () { + return copyReplyFile('test_plugin.zip') + .then(() => { + return getPackData(settings, logger); + }) + .then(() => { + return extract(settings, logger); + }) + .then(() => { + const files = glob.sync('**/*', { cwd: testWorkingPath }); + const expected = [ + 'archive.part', + 'README.md', + 'index.js', + 'package.json', + 'public', + 'public/app.js', + 'extra file only in zip.txt' + ]; + expect(files.sort()).to.eql(expected.sort()); + }); + }); + + }); + + describe('getPackData', function () { + + it('populate settings.plugins', function () { + return copyReplyFile('test_plugin.zip') + .then(() => { + return getPackData(settings, logger); + }) + .then(() => { + expect(settings.plugins[0].name).to.be('test-plugin'); + expect(settings.plugins[0].folder).to.be('test-plugin'); + expect(settings.plugins[0].version).to.be('1.0.0'); + expect(settings.plugins[0].platform).to.be(undefined); + }); + }); + + it('populate settings.plugins with multiple plugins', function () { + return copyReplyFile('test_plugin_many.zip') + .then(() => { + return getPackData(settings, logger); + }) + .then(() => { + expect(settings.plugins[0].name).to.be('funger-plugin'); + expect(settings.plugins[0].file).to.be('kibana/funger-plugin/package.json'); + expect(settings.plugins[0].folder).to.be('funger-plugin'); + expect(settings.plugins[0].version).to.be('1.0.0'); + expect(settings.plugins[0].platform).to.be(undefined); + + expect(settings.plugins[1].name).to.be('pdf'); + expect(settings.plugins[1].file).to.be('kibana/pdf-linux/package.json'); + expect(settings.plugins[1].folder).to.be('pdf-linux'); + expect(settings.plugins[1].version).to.be('1.0.0'); + expect(settings.plugins[1].platform).to.be('linux'); + + expect(settings.plugins[2].name).to.be('pdf'); + expect(settings.plugins[2].file).to.be('kibana/pdf-win32/package.json'); + expect(settings.plugins[2].folder).to.be('pdf-win32'); + expect(settings.plugins[2].version).to.be('1.0.0'); + expect(settings.plugins[2].platform).to.be('win32'); + + expect(settings.plugins[3].name).to.be('pdf'); + expect(settings.plugins[3].file).to.be('kibana/pdf-win64/package.json'); + expect(settings.plugins[3].folder).to.be('pdf-win64'); + expect(settings.plugins[3].version).to.be('1.0.0'); + expect(settings.plugins[3].platform).to.be('win64'); + + expect(settings.plugins[4].name).to.be('pdf'); + expect(settings.plugins[4].file).to.be('kibana/pdf/package.json'); + expect(settings.plugins[4].folder).to.be('pdf'); + expect(settings.plugins[4].version).to.be('1.0.0'); + expect(settings.plugins[4].platform).to.be(undefined); + + expect(settings.plugins[5].name).to.be('test-plugin'); + expect(settings.plugins[5].file).to.be('kibana/test-plugin/package.json'); + expect(settings.plugins[5].folder).to.be('test-plugin'); + expect(settings.plugins[5].version).to.be('1.0.0'); + expect(settings.plugins[5].platform).to.be(undefined); + }); + }); + + it('throw an error if there is no kibana plugin', function () { + return copyReplyFile('test_plugin_no_kibana.zip') + .then((data) => { + return getPackData(settings, logger); + }) + .then(shouldReject, (err) => { + expect(err.message).to.match(/No kibana plugins found in archive/i); + }); + }); + + it('throw an error with a corrupt zip', function () { + return copyReplyFile('corrupt.zip') + .then((data) => { + return getPackData(settings, logger); + }) + .then(shouldReject, (err) => { + expect(err.message).to.match(/error retrieving/i); + }); + }); + + }); + + }); + +}); diff --git a/src/cli_plugin/install/__tests__/progress.js b/src/cli_plugin/install/__tests__/progress.js index 5f81f509c183..15f4fd9a1bc1 100644 --- a/src/cli_plugin/install/__tests__/progress.js +++ b/src/cli_plugin/install/__tests__/progress.js @@ -1,23 +1,22 @@ import expect from 'expect.js'; import sinon from 'sinon'; -import progressReporter from '../progress_reporter'; -import pluginLogger from '../plugin_logger'; +import Progress from '../progress'; +import Logger from '../../lib/logger'; describe('kibana cli', function () { describe('plugin installer', function () { describe('progressReporter', function () { - let logger; let progress; let request; beforeEach(function () { - logger = pluginLogger({ silent: false, quiet: false }); + logger = new Logger({ silent: false, quiet: false }); sinon.stub(logger, 'log'); sinon.stub(logger, 'error'); - progress = progressReporter(logger); + progress = new Progress(logger); }); afterEach(function () { diff --git a/src/cli_plugin/install/__tests__/replies/corrupt.tar.gz b/src/cli_plugin/install/__tests__/replies/corrupt.tar.gz deleted file mode 100644 index d737f1ef2271bea1798031b92c79988371367fd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1981 zcmb2|=3oE==C?D>=if3AId1tme8*0PAWjvl>i|Ols%5KX4U;LkQUw6{HWe1+53RpRt z%N;O~Xe;bEDElkU-pj71*1V_PZiiyU;S?D&|GAqN+NnI*H2Y$b6ED}*Yx#$hkF}n; zs469{Gp)t=%06|$v>nZLrh-BW+y@1kC0EUQtN(OXX120Z_dDf~yGkvab84F>s7yM< zv31`|qu{SD;gQ#@;wvZ2Fn($<)kyklmE=)Fmx!%5c~bH(y#IcsDd3&c=vzv`S#)5*Zt3b-WFCm*;2@8 zdUVCB{|}x%fB)vne}#fO#{$(p&b6;UCcMM9GAQ7L|J?3}Ki*vYfBp69{`u?Qnyl15 z=JA&A@bpJ2e_x>YG2ehna-OL0 zQxW&Swn;4Flcu)v%5b06LiS%^OSeu;p9(raG`?F{cZQ1#^iw-Ewo0e8@+IyxxGwy$p g-tz0Mp4FrpNbs;VA4~vJ`P1%S^IkrkL4$z-0Q|_`zW@LL diff --git a/src/cli_plugin/install/__tests__/replies/package.no_version.json b/src/cli_plugin/install/__tests__/replies/package.no_version.json new file mode 100644 index 000000000000..874c3e5a0460 --- /dev/null +++ b/src/cli_plugin/install/__tests__/replies/package.no_version.json @@ -0,0 +1,3 @@ +{ + "name": "test-plugin", +} diff --git a/src/cli_plugin/install/__tests__/replies/plugin_no_package.gz b/src/cli_plugin/install/__tests__/replies/plugin_no_package.gz deleted file mode 100644 index 8695565d86ff722b7ba77390a4f9a96fc2dca554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 533 zcmV+w0_y!AiwFS5NS###0PUASZ<{a_$9>MH@J>mj6@r8DNYz87^{~UFY1(C{$bpx{ z8`#X4Ez*?lJ_A|XjdVy8LTcmRfhX(-2;TeujSGHQ?=rRF*?JE=1&xMhVTq#1#)dy* zGZ~_Q(2!8JjDmVR2x-934vj!n8m{dlwNmC^c|G%;mwP5qf)kbJAk9t0f|w*B#8J!= z#(~6ix!9y{wv@0Wra%}h<8;d=$njz@P@1bEt9C+O<-9bYeKa(+9vGut{Xfvre?%Cf zXap`?|7Ys&?Sv6KsWhNrX#GEYy8c1O|Dz}%Xq1n5;q{j)g>|mdDuWU^E{-$$|9E%% z_Whlgr)VI0^-sv(`nO@>^gjacFwZf^bsONe4Upr4IHP|dQ#g2EhFcE$^uMH0NB>Kw z|50d{eh&_X(x${Wcw5QD2qp3CtJrYK=lJIYV-2R#5=;1j+hOlR(=#(WX*pfKs&gB7 zQ8Xtfj4&Cj@bpt{Gwqf5wkW2r?=wWAq)pfxQ>=Wy$an%9ZpS~nkLQ{Hj%`*@sRPmb5f(Xaoa+GHXba2xm^`#&3~+y9Ngll8A{@KXM8oS X?RD<_)!}eBo(;bM_{Uh?02}}SjqDPz diff --git a/src/cli_plugin/install/__tests__/replies/test_plugin.zip b/src/cli_plugin/install/__tests__/replies/test_plugin.zip new file mode 100644 index 0000000000000000000000000000000000000000..1ec957f80128be83d85fc12e5a657a8e1f059f9b GIT binary patch literal 2314 zcmWIWW@Zs#0D)~0J|18Ol;8u>sX2+oC7H>^sfk6&8TtWmwPum1YT1Emvon(t^AhnW z5=JO0Ni8nXEyyWN&&&gB-~!wEDfx!mQnvjaJU|`@%VO7{m!4UYnVy$ll$w{Hk{X|z zpHiBWS`2a=#2D|oLU*uvP(l~GF{u?LMTrV&nK`Kn`FS~&3YmEdRhb2PB^4zwe{wK@ zTx4*Brgq;F2k9>uB?XUG7g~(`vJ6 zZ`rn8Jo4ea*orfWlV{c%@7>SZE?Rek-{=tMyGE;x^A=Rxyf#7e;cP}8jYI{7n!{4z z;^K1Cx_ov7GGe6&TyKydZp?h1njIq4{(W_z8lQUJsek2KvvacQP<<8C%65p8k%8e35X)otRY78M zc4B%e&|mp^u@lbb9aa!%d0)x($~#I^vG1;1R$guY3ZY}#($krerbmTME!R(YzWm{_ zn%&0C`?Zg8Deqfov8jn6^L5FKDVk=Se;V9VeUqx=J{5&UJG`8_xRr;olXKd%n}0X4 zrw2~_8a&6#GH~(9r%U_-WljZsu+p@hX#K8C*`$!YLaO7>oVm{|_S|$y4r23su_rr+ z8whpRI<9WazHK|dtK#*Z1q)nPbxE7uJm8i+@8A63kDJa#o_;JdL#!vHK>WrFhTc!P zUccA;uwH-KyZ(aGw23tbc)ss>)X(EsaWnnTvD4CWYfe3C-2ds9Qr2y*Iqk0{O0K%| zf6D%7;nJU-yjDfx%>7>vTizr_tJcK*WrT$y0|R;;uVSPvfLZBP(kIj}!;js8M5?T?uW6TMF?tayI>#%|-8u2UB7P@BAt zqj~!2gd^6B)sHu9$hjN%y_jU&IDuy62;4Mrw=23&=V z3Q#Es2tX*bB8LkcJPZts3=#}>1qWwuPrb;9P9vL-9x3b$$mZ(+?SK|j$OhkAvQTRW z&|nyS#q%M5rQ$_kTq7KgZm=+l!GQ>ak&8BDOP1R%0$T#3SC&<61^EVI39bSV=6VI7 z1x?s3K@^9`)-il(W>~ZC0%PS2h+kkdvUQjRC9-uVv0I0`*hH~@vD?>1U=V8VGMotV zC5%P{DYn8D*?JLR!32#faQcm}Z$ zMk6f5Ry@Eg1f_HXW~{y|fD{(UcEQpMjCM15gqAq56)7;g6o7VR;I#`Wvkd1Z?Pnr)(eCTw5 UH!B-Z9|JcKP6TRB24V&V0DPC7_W%F@ literal 0 HcmV?d00001 diff --git a/src/cli_plugin/install/__tests__/replies/test_plugin_many.zip b/src/cli_plugin/install/__tests__/replies/test_plugin_many.zip new file mode 100644 index 0000000000000000000000000000000000000000..e4fc8d73feef86f0f34073e0597c6c2351dc4d05 GIT binary patch literal 421587 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 z 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

}$Ej$& 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 Y2N{h{2Y9oxf$V1j!reeR7{p-!0Hdolq5uE@ literal 0 HcmV?d00001 diff --git a/src/cli_plugin/install/__tests__/settings.js b/src/cli_plugin/install/__tests__/settings.js index bf47bd7c82c1..8f2baa9f295a 100644 --- a/src/cli_plugin/install/__tests__/settings.js +++ b/src/cli_plugin/install/__tests__/settings.js @@ -1,8 +1,8 @@ import path from 'path'; import expect from 'expect.js'; - import fromRoot from '../../../utils/from_root'; -import settingParser from '../setting_parser'; +import { resolve } from 'path'; +import { parseMilliseconds, parse, getPlatform } from '../settings'; describe('kibana cli', function () { @@ -12,56 +12,53 @@ describe('kibana cli', function () { describe('parseMilliseconds function', function () { - var parser = settingParser(); - it('should return 0 for an empty string', function () { - var value = ''; - - var result = parser.parseMilliseconds(value); + const value = ''; + const result = parseMilliseconds(value); expect(result).to.be(0); }); it('should return 0 for a number with an invalid unit of measure', function () { - var result = parser.parseMilliseconds('1gigablasts'); + const result = parseMilliseconds('1gigablasts'); expect(result).to.be(0); }); it('should assume a number with no unit of measure is specified as milliseconds', function () { - var result = parser.parseMilliseconds(1); + const result = parseMilliseconds(1); expect(result).to.be(1); - result = parser.parseMilliseconds('1'); - expect(result).to.be(1); + const result2 = parseMilliseconds('1'); + expect(result2).to.be(1); }); it('should interpret a number with "s" as the unit of measure as seconds', function () { - var result = parser.parseMilliseconds('5s'); + const result = parseMilliseconds('5s'); expect(result).to.be(5 * 1000); }); it('should interpret a number with "second" as the unit of measure as seconds', function () { - var result = parser.parseMilliseconds('5second'); + const result = parseMilliseconds('5second'); expect(result).to.be(5 * 1000); }); it('should interpret a number with "seconds" as the unit of measure as seconds', function () { - var result = parser.parseMilliseconds('5seconds'); + const result = parseMilliseconds('5seconds'); expect(result).to.be(5 * 1000); }); it('should interpret a number with "m" as the unit of measure as minutes', function () { - var result = parser.parseMilliseconds('9m'); + const result = parseMilliseconds('9m'); expect(result).to.be(9 * 1000 * 60); }); it('should interpret a number with "minute" as the unit of measure as minutes', function () { - var result = parser.parseMilliseconds('9minute'); + const result = parseMilliseconds('9minute'); expect(result).to.be(9 * 1000 * 60); }); it('should interpret a number with "minutes" as the unit of measure as minutes', function () { - var result = parser.parseMilliseconds('9minutes'); + const result = parseMilliseconds('9minutes'); expect(result).to.be(9 * 1000 * 60); }); @@ -69,65 +66,41 @@ describe('kibana cli', function () { describe('parse function', function () { - var options; - var parser; + const command = 'plugin name'; + let options = {}; + const kbnPackage = { version: 1234 }; beforeEach(function () { - options = { install: 'dummy/dummy', pluginDir: fromRoot('installedPlugins') }; + options = { pluginDir: fromRoot('installedPlugins') }; }); - it('should require the user to specify either install, remove, or list', function () { - options.install = null; - parser = settingParser(options); + describe('timeout option', function () { - expect(parser.parse).withArgs().to.throwError(/Please specify either --install, --remove, or --list./); - }); + it('should default to 0 (milliseconds)', function () { + const settings = parse(command, options, kbnPackage); - it('should not allow the user to specify both install and remove', function () { - options.remove = 'package'; - options.install = 'org/package/version'; - parser = settingParser(options); + expect(settings.timeout).to.be(0); + }); - expect(parser.parse).withArgs().to.throwError(/Please specify either --install, --remove, or --list./); - }); + it('should set settings.timeout property', function () { + options.timeout = 1234; + const settings = parse(command, options, kbnPackage); - it('should not allow the user to specify both install and list', function () { - options.list = true; - options.install = 'org/package/version'; - parser = settingParser(options); + expect(settings.timeout).to.be(1234); + }); - expect(parser.parse).withArgs().to.throwError(/Please specify either --install, --remove, or --list./); - }); - - it('should not allow the user to specify both remove and list', function () { - options.list = true; - options.remove = 'package'; - parser = settingParser(options); - - expect(parser.parse).withArgs().to.throwError(/Please specify either --install, --remove, or --list./); - }); - - it('should not allow the user to specify install, remove, and list', function () { - options.list = true; - options.install = 'org/package/version'; - options.remove = 'package'; - parser = settingParser(options); - - expect(parser.parse).withArgs().to.throwError(/Please specify either --install, --remove, or --list./); }); describe('quiet option', function () { it('should default to false', function () { - parser = settingParser(options); - var settings = parser.parse(options); + const settings = parse(command, options, kbnPackage); expect(settings.quiet).to.be(false); }); it('should set settings.quiet property to true', function () { - options.parent = { quiet: true }; - parser = settingParser(options); - var settings = parser.parse(options); + options.quiet = true; + const settings = parse(command, options, kbnPackage); expect(settings.quiet).to.be(true); }); @@ -137,238 +110,111 @@ describe('kibana cli', function () { describe('silent option', function () { it('should default to false', function () { - parser = settingParser(options); - var settings = parser.parse(options); + const settings = parse(command, options, kbnPackage); - expect(settings).to.have.property('silent', false); + expect(settings.silent).to.be(false); }); it('should set settings.silent property to true', function () { options.silent = true; - parser = settingParser(options); - var settings = parser.parse(options); + const settings = parse(command, options, kbnPackage); - expect(settings).to.have.property('silent', true); + expect(settings.silent).to.be(true); }); }); + describe('config option', function () { - describe('timeout option', function () { + it('should default to ZLS', function () { + const settings = parse(command, options, kbnPackage); - it('should default to 0 (milliseconds)', function () { - parser = settingParser(options); - var settings = parser.parse(options); - - expect(settings).to.have.property('timeout', 0); + expect(settings.config).to.be(''); }); - it('should set settings.timeout property to specified value', function () { - options.timeout = 1234; - parser = settingParser(options); - var settings = parser.parse(options); + it('should set settings.config property', function () { + options.config = 'foo bar baz'; + const settings = parse(command, options, kbnPackage); - expect(settings).to.have.property('timeout', 1234); + expect(settings.config).to.be('foo bar baz'); }); }); - describe('install option', function () { + describe('pluginDir option', function () { - it('should set settings.action property to "install"', function () { - options.install = 'org/package/version'; - parser = settingParser(options); - var settings = parser.parse(options); + it('should default to installedPlugins', function () { + const settings = parse(command, options, kbnPackage); - expect(settings).to.have.property('action', 'install'); + expect(settings.pluginDir).to.be(fromRoot('installedPlugins')); }); - it('should allow two parts to the install parameter', function () { - options.install = 'kibana/test-plugin'; - parser = settingParser(options); - - expect(parser.parse).withArgs().to.not.throwError(); - - var settings = parser.parse(options); - - expect(settings).to.have.property('organization', 'kibana'); - expect(settings).to.have.property('package', 'test-plugin'); - expect(settings).to.have.property('version', undefined); - }); - - it('should allow three parts to the install parameter', function () { - options.install = 'kibana/test-plugin/v1.0.1'; - parser = settingParser(options); - - expect(parser.parse).withArgs().to.not.throwError(); - - var settings = parser.parse(options); - - expect(settings).to.have.property('organization', 'kibana'); - expect(settings).to.have.property('package', 'test-plugin'); - expect(settings).to.have.property('version', 'v1.0.1'); - }); - - it('should not allow one part to the install parameter', function () { - options.install = 'test-plugin'; - parser = settingParser(options); - - expect(parser.parse).withArgs().to.throwError(/Invalid install option. Please use the format \/\/./); - }); - - it('should not allow more than three parts to the install parameter', function () { - options.install = 'kibana/test-plugin/v1.0.1/dummy'; - parser = settingParser(options); - - expect(parser.parse).withArgs().to.throwError(/Invalid install option. Please use the format \/\/./); - }); - - it('should populate the urls collection properly when no version specified', function () { - options.install = 'kibana/test-plugin'; - parser = settingParser(options); - - var settings = parser.parse(); - - expect(settings.urls).to.have.property('length', 1); - expect(settings.urls).to.contain('https://download.elastic.co/kibana/test-plugin/test-plugin-latest.tar.gz'); - }); - - it('should populate the urls collection properly version specified', function () { - options.install = 'kibana/test-plugin/v1.1.1'; - parser = settingParser(options); - - var settings = parser.parse(); - - expect(settings.urls).to.have.property('length', 1); - expect(settings.urls).to.contain('https://download.elastic.co/kibana/test-plugin/test-plugin-v1.1.1.tar.gz'); - }); - - it('should populate the pluginPath', function () { - options.install = 'kibana/test-plugin'; - parser = settingParser(options); - - var settings = parser.parse(); - var expected = fromRoot('installedPlugins/test-plugin'); - - expect(settings).to.have.property('pluginPath', expected); - }); - - it('should populate the workingPath', function () { - options.install = 'kibana/test-plugin'; - parser = settingParser(options); - - var settings = parser.parse(); - var expected = fromRoot('installedPlugins/.plugin.installing'); - - expect(settings).to.have.property('workingPath', expected); - }); - - it('should populate the tempArchiveFile', function () { - options.install = 'kibana/test-plugin'; - parser = settingParser(options); - - var settings = parser.parse(); - var expected = fromRoot('installedPlugins/.plugin.installing/archive.part'); - - expect(settings).to.have.property('tempArchiveFile', expected); - }); - - describe('with url option', function () { - - it('should allow one part to the install parameter', function () { - options.install = 'test-plugin'; - options.url = 'http://www.google.com/plugin.tar.gz'; - parser = settingParser(options); - - expect(parser.parse).withArgs().to.not.throwError(); - - var settings = parser.parse(); - - expect(settings).to.have.property('package', 'test-plugin'); - }); - - it('should not allow more than one part to the install parameter', function () { - options.url = 'http://www.google.com/plugin.tar.gz'; - options.install = 'kibana/test-plugin'; - parser = settingParser(options); - - expect(parser.parse).withArgs() - .to.throwError(/Invalid install option. When providing a url, please use the format ./); - }); - - it('should result in only the specified url in urls collection', function () { - var url = 'http://www.google.com/plugin.tar.gz'; - options.install = 'test-plugin'; - options.url = url; - parser = settingParser(options); - - var settings = parser.parse(); - - expect(settings).to.have.property('urls'); - expect(settings.urls).to.be.an('array'); - expect(settings.urls).to.have.property('length', 1); - expect(settings.urls).to.contain(url); - }); + it('should set settings.config property', function () { + options.pluginDir = 'foo bar baz'; + const settings = parse(command, options, kbnPackage); + expect(settings.pluginDir).to.be('foo bar baz'); }); }); - describe('remove option', function () { + describe('command value', function () { - it('should set settings.action property to "remove"', function () { - delete options.install; - options.remove = 'package'; - parser = settingParser(options); + it('should set settings.plugin property', function () { + const settings = parse(command, options, kbnPackage); - var settings = parser.parse(); - - expect(settings).to.have.property('action', 'remove'); - }); - - it('should allow one part to the remove parameter', function () { - delete options.install; - options.remove = 'test-plugin'; - parser = settingParser(options); - - var settings = parser.parse(); - - expect(settings).to.have.property('package', 'test-plugin'); - }); - - it('should not allow more than one part to the remove parameter', function () { - delete options.install; - options.remove = 'kibana/test-plugin'; - parser = settingParser(options); - - expect(parser.parse).withArgs() - .to.throwError(/Invalid remove option. Please use the format ./); - }); - - it('should populate the pluginPath', function () { - delete options.install; - options.remove = 'test-plugin'; - parser = settingParser(options); - - var settings = parser.parse(); - var expected = fromRoot('installedPlugins/test-plugin'); - - expect(settings).to.have.property('pluginPath', expected); + expect(settings.plugin).to.be(command); }); }); - describe('list option', function () { + describe('urls collection', function () { - it('should set settings.action property to "list"', function () { - delete options.install; - delete options.remove; - options.list = true; - parser = settingParser(options); + it('should populate the settings.urls property', function () { + const settings = parse(command, options, kbnPackage); - var settings = parser.parse(); + const expected = [ + command, + `https://download.elastic.co/packs/${command}/${command}-1234.zip` + ]; - expect(settings).to.have.property('action', 'list'); + expect(settings.urls).to.eql(expected); + }); + + }); + + describe('workingPath value', function () { + + it('should set settings.workingPath property', function () { + options.pluginDir = 'foo/bar/baz'; + const settings = parse(command, options, kbnPackage); + const expected = resolve('foo/bar/baz', '.plugin.installing'); + + expect(settings.workingPath).to.be(expected); + }); + + }); + + describe('tempArchiveFile value', function () { + + it('should set settings.tempArchiveFile property', function () { + options.pluginDir = 'foo/bar/baz'; + const settings = parse(command, options, kbnPackage); + const expected = resolve('foo/bar/baz', '.plugin.installing', 'archive.part'); + + expect(settings.tempArchiveFile).to.be(expected); + }); + + }); + + describe('tempPackageFile value', function () { + + it('should set settings.tempPackageFile property', function () { + options.pluginDir = 'foo/bar/baz'; + const settings = parse(command, options, kbnPackage); + const expected = resolve('foo/bar/baz', '.plugin.installing', 'package.json'); + + expect(settings.tempPackageFile).to.be(expected); }); }); diff --git a/src/cli_plugin/install/__tests__/zip.js b/src/cli_plugin/install/__tests__/zip.js index 7bbb5b737a68..af114601e9da 100644 --- a/src/cli_plugin/install/__tests__/zip.js +++ b/src/cli_plugin/install/__tests__/zip.js @@ -1,13 +1,12 @@ import expect from 'expect.js'; import sinon from 'sinon'; -import glob from 'glob-all'; +import glob from 'glob'; import rimraf from 'rimraf'; import mkdirp from 'mkdirp'; - -import pluginLogger from '../plugin_logger'; -import extract from '../plugin_extractor'; -import pluginDownloader from '../plugin_downloader'; +import Logger from '../../lib/logger'; +import { _downloadSingle } from '../download'; import { join } from 'path'; +import { listFiles, extractFiles } from '../zip'; describe('kibana cli', function () { @@ -16,11 +15,12 @@ describe('kibana cli', function () { const testWorkingPath = join(__dirname, '.test.data'); const tempArchiveFilePath = join(testWorkingPath, 'archive.part'); let logger; - let downloader; const settings = { workingPath: testWorkingPath, - tempArchiveFile: tempArchiveFilePath + tempArchiveFile: tempArchiveFilePath, + plugin: 'test-plugin', + setPlugin: function (plugin) {} }; function shouldReject() { @@ -28,17 +28,18 @@ describe('kibana cli', function () { } beforeEach(function () { - logger = pluginLogger(false); + logger = new Logger(settings); sinon.stub(logger, 'log'); sinon.stub(logger, 'error'); + sinon.stub(settings, 'setPlugin'); rimraf.sync(testWorkingPath); mkdirp.sync(testWorkingPath); - downloader = pluginDownloader(settings, logger); }); afterEach(function () { logger.log.restore(); logger.error.restore(); + settings.setPlugin.restore(); rimraf.sync(testWorkingPath); }); @@ -46,86 +47,99 @@ describe('kibana cli', function () { const filePath = join(__dirname, 'replies', filename); const sourceUrl = 'file://' + filePath.replace(/\\/g, '/'); - return downloader._downloadSingle(sourceUrl); + return _downloadSingle(settings, logger, sourceUrl); } - function shouldReject() { - throw new Error('expected the promise to reject'); - } + describe('listFiles', function () { - describe('extractArchive', function () { - - it('successfully extract a valid tarball', function () { - return copyReplyFile('test_plugin_master.tar.gz') - .then((data) => { - return extract(settings, logger, data.archiveType); - }) + it('lists the files in the zip', function () { + return copyReplyFile('test_plugin.zip') .then(() => { - const files = glob.sync('**/*', { cwd: testWorkingPath }); + return listFiles(settings.tempArchiveFile); + }) + .then((actual) => { const expected = [ - 'archive.part', - 'README.md', - 'index.js', - 'package.json', - 'public', - 'public/app.js' + 'elasticsearch\\', + 'kibana\\', + 'kibana\\test-plugin\\', + 'kibana\\test-plugin\\.gitignore', + 'kibana\\test-plugin\\extra file only in zip.txt', + 'kibana\\test-plugin\\index.js', + 'kibana\\test-plugin\\package.json', + 'kibana\\test-plugin\\public\\', + 'kibana\\test-plugin\\public\\app.js', + 'kibana\\test-plugin\\README.md', + 'logstash\\' ]; - expect(files.sort()).to.eql(expected.sort()); - }); - }); - it('successfully extract a valid zip', function () { - return copyReplyFile('test_plugin_master.zip') - .then((data) => { - return extract(settings, logger, data.archiveType); - }) - .then(() => { - const files = glob.sync('**/*', { cwd: testWorkingPath }); - const expected = [ - 'archive.part', - 'README.md', - 'index.js', - 'package.json', - 'public', - 'public/app.js', - 'extra file only in zip.txt' - ]; - expect(files.sort()).to.eql(expected.sort()); - }); - }); - - it('throw an error when extracting a corrupt zip', function () { - return copyReplyFile('corrupt.zip') - .then((data) => { - return extract(settings, logger, data.archiveType); - }) - .then(shouldReject, (err) => { - expect(err.message).to.match(/error extracting/i); - }); - }); - - it('throw an error when extracting a corrupt tarball', function () { - return copyReplyFile('corrupt.tar.gz') - .then((data) => { - return extract(settings, logger, data.archiveType); - }) - .then(shouldReject, (err) => { - expect(err.message).to.match(/error extracting/i); - }); - }); - - it('throw an error when passed an unknown archive type', function () { - return copyReplyFile('banana.jpg') - .then((data) => { - return extract(settings, logger, data.archiveType); - }) - .then(shouldReject, (err) => { - expect(err.message).to.match(/unsupported archive format/i); + expect(actual).to.eql(expected); }); }); }); + describe('extractFiles', function () { + + it('extracts files using the files filter', function () { + return copyReplyFile('test_plugin_many.zip') + .then(() => { + const filter = { + files: [ + 'kibana/funger-plugin/extra file only in zip.txt', + 'kibana/funger-plugin/index.js', + 'kibana\\funger-plugin\\package.json' + ] + }; + + return extractFiles(settings.tempArchiveFile, settings.workingPath, 0, filter); + }) + .then(() => { + const files = glob.sync('**/*', { cwd: testWorkingPath }); + const expected = [ + 'kibana', + 'kibana/funger-plugin', + 'kibana/funger-plugin/extra file only in zip.txt', + 'kibana/funger-plugin/index.js', + 'kibana/funger-plugin/package.json', + 'archive.part' + ]; + expect(files.sort()).to.eql(expected.sort()); + }); + }); + + it('extracts files using the paths filter', function () { + return copyReplyFile('test_plugin_many.zip') + .then(() => { + const filter = { + paths: [ + 'kibana/funger-plugin', + 'kibana/test-plugin/public' + ] + }; + + return extractFiles(settings.tempArchiveFile, settings.workingPath, 0, filter); + }) + .then(() => { + const files = glob.sync('**/*', { cwd: testWorkingPath }); + const expected = [ + 'archive.part', + 'kibana', + 'kibana/funger-plugin', + 'kibana/funger-plugin/README.md', + 'kibana/funger-plugin/extra file only in zip.txt', + 'kibana/funger-plugin/index.js', + 'kibana/funger-plugin/package.json', + 'kibana/funger-plugin/public', + 'kibana/funger-plugin/public/app.js', + 'kibana/test-plugin', + 'kibana/test-plugin/public', + 'kibana/test-plugin/public/app.js' + ]; + expect(files.sort()).to.eql(expected.sort()); + }); + }); + }); + }); }); diff --git a/src/cli_plugin/install/cleanup.js b/src/cli_plugin/install/cleanup.js index d3bffdd46e82..5ba48f87d14b 100644 --- a/src/cli_plugin/install/cleanup.js +++ b/src/cli_plugin/install/cleanup.js @@ -1,39 +1,32 @@ import rimraf from 'rimraf'; import fs from 'fs'; -export default function createPluginCleaner(settings, logger) { - function cleanPrevious() { - return new Promise(function (resolve, reject) { - try { - fs.statSync(settings.workingPath); - - logger.log('Found previous install attempt. Deleting...'); - try { - rimraf.sync(settings.workingPath); - } catch (e) { - return reject(e); - } - return resolve(); - } catch (e) { - if (e.code !== 'ENOENT') return reject(e); - - return resolve(); - } - }); - } - - function cleanError() { - // delete the working directory. - // At this point we're bailing, so swallow any errors on delete. +export function cleanPrevious(settings, logger) { + return new Promise(function (resolve, reject) { try { - rimraf.sync(settings.workingPath); - rimraf.sync(settings.pluginPath); - } - catch (e) {} // eslint-disable-line no-empty - } + fs.statSync(settings.workingPath); - return { - cleanPrevious: cleanPrevious, - cleanError: cleanError - }; + logger.log('Found previous install attempt. Deleting...'); + try { + rimraf.sync(settings.workingPath); + } catch (e) { + reject(e); + } + resolve(); + } catch (e) { + if (e.code !== 'ENOENT') reject(e); + + resolve(); + } + }); +}; + +export function cleanError(settings) { + // delete the working directory. + // At this point we're bailing, so swallow any errors on delete. + try { + rimraf.sync(settings.workingPath); + rimraf.sync(settings.plugins[0].path); + } + catch (e) {} // eslint-disable-line no-empty }; diff --git a/src/cli_plugin/install/download.js b/src/cli_plugin/install/download.js index 7b1affe39d37..2eda842141f8 100644 --- a/src/cli_plugin/install/download.js +++ b/src/cli_plugin/install/download.js @@ -1,51 +1,41 @@ import _ from 'lodash'; import downloadHttpFile from './downloaders/http'; import downloadLocalFile from './downloaders/file'; -import { parse as urlParse } from 'url'; +import { parse } from 'url'; -export default function createPluginDownloader(settings, logger) { - let archiveType; - let sourceType; +export function _downloadSingle(settings, logger, sourceUrl) { + const urlInfo = parse(sourceUrl); + let downloadPromise; - //Attempts to download each url in turn until one is successful - function download() { - const urls = settings.urls.slice(0); + if (/^file/.test(urlInfo.protocol)) { + downloadPromise = downloadLocalFile(logger, decodeURI(urlInfo.path), settings.tempArchiveFile); + } else { + downloadPromise = downloadHttpFile(logger, sourceUrl, settings.tempArchiveFile, settings.timeout); + } - function tryNext() { - const sourceUrl = urls.shift(); - if (!sourceUrl) { - throw new Error('No valid url specified.'); + return downloadPromise; +} + +//Attempts to download each url in turn until one is successful +export function download(settings, logger) { + const urls = settings.urls.slice(0); + + function tryNext() { + const sourceUrl = urls.shift(); + if (!sourceUrl) { + throw new Error('No valid url specified.'); + } + + logger.log(`Attempting to transfer from ${sourceUrl}`); + + return _downloadSingle(settings, logger, sourceUrl) + .catch((err) => { + if (err.message === 'ENOTFOUND') { + return tryNext(); } - - logger.log(`Attempting to transfer from ${sourceUrl}`); - - return downloadSingle(sourceUrl) - .catch((err) => { - if (err.message === 'ENOTFOUND') { - return tryNext(); - } - throw (err); - }); - } - - return tryNext(); + throw (err); + }); } - function downloadSingle(sourceUrl) { - const urlInfo = urlParse(sourceUrl); - let downloadPromise; - - if (/^file/.test(urlInfo.protocol)) { - downloadPromise = downloadLocalFile(logger, urlInfo.path, settings.tempArchiveFile); - } else { - downloadPromise = downloadHttpFile(logger, sourceUrl, settings.tempArchiveFile, settings.timeout); - } - - return downloadPromise; - } - - return { - download: download, - _downloadSingle: downloadSingle - }; + return tryNext(); }; diff --git a/src/cli_plugin/install/downloaders/file.js b/src/cli_plugin/install/downloaders/file.js index 7ccaf290df56..505a103755e6 100644 --- a/src/cli_plugin/install/downloaders/file.js +++ b/src/cli_plugin/install/downloaders/file.js @@ -1,6 +1,5 @@ -import getProgressReporter from '../progress_reporter'; +import Progress from '../progress'; import { createWriteStream, createReadStream, unlinkSync, statSync } from 'fs'; -import fileType from '../file_type'; function openSourceFile({ sourcePath }) { try { @@ -18,7 +17,7 @@ function openSourceFile({ sourcePath }) { } } -async function copyFile({ readStream, writeStream, progressReporter }) { +async function copyFile({ readStream, writeStream, progress }) { await new Promise((resolve, reject) => { // if either stream errors, fail quickly readStream.on('error', reject); @@ -26,7 +25,7 @@ async function copyFile({ readStream, writeStream, progressReporter }) { // report progress as we transfer readStream.on('data', (chunk) => { - progressReporter.progress(chunk.length); + progress.progress(chunk.length); }); // write the download to the file system @@ -46,21 +45,17 @@ export default async function copyLocalFile(logger, sourcePath, targetPath) { const writeStream = createWriteStream(targetPath); try { - const progressReporter = getProgressReporter(logger); - progressReporter.init(fileInfo.size); + const progress = new Progress(logger); + progress.init(fileInfo.size); - await copyFile({ readStream, writeStream, progressReporter }); + await copyFile({ readStream, writeStream, progress }); - progressReporter.complete(); + progress.complete(); } catch (err) { readStream.close(); writeStream.close(); throw err; } - - // all is well, return our archive type - const archiveType = fileType(sourcePath); - return { archiveType }; } catch (err) { logger.error(err); throw err; diff --git a/src/cli_plugin/install/downloaders/http.js b/src/cli_plugin/install/downloaders/http.js index 436f07b2e117..40069c4cd063 100644 --- a/src/cli_plugin/install/downloaders/http.js +++ b/src/cli_plugin/install/downloaders/http.js @@ -1,8 +1,7 @@ import Wreck from 'wreck'; -import getProgressReporter from '../progress_reporter'; +import Progress from '../progress'; import { fromNode as fn } from 'bluebird'; import { createWriteStream, unlinkSync } from 'fs'; -import fileType, { ZIP, TAR } from '../file_type'; function sendRequest({ sourceUrl, timeout }) { const maxRedirects = 11; //Because this one goes to 11. @@ -25,7 +24,7 @@ function sendRequest({ sourceUrl, timeout }) { }); } -function downloadResponse({ resp, targetPath, progressReporter }) { +function downloadResponse({ resp, targetPath, progress }) { return new Promise((resolve, reject) => { const writeStream = createWriteStream(targetPath); @@ -35,7 +34,7 @@ function downloadResponse({ resp, targetPath, progressReporter }) { // report progress as we download resp.on('data', (chunk) => { - progressReporter.progress(chunk.length); + progress.progress(chunk.length); }); // write the download to the file system @@ -46,19 +45,6 @@ function downloadResponse({ resp, targetPath, progressReporter }) { }); } -function getArchiveTypeFromResponse(resp, sourceUrl) { - const contentType = (resp.headers['content-type'] || ''); - - switch (contentType.toLowerCase()) { - case 'application/zip': return ZIP; - case 'application/x-gzip': return TAR; - default: - //If we can't infer the archive type from the content-type header, - //fall back to checking the extension in the url - return fileType(sourceUrl); - } -} - /* Responsible for managing http transfers */ @@ -68,20 +54,16 @@ export default async function downloadUrl(logger, sourceUrl, targetPath, timeout try { let totalSize = parseFloat(resp.headers['content-length']) || 0; - const progressReporter = getProgressReporter(logger); - progressReporter.init(totalSize); + const progress = new Progress(logger); + progress.init(totalSize); - await downloadResponse({ resp, targetPath, progressReporter }); + await downloadResponse({ resp, targetPath, progress }); - progressReporter.complete(); + progress.complete(); } catch (err) { req.abort(); throw err; } - - // all is well, return our archive type - const archiveType = getArchiveTypeFromResponse(resp, sourceUrl); - return { archiveType }; } catch (err) { if (err.message !== 'ENOTFOUND') { logger.error(err); diff --git a/src/cli_plugin/install/install.js b/src/cli_plugin/install/install.js index f95dd6c37f73..041bac504a5b 100644 --- a/src/cli_plugin/install/install.js +++ b/src/cli_plugin/install/install.js @@ -1,86 +1,40 @@ import _ from 'lodash'; -import fromRoot from '../../utils/from_root'; -import pluginDownloader from './plugin_downloader'; -import pluginCleaner from './plugin_cleaner'; -import pluginExtractor from './plugin_extractor'; -import KbnServer from '../../server/kbn_server'; -import readYamlConfig from '../serve/read_yaml_config'; +import { download } from './download'; import Promise from 'bluebird'; +import { cleanPrevious, cleanError } from './cleanup'; +import { extract, getPackData } from './pack'; import { sync as rimrafSync } from 'rimraf'; import { statSync, renameSync } from 'fs'; +import { existingInstall, rebuildCache, checkVersion } from './kibana'; + const mkdirp = Promise.promisify(require('mkdirp')); -export default { - install: install -}; - -function checkForExistingInstall(settings, logger) { +export default async function install(settings, logger) { try { - statSync(settings.pluginPath); - - logger.error(`Plugin ${settings.package} already exists, please remove before installing a new version`); - process.exit(70); // eslint-disable-line no-process-exit - } catch (e) { - if (e.code !== 'ENOENT') throw e; - } -} - -async function rebuildKibanaCache(settings, logger) { - logger.log('Optimizing and caching browser bundles...'); - const serverConfig = _.merge( - readYamlConfig(settings.config), - { - env: 'production', - logging: { - silent: settings.silent, - quiet: !settings.silent, - verbose: false - }, - optimize: { - useBundleCache: false - }, - server: { - autoListen: false - }, - plugins: { - initialize: false, - scanDirs: [settings.pluginDir, fromRoot('src/plugins')] - } - } - ); - - const kbnServer = new KbnServer(serverConfig); - await kbnServer.ready(); - await kbnServer.close(); -} - -async function install(settings, logger) { - logger.log(`Installing ${settings.package}`); - - const cleaner = pluginCleaner(settings, logger); - - try { - checkForExistingInstall(settings, logger); - - await cleaner.cleanPrevious(); + await cleanPrevious(settings, logger); await mkdirp(settings.workingPath); - const downloader = pluginDownloader(settings, logger); - const { archiveType } = await downloader.download(); + await download(settings, logger); - await pluginExtractor (settings, logger, archiveType); + await getPackData(settings, logger); + + await extract (settings, logger); rimrafSync(settings.tempArchiveFile); - renameSync(settings.workingPath, settings.pluginPath); + existingInstall(settings, logger); - await rebuildKibanaCache(settings, logger); + checkVersion(settings); + + renameSync(settings.workingPath, settings.plugins[0].path); + + await rebuildCache(settings, logger); logger.log('Plugin installation complete'); } catch (err) { logger.error(`Plugin installation was unsuccessful due to error "${err.message}"`); - cleaner.cleanError(); + cleanError(settings); process.exit(70); // eslint-disable-line no-process-exit } } diff --git a/src/cli_plugin/install/kibana.js b/src/cli_plugin/install/kibana.js new file mode 100644 index 000000000000..6143098bcf7c --- /dev/null +++ b/src/cli_plugin/install/kibana.js @@ -0,0 +1,56 @@ +import _ from 'lodash'; +import fromRoot from '../../utils/fromRoot'; +import KbnServer from '../../server/KbnServer'; +import readYamlConfig from '../../cli/serve/read_yaml_config'; +import { statSync } from 'fs'; + +export function existingInstall(settings, logger) { + try { + statSync(settings.plugins[0].path); + + logger.error(`Plugin ${settings.plugins[0].name} already exists, please remove before installing a new version`); + process.exit(70); // eslint-disable-line no-process-exit + } catch (e) { + if (e.code !== 'ENOENT') throw e; + } +} + +export async function rebuildCache(settings, logger) { + logger.log('Optimizing and caching browser bundles...'); + const serverConfig = _.merge( + readYamlConfig(settings.config), + { + env: 'production', + logging: { + silent: settings.silent, + quiet: !settings.silent, + verbose: false + }, + optimize: { + useBundleCache: false + }, + server: { + autoListen: false + }, + plugins: { + initialize: false, + scanDirs: [settings.pluginDir, fromRoot('src/plugins')] + } + } + ); + + const kbnServer = new KbnServer(serverConfig); + await kbnServer.ready(); + await kbnServer.close(); +} + +export function checkVersion(settings) { + if (!settings.plugins[0].version) { + throw new Error (`Plugin version not found. Check package.json in archive`); + } + + if (settings.plugins[0].version !== settings.version) { + throw new Error (`Incorrect version in plugin [${settings.plugins[0].name}]. ` + + `Expected [${settings.version}]; found [${settings.plugins[0].version}]`); + } +} diff --git a/src/cli_plugin/install/pack.js b/src/cli_plugin/install/pack.js new file mode 100644 index 000000000000..ee317995a554 --- /dev/null +++ b/src/cli_plugin/install/pack.js @@ -0,0 +1,119 @@ +import _ from 'lodash'; +import { listFiles, extractFiles } from './zip'; +import { resolve } from 'path'; +import { sync as rimrafSync } from 'rimraf'; + +//***************************************** +//Return a list of package.json files in the archive +//***************************************** +async function listPackages(settings) { + const regExp = new RegExp('(kibana/([^/]+))/package.json', 'i'); + const archiveFiles = await listFiles(settings.tempArchiveFile); + + let packages = archiveFiles.map((file) => { + file = file.replace(/\\/g, '/'); + const matches = file.match(regExp); + if (matches) { + return { + file: matches[0], + folder: matches[2] + }; + } + }); + + packages = _.chain(packages).compact().uniq().value(); + + return packages; +} + +//***************************************** +//Extract the package.json files into the workingPath +//***************************************** +async function extractPackageFiles(settings, packages) { + const filter = { + files: packages.map((pkg) => pkg.file) + }; + await extractFiles(settings.tempArchiveFile, settings.workingPath, 0, filter); +} + +//***************************************** +//Extract the package.json files into the workingPath +//***************************************** +function deletePackageFiles(settings, packages) { + packages.forEach((pkg) => { + const fullPath = resolve(settings.workingPath, 'kibana'); + rimrafSync(fullPath); + }); +} + +//***************************************** +//Examine each package.json file to determine the plugin name, +//version, and platform. +//***************************************** +async function readPackageData(settings, packages) { + return packages.map((pkg) => { + const fullPath = resolve(settings.workingPath, pkg.file); + const packageInfo = require(fullPath); + + pkg.version = _.get(packageInfo, 'version'); + pkg.name = _.get(packageInfo, 'name'); + pkg.path = resolve(settings.pluginDir, pkg.name); + + const regExp = new RegExp(`${pkg.name}-(.+)`, 'i'); + const matches = pkg.folder.match(regExp); + pkg.platform = (matches) ? matches[1] : undefined; + + return pkg; + }); +} + +//***************************************** +//Extracts the first plugin in the archive. +//This will need to be changed in later versions of the pack installer +//that allow for the installation of more than one plugin at once. +//***************************************** +async function extractArchive(settings) { + const filter = { + paths: [ settings.plugins[0].folder ] + }; + await extractFiles(settings.tempArchiveFile, settings.workingPath, 2, filter); +} + +//***************************************** +//Returns the detailed information about each kibana plugin in the +//pack. +//TODO: If there are platform specific folders, determine which one to use. +//***************************************** +export async function getPackData(settings, logger) { + let packages; + try { + logger.log('Retrieving metadata from plugin archive'); + + packages = await listPackages(settings); + await extractPackageFiles(settings, packages); + await readPackageData(settings, packages); + await deletePackageFiles(settings, packages); + } catch (err) { + logger.error(err); + throw new Error('Error retrieving metadata from plugin archive'); + } + + if (packages.length === 0) { + throw new Error('No kibana plugins found in archive'); + } + + settings.plugins = packages; +} + +export async function extract(settings, logger) { + try { + logger.log('Extracting plugin archive'); + + await extractArchive(settings); + + logger.log('Extraction complete'); + } catch (err) { + logger.error(err); + throw new Error('Error extracting plugin archive'); + } +}; diff --git a/src/cli_plugin/install/progress.js b/src/cli_plugin/install/progress.js index 6de7d987adf5..ec86bf11cc04 100644 --- a/src/cli_plugin/install/progress.js +++ b/src/cli_plugin/install/progress.js @@ -1,38 +1,39 @@ /* Generates file transfer progress messages */ -export default function createProgressReporter(logger) { - let dotCount = 0; - let runningTotal = 0; - let totalSize = 0; +export default function Progress(logger) { + const self = this; - function init(size) { - totalSize = size; - let totalDesc = totalSize || 'unknown number of'; + self.dotCount = 0; + self.runningTotal = 0; + self.totalSize = 0; + self.logger = logger; +} - logger.log(`Transferring ${totalDesc} bytes`, true); - } +Progress.prototype.init = function (size) { + const self = this; - //Should log a dot for every 5% of progress - function progress(size) { - if (!totalSize) return; + self.totalSize = size; + const totalDesc = self.totalSize || 'unknown number of'; - runningTotal += size; - let newDotCount = Math.round(runningTotal / totalSize * 100 / 5); - if (newDotCount > 20) newDotCount = 20; - for (let i = 0; i < (newDotCount - dotCount); i++) { - logger.log('.', true); - } - dotCount = newDotCount; - } - - function complete() { - logger.log(`Transfer complete`, false); - } - - return { - init: init, - progress: progress, - complete: complete - }; + self.logger.log(`Transferring ${totalDesc} bytes`, true); +}; + +Progress.prototype.progress = function (size) { + const self = this; + + if (!self.totalSize) return; + + self.runningTotal += size; + let newDotCount = Math.round(self.runningTotal / self.totalSize * 100 / 5); + if (newDotCount > 20) newDotCount = 20; + for (let i = 0; i < (newDotCount - self.dotCount); i++) { + self.logger.log('.', true); + } + self.dotCount = newDotCount; +}; + +Progress.prototype.complete = function () { + const self = this; + self.logger.log(`Transfer complete`, false); }; diff --git a/src/cli_plugin/install/settings.js b/src/cli_plugin/install/settings.js index 0e581b22b11a..4b904d67513a 100644 --- a/src/cli_plugin/install/settings.js +++ b/src/cli_plugin/install/settings.js @@ -1,114 +1,48 @@ import expiry from 'expiry-js'; import { intersection } from 'lodash'; import { resolve } from 'path'; +import { arch, platform } from 'os'; -export default function createSettingParser(options) { - function parseMilliseconds(val) { - let result; +function generateUrls(settings) { + const { version, plugin } = settings; + return [ + plugin, + `https://download.elastic.co/packs/${plugin}/${plugin}-${version}.zip` + ]; +} - try { - let timeVal = expiry(val); - result = timeVal.asMilliseconds(); - } catch (ex) { - result = 0; - } +export function parseMilliseconds(val) { + let result; - return result; + try { + let timeVal = expiry(val); + result = timeVal.asMilliseconds(); + } catch (ex) { + result = 0; } - function generateDownloadUrl(settings) { - const version = (settings.version) || 'latest'; - const filename = settings.package + '-' + version + '.tar.gz'; - - return 'https://download.elastic.co/' + settings.organization + '/' + settings.package + '/' + filename; - } - - function areMultipleOptionsChosen(options, choices) { - return intersection(Object.keys(options), choices).length > 1; - } - - function parse() { - let parts; - let settings = { - timeout: 0, - silent: false, - quiet: false, - urls: [] - }; - - if (options.timeout) { - settings.timeout = options.timeout; - } - - if (options.parent && options.parent.quiet) { - settings.quiet = options.parent.quiet; - } - - if (options.silent) { - settings.silent = options.silent; - } - - if (options.url) { - settings.urls.push(options.url); - } - - if (options.config) { - settings.config = options.config; - } - - if (options.install) { - settings.action = 'install'; - parts = options.install.split('/'); - - if (options.url) { - if (parts.length !== 1) { - throw new Error('Invalid install option. When providing a url, please use the format .'); - } - - settings.package = parts.shift(); - } else { - if (parts.length < 2 || parts.length > 3) { - throw new Error('Invalid install option. Please use the format //.'); - } - - settings.organization = parts.shift(); - settings.package = parts.shift(); - settings.version = parts.shift(); - - settings.urls.push(generateDownloadUrl(settings)); - } - } - - if (options.remove) { - settings.action = 'remove'; - parts = options.remove.split('/'); - - if (parts.length !== 1) { - throw new Error('Invalid remove option. Please use the format .'); - } - settings.package = parts.shift(); - } - - if (options.list) { - settings.action = 'list'; - } - - if (!settings.action || areMultipleOptionsChosen(options, [ 'install', 'remove', 'list' ])) { - throw new Error('Please specify either --install, --remove, or --list.'); - } - - settings.pluginDir = options.pluginDir; - if (settings.package) { - settings.pluginPath = resolve(settings.pluginDir, settings.package); - settings.workingPath = resolve(settings.pluginDir, '.plugin.installing'); - settings.tempArchiveFile = resolve(settings.workingPath, 'archive.part'); - } - - return settings; - } - - return { - parse: parse, - parseMilliseconds: parseMilliseconds - }; + return result; +}; + +export function parse(command, options, kbnPackage) { + const settings = { + timeout: options.timeout ? options.timeout : 0, + quiet: options.quiet ? options.quiet : false, + silent: options.silent ? options.silent : false, + config: options.config ? options.config : '', + plugin: command, + version: kbnPackage.version, + pluginDir: options.pluginDir ? options.pluginDir : '' + }; + + settings.urls = generateUrls(settings); + settings.workingPath = resolve(settings.pluginDir, '.plugin.installing'); + settings.tempArchiveFile = resolve(settings.workingPath, 'archive.part'); + settings.tempPackageFile = resolve(settings.workingPath, 'package.json'); + settings.setPlugin = function (plugin) { + settings.plugin = plugin; + settings.pluginPath = resolve(settings.pluginDir, settings.plugin.name); + }; + + return settings; }; diff --git a/src/cli_plugin/install/zip.js b/src/cli_plugin/install/zip.js index da5d20005b35..e8c2ccb09c0f 100644 --- a/src/cli_plugin/install/zip.js +++ b/src/cli_plugin/install/zip.js @@ -1,32 +1,71 @@ +import _ from 'lodash'; import DecompressZip from '@bigfunger/decompress-zip'; -async function extractArchive(settings) { +//*********************************************** +//Creates a filter function to be consumed by extractFiles +// +//filter: an object with either a files or paths property. +//filter.files: an array of full file paths to extract. Should match +// exactly a value from listFiles +//filter.paths: an array of root paths from the archive. All files and +// folders will be extracted recursively using these paths as roots. +//*********************************************** +function extractFilter(filter) { + if (filter.files) { + const filterFiles = filter.files.map((file) => file.replace(/\\/g, '/')); + return function filterByFiles(file) { + if (file.type === 'SymbolicLink') return false; + + const path = file.path.replace(/\\/g, '/'); + return !!(_.indexOf(filterFiles, path) !== -1); + }; + } + + if (filter.paths) { + return function filterByRootPath(file) { + if (file.type === 'SymbolicLink') return false; + + let include = false; + filter.paths.forEach((path) => { + const regex = new RegExp(`${path}($|/)`, 'i'); + if ((file.parent.match(regex)) && file.type !== 'SymbolicLink') { + include = true; + } + }); + + return include; + }; + } + + return _.noop; +} + +export async function extractFiles(zipPath, targetPath, strip, filter) { await new Promise((resolve, reject) => { - const unzipper = new DecompressZip(settings.tempArchiveFile); + const unzipper = new DecompressZip(zipPath); unzipper.on('error', reject); unzipper.extract({ - path: settings.workingPath, - strip: 1, - filter(file) { - return file.type !== 'SymbolicLink'; - } + path: targetPath, + strip: strip, + filter: extractFilter(filter) }); unzipper.on('extract', resolve); }); } -export default async function extractZip(settings, logger) { - try { - logger.log('Extracting plugin archive'); +export async function listFiles(zipPath) { + return await new Promise((resolve, reject) => { + const unzipper = new DecompressZip(zipPath); - await extractArchive(settings); + unzipper.on('error', reject); - logger.log('Extraction complete'); - } catch (err) { - logger.error(err); - throw new Error('Error extracting plugin archive'); - } -}; + unzipper.on('list', (files) => { + resolve(files); + }); + + unzipper.list(); + }); +} From 659a43719525a1a0f8eb931f6ea0396539518a70 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Fri, 4 Mar 2016 09:31:58 -0600 Subject: [PATCH 07/23] [pack installer] various tweaks from PR review --- package.json | 1 + src/cli/cli.js | 4 ++-- src/cli_plugin/cli.js | 9 ++++--- src/cli_plugin/install/__tests__/download.js | 2 +- src/cli_plugin/install/__tests__/pack.js | 12 +++++++++- .../__tests__/replies/invalid_name.zip | Bin 0 -> 2333 bytes src/cli_plugin/install/__tests__/zip.js | 2 +- src/cli_plugin/install/pack.js | 12 ++++++++++ src/cli_plugin/list/__tests__/list.js | 16 ++++++++++++- src/cli_plugin/list/__tests__/settings.js | 4 +--- src/cli_plugin/list/list.js | 9 ++++--- src/cli_plugin/remove/__tests__/remove.js | 22 ++++++++++++++---- src/cli_plugin/remove/__tests__/settings.js | 4 +--- src/cli_plugin/remove/remove.js | 14 +++++++---- 14 files changed, 84 insertions(+), 27 deletions(-) create mode 100644 src/cli_plugin/install/__tests__/replies/invalid_name.zip diff --git a/package.json b/package.json index fb15b12a3c14..1e766c1c94fa 100644 --- a/package.json +++ b/package.json @@ -135,6 +135,7 @@ "style-loader": "0.12.3", "tar": "2.2.0", "url-loader": "0.5.6", + "validate-npm-package-name": "2.2.2", "webpack": "1.12.1", "webpack-directory-name-as-main": "1.0.0", "whatwg-fetch": "0.9.0", diff --git a/src/cli/cli.js b/src/cli/cli.js index 96f98301ae5c..efbf3628fac3 100644 --- a/src/cli/cli.js +++ b/src/cli/cli.js @@ -1,7 +1,7 @@ import _ from 'lodash'; - import pkg from '../utils/package_json'; import Command from './command'; +import serveCommand from './serve/serve'; let argv = process.env.kbnWorkerArgv ? JSON.parse(process.env.kbnWorkerArgv) : process.argv.slice(); let program = new Command('bin/kibana'); @@ -14,7 +14,7 @@ program ); // attach commands -require('./serve/serve')(program); +serveCommand(program); program .command('help ') diff --git a/src/cli_plugin/cli.js b/src/cli_plugin/cli.js index 61751806f778..9d892a2d6aea 100644 --- a/src/cli_plugin/cli.js +++ b/src/cli_plugin/cli.js @@ -1,6 +1,9 @@ import _ from 'lodash'; import pkg from '../utils/packageJson'; import Command from '../cli/Command'; +import listCommand from './list'; +import installCommand from './install'; +import removeCommand from './remove'; let argv = process.env.kbnWorkerArgv ? JSON.parse(process.env.kbnWorkerArgv) : process.argv.slice(); let program = new Command('bin/kibana-plugin'); @@ -12,9 +15,9 @@ program 'based analytics and search dashboard for Elasticsearch.' ); -require('./list')(program); -require('./install')(program); -require('./remove')(program); +listCommand(program); +installCommand(program); +removeCommand(program); program .command('help ') diff --git a/src/cli_plugin/install/__tests__/download.js b/src/cli_plugin/install/__tests__/download.js index 86ac43237155..beb30c5df540 100644 --- a/src/cli_plugin/install/__tests__/download.js +++ b/src/cli_plugin/install/__tests__/download.js @@ -1,7 +1,7 @@ import expect from 'expect.js'; import sinon from 'sinon'; import nock from 'nock'; -import glob from 'glob'; +import glob from 'glob-all'; import rimraf from 'rimraf'; import mkdirp from 'mkdirp'; import Logger from '../../lib/logger'; diff --git a/src/cli_plugin/install/__tests__/pack.js b/src/cli_plugin/install/__tests__/pack.js index b434160b2c72..98ebb3294960 100644 --- a/src/cli_plugin/install/__tests__/pack.js +++ b/src/cli_plugin/install/__tests__/pack.js @@ -1,6 +1,6 @@ import expect from 'expect.js'; import sinon from 'sinon'; -import glob from 'glob'; +import glob from 'glob-all'; import rimraf from 'rimraf'; import mkdirp from 'mkdirp'; import Logger from '../../lib/logger'; @@ -157,6 +157,16 @@ describe('kibana cli', function () { }); }); + it('throw an error if there an invalid plugin name', function () { + return copyReplyFile('invalid_name.zip') + .then((data) => { + return getPackData(settings, logger); + }) + .then(shouldReject, (err) => { + expect(err.message).to.match(/invalid plugin name/i); + }); + }); + }); }); diff --git a/src/cli_plugin/install/__tests__/replies/invalid_name.zip b/src/cli_plugin/install/__tests__/replies/invalid_name.zip new file mode 100644 index 0000000000000000000000000000000000000000..5de9a0677b6cb6681b890ca59cae3988cca1afd4 GIT binary patch literal 2333 zcmWIWW@Zs#0D)~0J|18Ol;8u>sX2+oC7H>^sfk6&8TtWmwa1#0QPi>n)n;cVCFUg} zDcXgm2xJXZQD$CQVoqj?ZeC(;Dp&^>*wRnQH{6!8?eE|L@<3P)hYr2;%#zIXy!@in zy!@2Z_}u)I(wx*{knr9Jpw(hli1Y z;Vuv>;P6&KVsdt3dMeOk`FXJu4(1(J0DA2w*DLQRO~t;uZdrMM`&S4Z)2@!?>S&D! zn_91*pq_b{)i8fXwllkO z4(r{fX&m)j(xM9-uP@tnzH9&IU3<>)dmTwsk=HnEyZ(o=vVh+=$^9Qc^|3cc+I$F) zi+4?pa@@SL&(*xPL}CB59_KSVeAfgtE&H=pKJ0|tw$MYyzsAIZ0$?n#9z4j~pdi32G%P1S zy|^T?7*v8VGTAfWDsNPPN06tej` zKs%s?5wgMWmUJl2F1^SIqpx^Ayj9 sn8ggtI#6)Bvmg~Z$VR({C(Q??Ky*65o0ScykAWKqX96|n0Wkvu08 { - if (filename[0] !== '.') { + const stat = statSync(join(settings.pluginDir, filename)); + + if (stat.isDirectory() && filename[0] !== '.') { logger.log(filename); } }); diff --git a/src/cli_plugin/remove/__tests__/remove.js b/src/cli_plugin/remove/__tests__/remove.js index e136f0da3378..8b9bdcccf938 100644 --- a/src/cli_plugin/remove/__tests__/remove.js +++ b/src/cli_plugin/remove/__tests__/remove.js @@ -1,17 +1,19 @@ import expect from 'expect.js'; import sinon from 'sinon'; -import glob from 'glob'; +import glob from 'glob-all'; import rimraf from 'rimraf'; import mkdirp from 'mkdirp'; import Logger from '../../lib/logger'; import remove from '../remove'; import { join } from 'path'; +import { writeFileSync } from 'fs'; describe('kibana cli', function () { describe('plugin lister', function () { const pluginDir = join(__dirname, '.test.data'); + let processExitStub; let logger; const settings = { @@ -19,6 +21,7 @@ describe('kibana cli', function () { }; beforeEach(function () { + processExitStub = sinon.stub(process, 'exit'); logger = new Logger(settings); sinon.stub(logger, 'log'); sinon.stub(logger, 'error'); @@ -27,16 +30,27 @@ describe('kibana cli', function () { }); afterEach(function () { + processExitStub.restore(); logger.log.restore(); logger.error.restore(); rimraf.sync(pluginDir); }); - it('log a message if the plugin is not installed.', function () { + it('throw an error if the plugin is not installed.', function () { settings.pluginPath = join(pluginDir, 'foo'); - remove(settings, logger); + settings.plugin = 'foo'; - expect(logger.log.firstCall.args[0]).to.match(/not installed/i); + remove(settings, logger); + expect(logger.error.firstCall.args[0]).to.match(/not installed/); + expect(process.exit.called).to.be(true); + }); + + it('throw an error if the specified plugin is not a folder.', function () { + writeFileSync(join(pluginDir, 'foo'), 'This is a file, and not a folder.'); + + remove(settings, logger); + expect(logger.error.firstCall.args[0]).to.match(/not a plugin/); + expect(process.exit.called).to.be(true); }); it('delete the specified folder.', function () { diff --git a/src/cli_plugin/remove/__tests__/settings.js b/src/cli_plugin/remove/__tests__/settings.js index eff22618dd02..7a3d9eeca579 100644 --- a/src/cli_plugin/remove/__tests__/settings.js +++ b/src/cli_plugin/remove/__tests__/settings.js @@ -1,8 +1,6 @@ import path from 'path'; import expect from 'expect.js'; - -const utils = require('requirefrom')('src/utils'); -const fromRoot = utils('fromRoot'); +import fromRoot from '../../../utils/fromRoot'; import { resolve } from 'path'; import { parseMilliseconds, parse } from '../settings'; diff --git a/src/cli_plugin/remove/remove.js b/src/cli_plugin/remove/remove.js index 2103864b0869..4fa40076129e 100644 --- a/src/cli_plugin/remove/remove.js +++ b/src/cli_plugin/remove/remove.js @@ -1,19 +1,23 @@ -import fs from 'fs'; +import { statSync } from 'fs'; import rimraf from 'rimraf'; export default function remove(settings, logger) { try { + let stat; try { - fs.statSync(settings.pluginPath); + stat = statSync(settings.pluginPath); } catch (e) { - logger.log(`Plugin ${settings.plugin} is not installed`); - return; + throw new Error(`Plugin [${settings.plugin}] is not installed`); + } + + if (!stat.isDirectory()) { + throw new Error(`[${settings.plugin}] is not a plugin`); } logger.log(`Removing ${settings.plugin}...`); rimraf.sync(settings.pluginPath); } catch (err) { - logger.error(`Unable to remove plugin "${settings.plugin}" because of error: "${err.message}"`); + logger.error(`Unable to remove plugin because of error: "${err.message}"`); process.exit(74); // eslint-disable-line no-process-exit } } From c86b13edc25f2ad57f3e1f732a2c752b93def70d Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Fri, 4 Mar 2016 12:34:59 -0600 Subject: [PATCH 08/23] [pack installer] modified tests to make paths platform agnostic --- src/cli/cli.js | 2 +- src/cli_plugin/cli.js | 2 +- src/cli_plugin/install/__tests__/pack.js | 2 +- src/cli_plugin/install/__tests__/zip.js | 24 ++++++++++++------------ src/cli_plugin/install/zip.js | 1 + 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/cli/cli.js b/src/cli/cli.js index efbf3628fac3..4ac3bae2dbb3 100644 --- a/src/cli/cli.js +++ b/src/cli/cli.js @@ -21,7 +21,7 @@ program .description('Get the help for a specific command') .action(function (cmdName) { var cmd = _.find(program.commands, { _name: cmdName }); - if (!cmd) return this.error(`unknown command ${cmdName}`); + if (!cmd) return program.error(`unknown command ${cmdName}`); cmd.help(); }); diff --git a/src/cli_plugin/cli.js b/src/cli_plugin/cli.js index 9d892a2d6aea..090ad8567070 100644 --- a/src/cli_plugin/cli.js +++ b/src/cli_plugin/cli.js @@ -24,7 +24,7 @@ program .description('Get the help for a specific command') .action(function (cmdName) { var cmd = _.find(program.commands, { _name: cmdName }); - if (!cmd) return this.error(`unknown command ${cmdName}`); + if (!cmd) return program.error(`unknown command ${cmdName}`); cmd.help(); }); diff --git a/src/cli_plugin/install/__tests__/pack.js b/src/cli_plugin/install/__tests__/pack.js index 98ebb3294960..433df5bc0a0d 100644 --- a/src/cli_plugin/install/__tests__/pack.js +++ b/src/cli_plugin/install/__tests__/pack.js @@ -10,7 +10,7 @@ import { join } from 'path'; describe('kibana cli', function () { - describe('plugin extractor', function () { + describe('pack', function () { const testWorkingPath = join(__dirname, '.test.data'); const tempArchiveFilePath = join(testWorkingPath, 'archive.part'); diff --git a/src/cli_plugin/install/__tests__/zip.js b/src/cli_plugin/install/__tests__/zip.js index 3eec85278f81..7cc96fd318c9 100644 --- a/src/cli_plugin/install/__tests__/zip.js +++ b/src/cli_plugin/install/__tests__/zip.js @@ -10,7 +10,7 @@ import { listFiles, extractFiles } from '../zip'; describe('kibana cli', function () { - describe('plugin extractor', function () { + describe('zip', function () { const testWorkingPath = join(__dirname, '.test.data'); const tempArchiveFilePath = join(testWorkingPath, 'archive.part'); @@ -59,17 +59,17 @@ describe('kibana cli', function () { }) .then((actual) => { const expected = [ - 'elasticsearch\\', - 'kibana\\', - 'kibana\\test-plugin\\', - 'kibana\\test-plugin\\.gitignore', - 'kibana\\test-plugin\\extra file only in zip.txt', - 'kibana\\test-plugin\\index.js', - 'kibana\\test-plugin\\package.json', - 'kibana\\test-plugin\\public\\', - 'kibana\\test-plugin\\public\\app.js', - 'kibana\\test-plugin\\README.md', - 'logstash\\' + 'elasticsearch/', + 'kibana/', + 'kibana/test-plugin/', + 'kibana/test-plugin/.gitignore', + 'kibana/test-plugin/extra file only in zip.txt', + 'kibana/test-plugin/index.js', + 'kibana/test-plugin/package.json', + 'kibana/test-plugin/public/', + 'kibana/test-plugin/public/app.js', + 'kibana/test-plugin/README.md', + 'logstash/' ]; expect(actual).to.eql(expected); diff --git a/src/cli_plugin/install/zip.js b/src/cli_plugin/install/zip.js index e8c2ccb09c0f..1bac0c13400a 100644 --- a/src/cli_plugin/install/zip.js +++ b/src/cli_plugin/install/zip.js @@ -63,6 +63,7 @@ export async function listFiles(zipPath) { unzipper.on('error', reject); unzipper.on('list', (files) => { + files = files.map((file) => file.replace(/\\/g, '/')); resolve(files); }); From 416c9c5111ed20fc77d2cefa3c4ded4eb4d79f9b Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Fri, 11 Mar 2016 16:14:48 -0600 Subject: [PATCH 09/23] [pack installer] implemented changes from PR review --- src/cli/cli.js | 8 +- src/cli_plugin/cli.js | 4 +- src/cli_plugin/install/__tests__/cleanup.js | 8 +- src/cli_plugin/install/__tests__/download.js | 34 +++--- src/cli_plugin/install/cleanup.js | 2 +- src/cli_plugin/install/download.js | 1 - src/cli_plugin/install/index.js | 26 ++--- src/cli_plugin/install/install.js | 14 +-- src/cli_plugin/install/pack.js | 105 ++++++++++--------- src/cli_plugin/install/progress.js | 69 ++++++------ src/cli_plugin/install/settings.js | 15 ++- src/cli_plugin/install/zip.js | 92 +++++++++------- src/cli_plugin/lib/logger.js | 87 +++++++-------- src/cli_plugin/list/index.js | 26 ++--- src/cli_plugin/list/list.js | 2 +- src/cli_plugin/list/settings.js | 2 +- src/cli_plugin/remove/__tests__/remove.js | 6 +- src/cli_plugin/remove/index.js | 26 ++--- src/cli_plugin/remove/settings.js | 8 +- 19 files changed, 279 insertions(+), 256 deletions(-) diff --git a/src/cli/cli.js b/src/cli/cli.js index 4ac3bae2dbb3..f25608dec1cf 100644 --- a/src/cli/cli.js +++ b/src/cli/cli.js @@ -3,8 +3,8 @@ import pkg from '../utils/package_json'; import Command from './command'; import serveCommand from './serve/serve'; -let argv = process.env.kbnWorkerArgv ? JSON.parse(process.env.kbnWorkerArgv) : process.argv.slice(); -let program = new Command('bin/kibana'); +const argv = process.env.kbnWorkerArgv ? JSON.parse(process.env.kbnWorkerArgv) : process.argv.slice(); +const program = new Command('bin/kibana'); program .version(pkg.version) @@ -20,7 +20,7 @@ program .command('help ') .description('Get the help for a specific command') .action(function (cmdName) { - var cmd = _.find(program.commands, { _name: cmdName }); + const cmd = _.find(program.commands, { _name: cmdName }); if (!cmd) return program.error(`unknown command ${cmdName}`); cmd.help(); }); @@ -32,7 +32,7 @@ program }); // check for no command name -var subCommand = argv[2] && !String(argv[2][0]).match(/^-|^\.|\//); +const subCommand = argv[2] && !String(argv[2][0]).match(/^-|^\.|\//); if (!subCommand) { if (_.intersection(argv.slice(2), ['-h', '--help']).length) { diff --git a/src/cli_plugin/cli.js b/src/cli_plugin/cli.js index 090ad8567070..8e9807d82a3f 100644 --- a/src/cli_plugin/cli.js +++ b/src/cli_plugin/cli.js @@ -11,8 +11,8 @@ let program = new Command('bin/kibana-plugin'); program .version(pkg.version) .description( - 'Kibana is an open source (Apache Licensed), browser ' + - 'based analytics and search dashboard for Elasticsearch.' + 'The Kibana plugin manager enables you to install and remove plugins that ' + + 'provide additional functionality to Kibana' ); listCommand(program); diff --git a/src/cli_plugin/install/__tests__/cleanup.js b/src/cli_plugin/install/__tests__/cleanup.js index 4fb81a9d1bcd..c8812c8dedf8 100644 --- a/src/cli_plugin/install/__tests__/cleanup.js +++ b/src/cli_plugin/install/__tests__/cleanup.js @@ -3,7 +3,7 @@ import sinon from 'sinon'; import fs from 'fs'; import rimraf from 'rimraf'; -import { cleanPrevious, cleanError } from '../cleanup'; +import { cleanPrevious, cleanArtifacts } from '../cleanup'; import Logger from '../../lib/logger'; describe('kibana cli', function () { @@ -108,7 +108,7 @@ describe('kibana cli', function () { }); - describe('cleanError', function () { + describe('cleanArtifacts', function () { let logger; beforeEach(function () { @@ -122,7 +122,7 @@ describe('kibana cli', function () { it('should attempt to delete the working directory', function () { sinon.stub(rimraf, 'sync'); - cleanError(settings); + cleanArtifacts(settings); expect(rimraf.sync.calledWith(settings.workingPath)).to.be(true); }); @@ -131,7 +131,7 @@ describe('kibana cli', function () { throw new Error('Something bad happened.'); }); - expect(cleanError).withArgs(settings).to.not.throwError(); + expect(cleanArtifacts).withArgs(settings).to.not.throwError(); }); }); diff --git a/src/cli_plugin/install/__tests__/download.js b/src/cli_plugin/install/__tests__/download.js index beb30c5df540..5885d9c057f1 100644 --- a/src/cli_plugin/install/__tests__/download.js +++ b/src/cli_plugin/install/__tests__/download.js @@ -61,11 +61,11 @@ describe('kibana cli', function () { describe('http downloader', function () { it('should throw an ENOTFOUND error for a http ulr that returns 404', function () { - const couchdb = nock('http://www.files.com') + const couchdb = nock('http://example.com') .get('/plugin.tar.gz') .reply(404); - const sourceUrl = 'http://www.files.com/plugin.tar.gz'; + const sourceUrl = 'http://example.com/plugin.tar.gz'; return _downloadSingle(settings, logger, sourceUrl) .then(shouldReject, function (err) { @@ -87,7 +87,7 @@ describe('kibana cli', function () { it('should download a file from a valid http url', function () { const filePath = join(__dirname, 'replies/banana.jpg'); - const couchdb = nock('http://www.files.com') + const couchdb = nock('http://example.com') .defaultReplyHeaders({ 'content-length': '341965', 'content-type': 'application/zip' @@ -95,7 +95,7 @@ describe('kibana cli', function () { .get('/plugin.zip') .replyWithFile(200, filePath); - const sourceUrl = 'http://www.files.com/plugin.zip'; + const sourceUrl = 'http://example.com/plugin.zip'; return _downloadSingle(settings, logger, sourceUrl) .then(function () { @@ -136,13 +136,13 @@ describe('kibana cli', function () { it('should loop through bad urls until it finds a good one.', function () { const filePath = join(__dirname, 'replies/test_plugin.zip'); settings.urls = [ - 'http://www.files.com/badfile1.tar.gz', - 'http://www.files.com/badfile2.tar.gz', + 'http://example.com/badfile1.tar.gz', + 'http://example.com/badfile2.tar.gz', 'I am a bad uri', - 'http://www.files.com/goodfile.tar.gz' + 'http://example.com/goodfile.tar.gz' ]; - const couchdb = nock('http://www.files.com') + const couchdb = nock('http://example.com') .defaultReplyHeaders({ 'content-length': '10' }) @@ -166,13 +166,13 @@ describe('kibana cli', function () { it('should stop looping through urls when it finds a good one.', function () { const filePath = join(__dirname, 'replies/test_plugin.zip'); settings.urls = [ - 'http://www.files.com/badfile1.tar.gz', - 'http://www.files.com/badfile2.tar.gz', - 'http://www.files.com/goodfile.tar.gz', - 'http://www.files.com/badfile3.tar.gz' + 'http://example.com/badfile1.tar.gz', + 'http://example.com/badfile2.tar.gz', + 'http://example.com/goodfile.tar.gz', + 'http://example.com/badfile3.tar.gz' ]; - const couchdb = nock('http://www.files.com') + const couchdb = nock('http://example.com') .defaultReplyHeaders({ 'content-length': '10' }) @@ -196,12 +196,12 @@ describe('kibana cli', function () { it('should throw an error when it doesn\'t find a good url.', function () { settings.urls = [ - 'http://www.files.com/badfile1.tar.gz', - 'http://www.files.com/badfile2.tar.gz', - 'http://www.files.com/badfile3.tar.gz' + 'http://example.com/badfile1.tar.gz', + 'http://example.com/badfile2.tar.gz', + 'http://example.com/badfile3.tar.gz' ]; - const couchdb = nock('http://www.files.com') + const couchdb = nock('http://example.com') .defaultReplyHeaders({ 'content-length': '10' }) diff --git a/src/cli_plugin/install/cleanup.js b/src/cli_plugin/install/cleanup.js index 5ba48f87d14b..5e8f6fec58b3 100644 --- a/src/cli_plugin/install/cleanup.js +++ b/src/cli_plugin/install/cleanup.js @@ -21,7 +21,7 @@ export function cleanPrevious(settings, logger) { }); }; -export function cleanError(settings) { +export function cleanArtifacts(settings) { // delete the working directory. // At this point we're bailing, so swallow any errors on delete. try { diff --git a/src/cli_plugin/install/download.js b/src/cli_plugin/install/download.js index 2eda842141f8..0c87ec3f7d4c 100644 --- a/src/cli_plugin/install/download.js +++ b/src/cli_plugin/install/download.js @@ -1,4 +1,3 @@ -import _ from 'lodash'; import downloadHttpFile from './downloaders/http'; import downloadLocalFile from './downloaders/file'; import { parse } from 'url'; diff --git a/src/cli_plugin/install/index.js b/src/cli_plugin/install/index.js index d54f3dcda52a..bebc6130ba30 100644 --- a/src/cli_plugin/install/index.js +++ b/src/cli_plugin/install/index.js @@ -4,21 +4,21 @@ import Logger from '../lib/logger'; import pkg from '../../utils/packageJson'; import { parse, parseMilliseconds } from './settings'; -export default function pluginInstall(program) { - function processCommand(command, options) { - let settings; - try { - settings = parse(command, options, pkg); - } catch (ex) { - //The logger has not yet been initialized. - console.error(ex.message); - process.exit(64); // eslint-disable-line no-process-exit - } - - const logger = new Logger(settings); - install(settings, logger); +function processCommand(command, options) { + let settings; + try { + settings = parse(command, options, pkg); + } catch (ex) { + //The logger has not yet been initialized. + console.error(ex.message); + process.exit(64); // eslint-disable-line no-process-exit } + const logger = new Logger(settings); + install(settings, logger); +} + +export default function pluginInstall(program) { program .command('install ') .option('-q, --quiet', 'Disable all process messaging except errors') diff --git a/src/cli_plugin/install/install.js b/src/cli_plugin/install/install.js index 041bac504a5b..0a83f432e61a 100644 --- a/src/cli_plugin/install/install.js +++ b/src/cli_plugin/install/install.js @@ -1,25 +1,25 @@ -import _ from 'lodash'; import { download } from './download'; import Promise from 'bluebird'; -import { cleanPrevious, cleanError } from './cleanup'; +import { cleanPrevious, cleanArtifacts } from './cleanup'; import { extract, getPackData } from './pack'; import { sync as rimrafSync } from 'rimraf'; -import { statSync, renameSync } from 'fs'; +import { renameSync } from 'fs'; import { existingInstall, rebuildCache, checkVersion } from './kibana'; +import mkdirp from 'mkdirp'; -const mkdirp = Promise.promisify(require('mkdirp')); +const mkdir = Promise.promisify(mkdirp); export default async function install(settings, logger) { try { await cleanPrevious(settings, logger); - await mkdirp(settings.workingPath); + await mkdir(settings.workingPath); await download(settings, logger); await getPackData(settings, logger); - await extract (settings, logger); + await extract(settings, logger); rimrafSync(settings.tempArchiveFile); @@ -34,7 +34,7 @@ export default async function install(settings, logger) { logger.log('Plugin installation complete'); } catch (err) { logger.error(`Plugin installation was unsuccessful due to error "${err.message}"`); - cleanError(settings); + cleanArtifacts(settings); process.exit(70); // eslint-disable-line no-process-exit } } diff --git a/src/cli_plugin/install/pack.js b/src/cli_plugin/install/pack.js index 1e49609394c9..62da90044a3a 100644 --- a/src/cli_plugin/install/pack.js +++ b/src/cli_plugin/install/pack.js @@ -4,32 +4,29 @@ import { resolve } from 'path'; import { sync as rimrafSync } from 'rimraf'; import validate from 'validate-npm-package-name'; -//***************************************** -//Return a list of package.json files in the archive -//***************************************** +/** + * Returns an array of package objects. There will be one for each of + * package.json files in the archive + * @param {object} settings - a plugin installer settings object + */ async function listPackages(settings) { const regExp = new RegExp('(kibana/([^/]+))/package.json', 'i'); const archiveFiles = await listFiles(settings.tempArchiveFile); - let packages = archiveFiles.map((file) => { - file = file.replace(/\\/g, '/'); - const matches = file.match(regExp); - if (matches) { - return { - file: matches[0], - folder: matches[2] - }; - } - }); - - packages = _.chain(packages).compact().uniq().value(); - - return packages; + return _(archiveFiles) + .map(file => file.replace(/\\/g, '/')) + .map(file => file.match(regExp)) + .compact() + .map(([ file, _, folder ]) => ({ file, folder })) + .uniq() + .value(); } -//***************************************** -//Extract the package.json files into the workingPath -//***************************************** +/** + * Extracts the package.json files into the workingPath + * @param {object} settings - a plugin installer settings object + * @param {array} packages - array of package objects from listPackages() + */ async function extractPackageFiles(settings, packages) { const filter = { files: packages.map((pkg) => pkg.file) @@ -37,31 +34,35 @@ async function extractPackageFiles(settings, packages) { await extractFiles(settings.tempArchiveFile, settings.workingPath, 0, filter); } -//***************************************** -//Extract the package.json files into the workingPath -//***************************************** -function deletePackageFiles(settings, packages) { - packages.forEach((pkg) => { - const fullPath = resolve(settings.workingPath, 'kibana'); - rimrafSync(fullPath); - }); +/** + * Deletes the package.json files created by extractPackageFiles() + * @param {object} settings - a plugin installer settings object + */ +function deletePackageFiles(settings) { + const fullPath = resolve(settings.workingPath, 'kibana'); + rimrafSync(fullPath); } -//***************************************** -//Check the plugin name -//***************************************** -function validatePackageName(plugin) { +/** + * Checks the plugin name. Will throw an exception if it does not meet + * npm package naming conventions + * @param {object} plugin - a package object from listPackages() + */ +function assertValidPackageName(plugin) { const validation = validate(plugin.name); if (!validation.validForNewPackages) { throw new Error(`Invalid plugin name [${plugin.name}] in package.json`); } } -//***************************************** -//Examine each package.json file to determine the plugin name, -//version, and platform. -//***************************************** -async function readPackageData(settings, packages) { + +/** + * Examine each package.json file to determine the plugin name, + * version, and platform. Mutates the package objects in the packages array + * @param {object} settings - a plugin installer settings object + * @param {array} packages - array of package objects from listPackages() + */ +async function mergePackageData(settings, packages) { return packages.map((pkg) => { const fullPath = resolve(settings.workingPath, pkg.file); const packageInfo = require(fullPath); @@ -78,11 +79,12 @@ async function readPackageData(settings, packages) { }); } -//***************************************** -//Extracts the first plugin in the archive. -//This will need to be changed in later versions of the pack installer -//that allow for the installation of more than one plugin at once. -//***************************************** +/** + * Extracts the first plugin in the archive. + * NOTE: This will need to be changed in later versions of the pack installer + * that allow for the installation of more than one plugin at once. + * @param {object} settings - a plugin installer settings object + */ async function extractArchive(settings) { const filter = { paths: [ settings.plugins[0].folder ] @@ -90,20 +92,23 @@ async function extractArchive(settings) { await extractFiles(settings.tempArchiveFile, settings.workingPath, 2, filter); } -//***************************************** -//Returns the detailed information about each kibana plugin in the -//pack. -//TODO: If there are platform specific folders, determine which one to use. -//***************************************** + +/** + * Returns the detailed information about each kibana plugin in the pack. + * TODO: If there are platform specific folders, determine which one to use. + * @param {object} settings - a plugin installer settings object + * @param {object} logger - a plugin installer logger object + */ export async function getPackData(settings, logger) { let packages; try { logger.log('Retrieving metadata from plugin archive'); packages = await listPackages(settings); + await extractPackageFiles(settings, packages); - await readPackageData(settings, packages); - await deletePackageFiles(settings, packages); + await mergePackageData(settings, packages); + await deletePackageFiles(settings); } catch (err) { logger.error(err); throw new Error('Error retrieving metadata from plugin archive'); @@ -112,7 +117,7 @@ export async function getPackData(settings, logger) { if (packages.length === 0) { throw new Error('No kibana plugins found in archive'); } - packages.forEach(validatePackageName); + packages.forEach(assertValidPackageName); settings.plugins = packages; } diff --git a/src/cli_plugin/install/progress.js b/src/cli_plugin/install/progress.js index ec86bf11cc04..dca7f9a2b88f 100644 --- a/src/cli_plugin/install/progress.js +++ b/src/cli_plugin/install/progress.js @@ -1,39 +1,38 @@ -/* -Generates file transfer progress messages -*/ -export default function Progress(logger) { - const self = this; +/** + * Generates file transfer progress messages + */ +export default class Progress { - self.dotCount = 0; - self.runningTotal = 0; - self.totalSize = 0; - self.logger = logger; -} + constructor(logger) { + const self = this; -Progress.prototype.init = function (size) { - const self = this; - - self.totalSize = size; - const totalDesc = self.totalSize || 'unknown number of'; - - self.logger.log(`Transferring ${totalDesc} bytes`, true); -}; - -Progress.prototype.progress = function (size) { - const self = this; - - if (!self.totalSize) return; - - self.runningTotal += size; - let newDotCount = Math.round(self.runningTotal / self.totalSize * 100 / 5); - if (newDotCount > 20) newDotCount = 20; - for (let i = 0; i < (newDotCount - self.dotCount); i++) { - self.logger.log('.', true); + self.dotCount = 0; + self.runningTotal = 0; + self.totalSize = 0; + self.logger = logger; } - self.dotCount = newDotCount; -}; -Progress.prototype.complete = function () { - const self = this; - self.logger.log(`Transfer complete`, false); -}; + init(size) { + this.totalSize = size; + const totalDesc = this.totalSize || 'unknown number of'; + + this.logger.log(`Transferring ${totalDesc} bytes`, true); + } + + progress(size) { + if (!this.totalSize) return; + + this.runningTotal += size; + let newDotCount = Math.round(this.runningTotal / this.totalSize * 100 / 5); + if (newDotCount > 20) newDotCount = 20; + for (let i = 0; i < (newDotCount - this.dotCount); i++) { + this.logger.log('.', true); + } + this.dotCount = newDotCount; + } + + complete() { + this.logger.log(`Transfer complete`, false); + } + +} diff --git a/src/cli_plugin/install/settings.js b/src/cli_plugin/install/settings.js index 4b904d67513a..f9f87c1b6772 100644 --- a/src/cli_plugin/install/settings.js +++ b/src/cli_plugin/install/settings.js @@ -3,8 +3,7 @@ import { intersection } from 'lodash'; import { resolve } from 'path'; import { arch, platform } from 'os'; -function generateUrls(settings) { - const { version, plugin } = settings; +function generateUrls({ version, plugin }) { return [ plugin, `https://download.elastic.co/packs/${plugin}/${plugin}-${version}.zip` @@ -15,7 +14,7 @@ export function parseMilliseconds(val) { let result; try { - let timeVal = expiry(val); + const timeVal = expiry(val); result = timeVal.asMilliseconds(); } catch (ex) { result = 0; @@ -26,13 +25,13 @@ export function parseMilliseconds(val) { export function parse(command, options, kbnPackage) { const settings = { - timeout: options.timeout ? options.timeout : 0, - quiet: options.quiet ? options.quiet : false, - silent: options.silent ? options.silent : false, - config: options.config ? options.config : '', + timeout: options.timeout || 0, + quiet: options.quiet || false, + silent: options.silent || false, + config: options.config || '', plugin: command, version: kbnPackage.version, - pluginDir: options.pluginDir ? options.pluginDir : '' + pluginDir: options.pluginDir || '' }; settings.urls = generateUrls(settings); diff --git a/src/cli_plugin/install/zip.js b/src/cli_plugin/install/zip.js index 1bac0c13400a..38dd82f013c4 100644 --- a/src/cli_plugin/install/zip.js +++ b/src/cli_plugin/install/zip.js @@ -1,45 +1,62 @@ import _ from 'lodash'; import DecompressZip from '@bigfunger/decompress-zip'; -//*********************************************** -//Creates a filter function to be consumed by extractFiles -// -//filter: an object with either a files or paths property. -//filter.files: an array of full file paths to extract. Should match -// exactly a value from listFiles -//filter.paths: an array of root paths from the archive. All files and -// folders will be extracted recursively using these paths as roots. -//*********************************************** +const SYMBOLIC_LINK = 'SymbolicLink'; + +/** + * Creates a filter function to be consumed by extractFiles that filters by + * an array of files + * @param {array} files - an array of full file paths to extract. Should match + * exactly a value from listFiles + */ +function extractFilterFromFiles(files) { + const filterFiles = files.map((file) => file.replace(/\\/g, '/')); + return function filterByFiles(file) { + if (file.type === SYMBOLIC_LINK) return false; + + const path = file.path.replace(/\\/g, '/'); + return _.includes(filterFiles, path); + }; +} + +/** + * Creates a filter function to be consumed by extractFiles that filters by + * an array of root paths + * @param {array} paths - an array of root paths from the archive. All files and + * folders will be extracted recursively using these paths as roots. + */ +function extractFilterFromPaths(paths) { + return function filterByRootPath(file) { + if (file.type === SYMBOLIC_LINK) return false; + + return paths.some(path => { + const regex = new RegExp(`${path}($|/)`, 'i'); + return file.parent.match(regex); + }); + }; +} + +/** + * Creates a filter function to be consumed by extractFiles + * @param {object} filter - an object with either a files or paths property. + */ function extractFilter(filter) { - if (filter.files) { - const filterFiles = filter.files.map((file) => file.replace(/\\/g, '/')); - return function filterByFiles(file) { - if (file.type === 'SymbolicLink') return false; - - const path = file.path.replace(/\\/g, '/'); - return !!(_.indexOf(filterFiles, path) !== -1); - }; - } - - if (filter.paths) { - return function filterByRootPath(file) { - if (file.type === 'SymbolicLink') return false; - - let include = false; - filter.paths.forEach((path) => { - const regex = new RegExp(`${path}($|/)`, 'i'); - if ((file.parent.match(regex)) && file.type !== 'SymbolicLink') { - include = true; - } - }); - - return include; - }; - } - + if (filter.files) return extractFilterFromFiles(filter.files); + if (filter.paths) return extractFilterFromPaths(filter.paths); return _.noop; } +/** + * Extracts files from a zip archive to a file path using a filter function + * @param {string} zipPath - file path to a zip archive + * @param {string} targetPath - directory path to where the files should + * extracted + * @param {integer} strip - Number of nested directories within the archive + * that should be ignored when determining the target path of an archived + * file. + * @param {function} filter - A function that accepts a single parameter 'file' + * and returns true if the file should be extracted from the archive + */ export async function extractFiles(zipPath, targetPath, strip, filter) { await new Promise((resolve, reject) => { const unzipper = new DecompressZip(zipPath); @@ -56,6 +73,11 @@ export async function extractFiles(zipPath, targetPath, strip, filter) { }); } +/** + * Returns all files within an archive + * @param {string} zipPath - file path to a zip archive + * @returns {array} all files within an archive with their relative paths + */ export async function listFiles(zipPath) { return await new Promise((resolve, reject) => { const unzipper = new DecompressZip(zipPath); diff --git a/src/cli_plugin/lib/logger.js b/src/cli_plugin/lib/logger.js index 647caef5bf41..16bc15f33e02 100644 --- a/src/cli_plugin/lib/logger.js +++ b/src/cli_plugin/lib/logger.js @@ -1,45 +1,46 @@ -export default function Logger(settings) { - const self = this; +/** + * Logs messages and errors + */ +export default class Logger { + + constructor(settings) { + this.previousLineEnded = true; + this.silent = !!settings.silent; + this.quiet = !!settings.quiet; + } + + log(data, sameLine) { + if (this.silent || this.quiet) return; + + if (!sameLine && !this.previousLineEnded) { + process.stdout.write('\n'); + } + + //if data is a stream, pipe it. + if (data.readable) { + data.pipe(process.stdout); + return; + } + + process.stdout.write(data); + if (!sameLine) process.stdout.write('\n'); + this.previousLineEnded = !sameLine; + } + + error(data) { + if (this.silent) return; + + if (!this.previousLineEnded) { + process.stderr.write('\n'); + } + + //if data is a stream, pipe it. + if (data.readable) { + data.pipe(process.stderr); + return; + } + process.stderr.write(`${data}\n`); + this.previousLineEnded = true; + }; - self.previousLineEnded = true; - self.silent = !!settings.silent; - self.quiet = !!settings.quiet; } - -Logger.prototype.log = function (data, sameLine) { - const self = this; - - if (self.silent || self.quiet) return; - - if (!sameLine && !self.previousLineEnded) { - process.stdout.write('\n'); - } - - //if data is a stream, pipe it. - if (data.readable) { - data.pipe(process.stdout); - return; - } - - process.stdout.write(data); - if (!sameLine) process.stdout.write('\n'); - self.previousLineEnded = !sameLine; -}; - -Logger.prototype.error = function (data) { - const self = this; - - if (self.silent) return; - - if (!self.previousLineEnded) { - process.stderr.write('\n'); - } - - //if data is a stream, pipe it. - if (data.readable) { - data.pipe(process.stderr); - return; - } - process.stderr.write(`${data}\n`); - self.previousLineEnded = true; -}; diff --git a/src/cli_plugin/list/index.js b/src/cli_plugin/list/index.js index d1d8b8e8c66c..d1ac7e361c8e 100644 --- a/src/cli_plugin/list/index.js +++ b/src/cli_plugin/list/index.js @@ -3,21 +3,21 @@ import list from './list'; import Logger from '../lib/logger'; import { parse } from './settings'; -export default function pluginList(program) { - function processCommand(command, options) { - let settings; - try { - settings = parse(command, options); - } catch (ex) { - //The logger has not yet been initialized. - console.error(ex.message); - process.exit(64); // eslint-disable-line no-process-exit - } - - const logger = new Logger(settings); - list(settings, logger); +function processCommand(command, options) { + let settings; + try { + settings = parse(command, options); + } catch (ex) { + //The logger has not yet been initialized. + console.error(ex.message); + process.exit(64); // eslint-disable-line no-process-exit } + const logger = new Logger(settings); + list(settings, logger); +} + +export default function pluginList(program) { program .command('list') .option( diff --git a/src/cli_plugin/list/list.js b/src/cli_plugin/list/list.js index 05d2b3e3d66e..9d1427a25a45 100644 --- a/src/cli_plugin/list/list.js +++ b/src/cli_plugin/list/list.js @@ -10,5 +10,5 @@ export default function list(settings, logger) { logger.log(filename); } }); - logger.log(''); + logger.log(''); //intentional blank line for aesthetics } diff --git a/src/cli_plugin/list/settings.js b/src/cli_plugin/list/settings.js index c6a770feb74b..f372bfc0d35e 100644 --- a/src/cli_plugin/list/settings.js +++ b/src/cli_plugin/list/settings.js @@ -2,7 +2,7 @@ import { resolve } from 'path'; export function parse(command, options) { const settings = { - pluginDir: command.pluginDir ? command.pluginDir : '' + pluginDir: command.pluginDir || '' }; return settings; diff --git a/src/cli_plugin/remove/__tests__/remove.js b/src/cli_plugin/remove/__tests__/remove.js index 8b9bdcccf938..567f67c33c9a 100644 --- a/src/cli_plugin/remove/__tests__/remove.js +++ b/src/cli_plugin/remove/__tests__/remove.js @@ -10,15 +10,13 @@ import { writeFileSync } from 'fs'; describe('kibana cli', function () { - describe('plugin lister', function () { + describe('plugin remover', function () { const pluginDir = join(__dirname, '.test.data'); let processExitStub; let logger; - const settings = { - pluginDir: pluginDir - }; + const settings = { pluginDir }; beforeEach(function () { processExitStub = sinon.stub(process, 'exit'); diff --git a/src/cli_plugin/remove/index.js b/src/cli_plugin/remove/index.js index 92377882e56b..c919befde59f 100644 --- a/src/cli_plugin/remove/index.js +++ b/src/cli_plugin/remove/index.js @@ -3,21 +3,21 @@ import remove from './remove'; import Logger from '../lib/logger'; import { parse } from './settings'; -export default function pluginList(program) { - function processCommand(command, options) { - let settings; - try { - settings = parse(command, options); - } catch (ex) { - //The logger has not yet been initialized. - console.error(ex.message); - process.exit(64); // eslint-disable-line no-process-exit - } - - const logger = new Logger(settings); - remove(settings, logger); +function processCommand(command, options) { + let settings; + try { + settings = parse(command, options); + } catch (ex) { + //The logger has not yet been initialized. + console.error(ex.message); + process.exit(64); // eslint-disable-line no-process-exit } + const logger = new Logger(settings); + remove(settings, logger); +} + +export default function pluginRemove(program) { program .command('remove ') .option('-q, --quiet', 'Disable all process messaging except errors') diff --git a/src/cli_plugin/remove/settings.js b/src/cli_plugin/remove/settings.js index 94f3b8ee5f40..7e7ed37d2e5a 100644 --- a/src/cli_plugin/remove/settings.js +++ b/src/cli_plugin/remove/settings.js @@ -2,10 +2,10 @@ import { resolve } from 'path'; export function parse(command, options) { const settings = { - quiet: options.quiet ? options.quiet : false, - silent: options.silent ? options.silent : false, - config: options.config ? options.config : '', - pluginDir: options.pluginDir ? options.pluginDir : '', + quiet: options.quiet || false, + silent: options.silent || false, + config: options.config || '', + pluginDir: options.pluginDir || '', plugin: command }; From 041cc3b297e61c0863e1745bcd33bb49221f03f2 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Fri, 18 Mar 2016 09:35:25 -0500 Subject: [PATCH 10/23] [pack installer] fixed file paths and lower-cased all help messages --- src/cli_plugin/cli.js | 4 ++-- src/cli_plugin/index.js | 2 +- src/cli_plugin/install/index.js | 16 ++++++++-------- src/cli_plugin/install/kibana.js | 4 ++-- src/cli_plugin/list/__tests__/settings.js | 2 +- src/cli_plugin/list/index.js | 6 +++--- src/cli_plugin/remove/__tests__/settings.js | 2 +- src/cli_plugin/remove/index.js | 14 +++++++------- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/cli_plugin/cli.js b/src/cli_plugin/cli.js index 8e9807d82a3f..f3eb350c8b33 100644 --- a/src/cli_plugin/cli.js +++ b/src/cli_plugin/cli.js @@ -1,5 +1,5 @@ import _ from 'lodash'; -import pkg from '../utils/packageJson'; +import pkg from '../utils/package_json'; import Command from '../cli/Command'; import listCommand from './list'; import installCommand from './install'; @@ -21,7 +21,7 @@ removeCommand(program); program .command('help ') -.description('Get the help for a specific command') +.description('get the help for a specific command') .action(function (cmdName) { var cmd = _.find(program.commands, { _name: cmdName }); if (!cmd) return program.error(`unknown command ${cmdName}`); diff --git a/src/cli_plugin/index.js b/src/cli_plugin/index.js index e7f562b57115..a0cd17d62f15 100644 --- a/src/cli_plugin/index.js +++ b/src/cli_plugin/index.js @@ -1,5 +1,5 @@ // load the babel options seperately so that they can modify the process.env // before calling babel/register -const babelOptions = require('../optimize/babelOptions').node; +const babelOptions = require('../optimize/babel_options').node; require('babel/register')(babelOptions); require('./cli'); diff --git a/src/cli_plugin/install/index.js b/src/cli_plugin/install/index.js index bebc6130ba30..ceb587fc3502 100644 --- a/src/cli_plugin/install/index.js +++ b/src/cli_plugin/install/index.js @@ -1,7 +1,7 @@ -import fromRoot from '../../utils/fromRoot'; +import fromRoot from '../../utils/from_root'; import install from './install'; import Logger from '../lib/logger'; -import pkg from '../../utils/packageJson'; +import pkg from '../../utils/package_json'; import { parse, parseMilliseconds } from './settings'; function processCommand(command, options) { @@ -21,24 +21,24 @@ function processCommand(command, options) { export default function pluginInstall(program) { program .command('install ') - .option('-q, --quiet', 'Disable all process messaging except errors') - .option('-s, --silent', 'Disable all process messaging') + .option('-q, --quiet', 'disable all process messaging except errors') + .option('-s, --silent', 'disable all process messaging') .option( '-c, --config ', - 'Path to the config file', + 'path to the config file', fromRoot('config/kibana.yml') ) .option( '-t, --timeout ', - 'Length of time before failing; 0 for never fail', + 'length of time before failing; 0 for never fail', parseMilliseconds ) .option( '-d, --plugin-dir ', - 'The path to the directory where plugins are stored', + 'path to the directory where plugins are stored', fromRoot('installedPlugins') ) - .description('Install a plugin', + .description('install a plugin', `Common examples: install xpack install file:///Path/to/my/xpack.zip diff --git a/src/cli_plugin/install/kibana.js b/src/cli_plugin/install/kibana.js index 6143098bcf7c..cf3dc20321c5 100644 --- a/src/cli_plugin/install/kibana.js +++ b/src/cli_plugin/install/kibana.js @@ -1,6 +1,6 @@ import _ from 'lodash'; -import fromRoot from '../../utils/fromRoot'; -import KbnServer from '../../server/KbnServer'; +import fromRoot from '../../utils/from_root'; +import KbnServer from '../../server/kbn_server'; import readYamlConfig from '../../cli/serve/read_yaml_config'; import { statSync } from 'fs'; diff --git a/src/cli_plugin/list/__tests__/settings.js b/src/cli_plugin/list/__tests__/settings.js index a4545343a49c..8e08e5b17ad5 100644 --- a/src/cli_plugin/list/__tests__/settings.js +++ b/src/cli_plugin/list/__tests__/settings.js @@ -1,6 +1,6 @@ import path from 'path'; import expect from 'expect.js'; -import fromRoot from '../../../utils/fromRoot'; +import fromRoot from '../../../utils/from_root'; import { resolve } from 'path'; import { parseMilliseconds, parse } from '../settings'; diff --git a/src/cli_plugin/list/index.js b/src/cli_plugin/list/index.js index d1ac7e361c8e..348fa99261d5 100644 --- a/src/cli_plugin/list/index.js +++ b/src/cli_plugin/list/index.js @@ -1,4 +1,4 @@ -import fromRoot from '../../utils/fromRoot'; +import fromRoot from '../../utils/from_root'; import list from './list'; import Logger from '../lib/logger'; import { parse } from './settings'; @@ -22,9 +22,9 @@ export default function pluginList(program) { .command('list') .option( '-d, --plugin-dir ', - 'The path to the directory where plugins are stored', + 'path to the directory where plugins are stored', fromRoot('installedPlugins') ) - .description('List installed plugins') + .description('list installed plugins') .action(processCommand); }; diff --git a/src/cli_plugin/remove/__tests__/settings.js b/src/cli_plugin/remove/__tests__/settings.js index 7a3d9eeca579..b87600d95968 100644 --- a/src/cli_plugin/remove/__tests__/settings.js +++ b/src/cli_plugin/remove/__tests__/settings.js @@ -1,6 +1,6 @@ import path from 'path'; import expect from 'expect.js'; -import fromRoot from '../../../utils/fromRoot'; +import fromRoot from '../../../utils/from_root'; import { resolve } from 'path'; import { parseMilliseconds, parse } from '../settings'; diff --git a/src/cli_plugin/remove/index.js b/src/cli_plugin/remove/index.js index c919befde59f..0f6fbfb31736 100644 --- a/src/cli_plugin/remove/index.js +++ b/src/cli_plugin/remove/index.js @@ -1,4 +1,4 @@ -import fromRoot from '../../utils/fromRoot'; +import fromRoot from '../../utils/from_root'; import remove from './remove'; import Logger from '../lib/logger'; import { parse } from './settings'; @@ -20,20 +20,20 @@ function processCommand(command, options) { export default function pluginRemove(program) { program .command('remove ') - .option('-q, --quiet', 'Disable all process messaging except errors') - .option('-s, --silent', 'Disable all process messaging') + .option('-q, --quiet', 'disable all process messaging except errors') + .option('-s, --silent', 'disable all process messaging') .option( '-c, --config ', - 'Path to the config file', + 'path to the config file', fromRoot('config/kibana.yml') ) .option( '-d, --plugin-dir ', - 'The path to the directory where plugins are stored', + 'path to the directory where plugins are stored', fromRoot('installedPlugins') ) - .description('Remove a plugin', -`Common examples: + .description('remove a plugin', +`common examples: remove xpack`) .action(processCommand); }; From 75598c5f45cb4fc3123eece939d58b9d2d3b8d37 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Fri, 18 Mar 2016 10:08:35 -0500 Subject: [PATCH 11/23] [pack installer] fixed test --- src/cli_plugin/install/__tests__/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli_plugin/install/__tests__/index.js b/src/cli_plugin/install/__tests__/index.js index 4b5e0eb8d367..470d9452a1c1 100644 --- a/src/cli_plugin/install/__tests__/index.js +++ b/src/cli_plugin/install/__tests__/index.js @@ -28,7 +28,7 @@ describe('kibana cli', function () { sinon.spy(program, 'description'); index(program); - expect(program.description.calledWith('Install a plugin')).to.be(true); + expect(program.description.calledWith('install a plugin')).to.be(true); program.description.restore(); }); From d65e7be13d90d9b9f43b4823db1349add92cf784 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Fri, 18 Mar 2016 10:55:45 -0500 Subject: [PATCH 12/23] [pack installer] changed version checking to use semver --- src/cli_plugin/install/__tests__/kibana.js | 50 +++++++++++++++++-- src/cli_plugin/install/install.js | 4 +- src/cli_plugin/install/kibana.js | 5 +- .../lib/__tests__/version_satisfies.js | 2 +- .../elasticsearch/lib/check_es_version.js | 2 +- .../lib => utils}/version_satisfies.js | 0 6 files changed, 53 insertions(+), 10 deletions(-) rename src/{plugins/elasticsearch/lib => utils}/version_satisfies.js (100%) diff --git a/src/cli_plugin/install/__tests__/kibana.js b/src/cli_plugin/install/__tests__/kibana.js index 792cb32b5262..fbf128d9dc01 100644 --- a/src/cli_plugin/install/__tests__/kibana.js +++ b/src/cli_plugin/install/__tests__/kibana.js @@ -4,7 +4,7 @@ import Logger from '../../lib/logger'; import { join } from 'path'; import rimraf from 'rimraf'; import mkdirp from 'mkdirp'; -import { existingInstall, checkVersion } from '../kibana'; +import { existingInstall, assertVersion } from '../kibana'; describe('kibana cli', function () { @@ -24,7 +24,7 @@ describe('kibana cli', function () { const logger = new Logger(settings); - describe('checkVersion', function () { + describe('assertVersion', function () { beforeEach(function () { rimraf.sync(testWorkingPath); @@ -43,7 +43,7 @@ describe('kibana cli', function () { const errorStub = sinon.stub(); try { - checkVersion(settings); + assertVersion(settings); } catch (err) { errorStub(err); @@ -57,7 +57,49 @@ describe('kibana cli', function () { settings.plugins[0].version = '1.2.3.4'; try { - checkVersion(settings); + assertVersion(settings); + } + catch (err) { + errorStub(err); + } + + expect(errorStub.firstCall.args[0]).to.match(/incorrect version/i); + }); + + it('should not throw an error if plugin version matches kibana version', function () { + const errorStub = sinon.stub(); + settings.plugins[0].version = '1.0.0'; + + try { + assertVersion(settings); + } + catch (err) { + errorStub(err); + } + + expect(errorStub.called).to.be(false); + }); + + it('should ignore version info after the dash in checks on valid version', function () { + const errorStub = sinon.stub(); + settings.plugins[0].version = '1.0.0-foo-bar-version-1.2.3'; + + try { + assertVersion(settings); + } + catch (err) { + errorStub(err); + } + + expect(errorStub.called).to.be(false); + }); + + it('should ignore version info after the dash in checks on invalid version', function () { + const errorStub = sinon.stub(); + settings.plugins[0].version = '2.0.0-foo-bar-version-1.2.3'; + + try { + assertVersion(settings); } catch (err) { errorStub(err); diff --git a/src/cli_plugin/install/install.js b/src/cli_plugin/install/install.js index 0a83f432e61a..1c72827cad71 100644 --- a/src/cli_plugin/install/install.js +++ b/src/cli_plugin/install/install.js @@ -4,7 +4,7 @@ import { cleanPrevious, cleanArtifacts } from './cleanup'; import { extract, getPackData } from './pack'; import { sync as rimrafSync } from 'rimraf'; import { renameSync } from 'fs'; -import { existingInstall, rebuildCache, checkVersion } from './kibana'; +import { existingInstall, rebuildCache, assertVersion } from './kibana'; import mkdirp from 'mkdirp'; const mkdir = Promise.promisify(mkdirp); @@ -25,7 +25,7 @@ export default async function install(settings, logger) { existingInstall(settings, logger); - checkVersion(settings); + assertVersion(settings); renameSync(settings.workingPath, settings.plugins[0].path); diff --git a/src/cli_plugin/install/kibana.js b/src/cli_plugin/install/kibana.js index cf3dc20321c5..e23cee8fde28 100644 --- a/src/cli_plugin/install/kibana.js +++ b/src/cli_plugin/install/kibana.js @@ -2,6 +2,7 @@ import _ from 'lodash'; import fromRoot from '../../utils/from_root'; import KbnServer from '../../server/kbn_server'; import readYamlConfig from '../../cli/serve/read_yaml_config'; +import versionSatisfies from '../../utils/version_satisfies'; import { statSync } from 'fs'; export function existingInstall(settings, logger) { @@ -44,12 +45,12 @@ export async function rebuildCache(settings, logger) { await kbnServer.close(); } -export function checkVersion(settings) { +export function assertVersion(settings) { if (!settings.plugins[0].version) { throw new Error (`Plugin version not found. Check package.json in archive`); } - if (settings.plugins[0].version !== settings.version) { + if (!versionSatisfies(settings.plugins[0].version, settings.version)) { throw new Error (`Incorrect version in plugin [${settings.plugins[0].name}]. ` + `Expected [${settings.version}]; found [${settings.plugins[0].version}]`); } diff --git a/src/plugins/elasticsearch/lib/__tests__/version_satisfies.js b/src/plugins/elasticsearch/lib/__tests__/version_satisfies.js index c63f6ce09d1d..1edee9876b94 100644 --- a/src/plugins/elasticsearch/lib/__tests__/version_satisfies.js +++ b/src/plugins/elasticsearch/lib/__tests__/version_satisfies.js @@ -1,4 +1,4 @@ -import versionSatisfies from '../version_satisfies'; +import versionSatisfies from '../../../../utils/version_satisfies'; import expect from 'expect.js'; const versionChecks = [ diff --git a/src/plugins/elasticsearch/lib/check_es_version.js b/src/plugins/elasticsearch/lib/check_es_version.js index a0cec4ac7a71..892ebbd67ac0 100644 --- a/src/plugins/elasticsearch/lib/check_es_version.js +++ b/src/plugins/elasticsearch/lib/check_es_version.js @@ -1,6 +1,6 @@ import _ from 'lodash'; import esBool from './es_bool'; -import versionSatisfies from './version_satisfies'; +import versionSatisfies from '../../../utils/version_satisfies'; import SetupError from './setup_error'; module.exports = function (server) { diff --git a/src/plugins/elasticsearch/lib/version_satisfies.js b/src/utils/version_satisfies.js similarity index 100% rename from src/plugins/elasticsearch/lib/version_satisfies.js rename to src/utils/version_satisfies.js From f24c3b7d325d4c24e154fd4e9bc4a9c1b78ab876 Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Mon, 14 Mar 2016 14:49:19 -0700 Subject: [PATCH 13/23] chmod +x --- bin/kibana-plugin | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/kibana-plugin diff --git a/bin/kibana-plugin b/bin/kibana-plugin old mode 100644 new mode 100755 From f701df528f0f2b393efe74293b62018bdca4186c Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Fri, 18 Mar 2016 14:43:24 -0500 Subject: [PATCH 14/23] [pack installer] fixed version checking --- src/cli_plugin/install/__tests__/kibana.js | 20 +++++++++++++++++++ src/cli_plugin/install/kibana.js | 8 +++++--- src/cli_plugin/install/version.js | 15 ++++++++++++++ .../lib/__tests__/version_satisfies.js | 2 +- .../elasticsearch/lib}/version_satisfies.js | 0 5 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/cli_plugin/install/version.js rename src/{utils => plugins/elasticsearch/lib}/version_satisfies.js (100%) diff --git a/src/cli_plugin/install/__tests__/kibana.js b/src/cli_plugin/install/__tests__/kibana.js index fbf128d9dc01..2ae0a1e2589a 100644 --- a/src/cli_plugin/install/__tests__/kibana.js +++ b/src/cli_plugin/install/__tests__/kibana.js @@ -39,6 +39,26 @@ describe('kibana cli', function () { rimraf.sync(testWorkingPath); }); + it('should succeed with exact match', function () { + const settings = { + workingPath: testWorkingPath, + tempArchiveFile: tempArchiveFilePath, + plugin: 'test-plugin', + version: '5.0.0-snapshot', + plugins: [ { name: 'foo', path: join(testWorkingPath, 'foo'), version: '5.0.0-snapshot' } ] + }; + const errorStub = sinon.stub(); + + try { + assertVersion(settings); + } + catch (err) { + errorStub(err); + } + + expect(errorStub.called).to.be(false); + }); + it('should throw an error if plugin does contain a version.', function () { const errorStub = sinon.stub(); diff --git a/src/cli_plugin/install/kibana.js b/src/cli_plugin/install/kibana.js index e23cee8fde28..03097b11b1d4 100644 --- a/src/cli_plugin/install/kibana.js +++ b/src/cli_plugin/install/kibana.js @@ -2,7 +2,7 @@ import _ from 'lodash'; import fromRoot from '../../utils/from_root'; import KbnServer from '../../server/kbn_server'; import readYamlConfig from '../../cli/serve/read_yaml_config'; -import versionSatisfies from '../../utils/version_satisfies'; +import { versionSatisfies, cleanVersion } from './version'; import { statSync } from 'fs'; export function existingInstall(settings, logger) { @@ -50,8 +50,10 @@ export function assertVersion(settings) { throw new Error (`Plugin version not found. Check package.json in archive`); } - if (!versionSatisfies(settings.plugins[0].version, settings.version)) { + const actual = cleanVersion(settings.plugins[0].version); + const expected = cleanVersion(settings.version); + if (!versionSatisfies(actual, expected)) { throw new Error (`Incorrect version in plugin [${settings.plugins[0].name}]. ` + - `Expected [${settings.version}]; found [${settings.plugins[0].version}]`); + `Expected [${expected}]; found [${actual}]`); } } diff --git a/src/cli_plugin/install/version.js b/src/cli_plugin/install/version.js new file mode 100644 index 000000000000..a2a37d0dd23b --- /dev/null +++ b/src/cli_plugin/install/version.js @@ -0,0 +1,15 @@ +import semver from 'semver'; + +export function versionSatisfies(cleanActual, cleanExpected) { + try { + return (cleanActual === cleanExpected); + } catch (err) { + return false; + } +} + +export function cleanVersion(version) { + const match = version.match(/\d+\.\d+\.\d+/); + if (!match) return version; + return match[0]; +} diff --git a/src/plugins/elasticsearch/lib/__tests__/version_satisfies.js b/src/plugins/elasticsearch/lib/__tests__/version_satisfies.js index 1edee9876b94..c63f6ce09d1d 100644 --- a/src/plugins/elasticsearch/lib/__tests__/version_satisfies.js +++ b/src/plugins/elasticsearch/lib/__tests__/version_satisfies.js @@ -1,4 +1,4 @@ -import versionSatisfies from '../../../../utils/version_satisfies'; +import versionSatisfies from '../version_satisfies'; import expect from 'expect.js'; const versionChecks = [ diff --git a/src/utils/version_satisfies.js b/src/plugins/elasticsearch/lib/version_satisfies.js similarity index 100% rename from src/utils/version_satisfies.js rename to src/plugins/elasticsearch/lib/version_satisfies.js From cbfcd56116296127a1e9fea331f53a5e478b271f Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Tue, 22 Mar 2016 11:07:41 -0500 Subject: [PATCH 15/23] [pack installer] fixed path --- src/plugins/elasticsearch/lib/check_es_version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/elasticsearch/lib/check_es_version.js b/src/plugins/elasticsearch/lib/check_es_version.js index 892ebbd67ac0..a0cec4ac7a71 100644 --- a/src/plugins/elasticsearch/lib/check_es_version.js +++ b/src/plugins/elasticsearch/lib/check_es_version.js @@ -1,6 +1,6 @@ import _ from 'lodash'; import esBool from './es_bool'; -import versionSatisfies from '../../../utils/version_satisfies'; +import versionSatisfies from './version_satisfies'; import SetupError from './setup_error'; module.exports = function (server) { From 738e3d0105af94583b7e6542835de870398a0c16 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 23 Mar 2016 10:02:49 -0500 Subject: [PATCH 16/23] [server] Add server.name --- config/kibana.yml | 3 +++ src/server/config/schema.js | 2 ++ 2 files changed, 5 insertions(+) diff --git a/config/kibana.yml b/config/kibana.yml index 37c4292d6e42..0e122d193dcf 100644 --- a/config/kibana.yml +++ b/config/kibana.yml @@ -11,6 +11,9 @@ # The maximum payload size in bytes for incoming server requests. # server.maxPayloadBytes: 1048576 +# The Kibana server's name. This is used for display purposes. +# server.name: "your-hostname" + # The URL of the Elasticsearch instance to use for all your queries. # elasticsearch.url: "http://localhost:9200" diff --git a/src/server/config/schema.js b/src/server/config/schema.js index 45dbdf1defb4..329a7ff827f1 100644 --- a/src/server/config/schema.js +++ b/src/server/config/schema.js @@ -3,6 +3,7 @@ import fs from 'fs'; import path from 'path'; import { get } from 'lodash'; import { randomBytes } from 'crypto'; +import os from 'os'; import fromRoot from '../../utils/from_root'; @@ -29,6 +30,7 @@ module.exports = () => Joi.object({ }).default(), server: Joi.object({ + name: Joi.string().default(os.hostname()), host: Joi.string().hostname().default('0.0.0.0'), port: Joi.number().default(5601), maxPayloadBytes: Joi.number().default(1048576), From 3016d83e4d3d61ac1f24cef36a97311458828f92 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 23 Mar 2016 10:05:00 -0500 Subject: [PATCH 17/23] [status] Add name to /api/status response --- src/server/status/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/status/index.js b/src/server/status/index.js index c2d73d1c823a..5efbdf50b756 100644 --- a/src/server/status/index.js +++ b/src/server/status/index.js @@ -14,6 +14,7 @@ module.exports = function (kbnServer, server, config) { path: '/api/status', handler: function (request, reply) { return reply({ + name: config.get('server.name'), status: kbnServer.status.toJSON(), metrics: kbnServer.metrics }); From dcf1dac8c068fde3dc108f4a19307751a15ee438 Mon Sep 17 00:00:00 2001 From: Jim Unger Date: Wed, 23 Mar 2016 15:10:45 -0500 Subject: [PATCH 18/23] [pack installer] fixed case on import statement --- src/cli_plugin/cli.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli_plugin/cli.js b/src/cli_plugin/cli.js index f3eb350c8b33..5f322a48bb28 100644 --- a/src/cli_plugin/cli.js +++ b/src/cli_plugin/cli.js @@ -1,6 +1,6 @@ import _ from 'lodash'; import pkg from '../utils/package_json'; -import Command from '../cli/Command'; +import Command from '../cli/command'; import listCommand from './list'; import installCommand from './install'; import removeCommand from './remove'; From 408a848fa3fee98ea37f8610c32d7c3a11c7b9c8 Mon Sep 17 00:00:00 2001 From: Rashid Khan Date: Wed, 23 Mar 2016 14:17:19 -0700 Subject: [PATCH 19/23] Move notify.less to notify directory --- src/ui/public/{styles => notify}/notify.less | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/ui/public/{styles => notify}/notify.less (100%) diff --git a/src/ui/public/styles/notify.less b/src/ui/public/notify/notify.less similarity index 100% rename from src/ui/public/styles/notify.less rename to src/ui/public/notify/notify.less From fba6471979ae60f6137a19a4471bba85df5b36ca Mon Sep 17 00:00:00 2001 From: Rashid Khan Date: Wed, 23 Mar 2016 14:20:12 -0700 Subject: [PATCH 20/23] Say 'stop' on hover --- src/ui/public/notify/directives.js | 2 ++ src/ui/public/notify/notify.less | 18 ++++++++++++++++++ src/ui/public/notify/partials/toaster.html | 5 +++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/ui/public/notify/directives.js b/src/ui/public/notify/directives.js index 8d25ceeff110..8582b0bf8171 100644 --- a/src/ui/public/notify/directives.js +++ b/src/ui/public/notify/directives.js @@ -1,6 +1,8 @@ import _ from 'lodash'; import uiModules from 'ui/modules'; import toasterTemplate from 'ui/notify/partials/toaster.html'; +import 'ui/notify/notify.less'; + var notify = uiModules.get('kibana/notify'); notify.directive('kbnNotifications', function () { diff --git a/src/ui/public/notify/notify.less b/src/ui/public/notify/notify.less index 30476796b3d4..32b0345ca678 100644 --- a/src/ui/public/notify/notify.less +++ b/src/ui/public/notify/notify.less @@ -8,6 +8,24 @@ margin: 0; padding: 0; list-style: none; + + &-countdown { + .badge { + color: @white; + } + + &:hover { + .badge { + font-size: 0; + } + + .badge:after { + font-size: @font-size-small; + content: attr(hover-text); + } + } + } + } .alert { diff --git a/src/ui/public/notify/partials/toaster.html b/src/ui/public/notify/partials/toaster.html index bbe926f8bad7..af35b6ce4c09 100644 --- a/src/ui/public/notify/partials/toaster.html +++ b/src/ui/public/notify/partials/toaster.html @@ -12,10 +12,11 @@ + + >{{notif.timeRemaining}}s