Adding CLI and YAML loader

This commit is contained in:
Chris Cowan 2015-05-04 16:38:43 -07:00
parent f4bc660c88
commit 259b6f7910
5 changed files with 119 additions and 4 deletions

65
src/hapi/bin/kibana.js Normal file
View file

@ -0,0 +1,65 @@
#!/usr/bin/env node
var _ = require('lodash');
var kibana = require('../');
var program = require('commander');
var path = require('path');
var writePidFile = require('../lib/write_pid_file');
var loadSettingsFromYAML = require('../lib/load_settings_from_yaml');
var env = (process.env.NODE_ENV) ? process.env.NODE_ENV : 'development';
var packagePath = path.resolve(__dirname, '..', '..', '..', 'package.json');
if (env !== 'development') {
packagePath = path.resolve(__dirname, '..', 'package.json');
}
var package = require(packagePath);
program.description('Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch.');
program.version(package.version);
program.option('-e, --elasticsearch <uri>', 'Elasticsearch instance');
program.option('-c, --config <path>', 'Path to the config file');
program.option('-p, --port <port>', 'The port to bind to', parseInt);
program.option('-q, --quiet', 'Turns off logging');
program.option('-H, --host <host>', 'The host to bind to');
program.option('-l, --log-file <path>', 'The file to log to');
program.option('--plugins <path>', 'Path to scan for plugins');
program.parse(process.argv);
if (program.plugins) {
config['externalPluginsFolder'] = program.plugins;
}
var settings = {};
if (program.elasticsearch) {
settings['elasticsearch.url'] = program.elasticsearch;
}
if (program.port) {
settings['kibana.server.port'] = program.port;
}
if (program.host) {
settings['kibana.server.host'] = program.host;
}
if (program.quiet) {
settings['logging.quiet'] = program.quiet;
}
if (program.logFile) {
settings['logging.file'] = program.logFile;
}
if (program.config) {
// Create the settings with the overrides from the YAML config file.
settings = _.defaults(settings, loadSettingsFromYAML(program.config));
}
// Start the Kibana server with the settings fromt he CLI and YAML file
kibana.start(settings)
.then(writePidFile)
.catch(function (err) {
process.exit(1);
});

View file

@ -25,7 +25,11 @@ module.exports = Joi.object({
port: Joi.number().default(5601),
maxSockets: Joi.any().default(Infinity),
pidFile: Joi.string(),
root: Joi.string().default(path.normalize(path.join(__dirname, '..')))
root: Joi.string().default(path.normalize(path.join(__dirname, '..'))),
ssl: Joi.object({
cert: Joi.string(),
key: Joi.string()
}).default()
}).default(),
index: Joi.string().default('.kibana'),
publicFolder: Joi.string().default(publicFolder),
@ -41,8 +45,10 @@ module.exports = Joi.object({
preserveHost: Joi.boolean().default(true),
username: Joi.string(),
password: Joi.string(),
sharedTimeout: Joi.number().default(0),
shardTimeout: Joi.number().default(0),
requestTimeout: Joi.number().default(30000),
pingTimeout: Joi.number().default(30000),
startupTimeout: Joi.number().default(5000),
ssl: Joi.object({
verify: Joi.boolean().default(true),
ca: Joi.string(),
@ -54,7 +60,7 @@ module.exports = Joi.object({
quiet: Joi.boolean().default(false),
file: Joi.string(),
console: Joi.object({
ops: Joi.any().default('*'),
ops: Joi.any(),
log: Joi.any().default('*'),
response: Joi.any().default('*'),
error: Joi.any().default('*'),

View file

@ -0,0 +1,28 @@
var fs = require('fs');
var yaml = require('js-yaml');
module.exports = function (path) {
var config = yaml.safeLoad(fs.readFileSync(path, 'utf8'));
var settings = {};
if (config.port) settings['kibana.server.port'] = config.port;
if (config.host) settings['kibana.server.host'] = config.host;
if (config.elasticsearch_url) settings['elasticsearch.url'] = config.elasticsearch_url;
if (config.elasticsearch_preserve_host) settings['elasticsearch.preserveHost'] = config.elasticsearch_preserve_host;
if (config.config_index) settings['config.index'] = config.config_index;
if (config.config_elasticsearch_username) settings['elasticsearch.username'] = config.config_elasticsearch_username;
if (config.config_elasticsearch_password) settings['elasticsearch.password'] = config.config_elasticsearch_password;
if (config.config_elasticsearch_client_crt) settings['elasticsearch.ssl.cert'] = config.config_elasticsearch_client_crt;
if (config.config_elasticsearch_client_key) settings['elasticsearch.ssl.key'] = config.config_elasticsearch_client_key;
if (config.ca) settings['elasticsearch.ssl.ca'] = config.ca;
if (config.verify_ssl) settings['elasticsearch.ssl.verify'] = config.verify_ssl;
if (config.default_app_id) settings['kibana.defaultAppId'] = config.default_app_id;
if (config.ping_timeout) settings['elastcsearch.pingTimeout'] = config.ping_timeout;
if (config.request_timeout) settings['elastcsearch.requestTimeout'] = config.request_timeout;
if (config.shard_timeout) settings['elastcsearch.shardTimeout'] = config.shard_timeout;
if (config.startup_timeout) settings['elastcsearch.startupTimeout'] = config.startup_timeout;
if (config.ssl_cert_file) settings['kibana.server.ssl.cert'] = config.ssl_cert_file;
if (config.ssl_key_file) settings['kibana.server.ssl.key'] = config.ssl_key_file;
if (config.pid_file) settings['config.server.pidFile'] = config.pid_file;
if (config.log_file) settings['logging.file'] = config.log_file;
return settings;
};

View file

@ -0,0 +1,16 @@
var fs = require('fs');
var Promise = require('bluebird');
module.exports = function (server) {
return new Promise(function (resolve, reject) {
var config = server.config();
var pidFile = config.get('kibana.server.pidFile');
if (!pidFile) return resolve(server);
fs.writeFile(pidFile, process.pid, function (err) {
if (err) {
server.log('error', { err: err });
return reject(err);
}
resolve(server);
});
});
};

View file

@ -14,7 +14,7 @@ module.exports = new kibana.Plugin({
reply({
kibana_index: config.get('kibana.index'),
default_app_id: config.get('kibana.defaultAppId'),
shard_timeout: config.get('elasticsearch.sharedTimeout'),
shard_timeout: config.get('elasticsearch.shardTimeout'),
plugins: listPlugins(config)
});
}