UNPKG

kibana-123

Version:

Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic

211 lines (163 loc) 7.95 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })(); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; exports['default'] = setupSettings; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, 'next'); var callThrow = step.bind(null, 'throw'); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; } var _lodash = require('lodash'); var _defaults = require('./defaults'); var _defaults2 = _interopRequireDefault(_defaults); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); function setupSettings(kbnServer, server, config) { var get = _asyncToGenerator(function* (req, key) { assertRequest(req); return getAll(req).then(function (all) { return all[key]; }); }); var getAll = _asyncToGenerator(function* (req) { assertRequest(req); return getRaw(req).then(function (raw) { return Object.keys(raw).reduce(function (all, key) { var item = raw[key]; var hasUserValue = ('userValue' in item); all[key] = hasUserValue ? item.userValue : item.value; return all; }, {}); }); }); var getRaw = _asyncToGenerator(function* (req) { assertRequest(req); return Promise.all([getDefaults(), getUserProvided(req)]).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2); var defaults = _ref2[0]; var user = _ref2[1]; return (0, _lodash.defaultsDeep)(user, defaults); }); }); var getUserProvided = _asyncToGenerator(function* (req) { var _Bluebird$resolve; var _ref3 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var _ref3$ignore401Errors = _ref3.ignore401Errors; var ignore401Errors = _ref3$ignore401Errors === undefined ? false : _ref3$ignore401Errors; assertRequest(req); var _server$plugins$elasticsearch$getCluster = server.plugins.elasticsearch.getCluster('admin'); var callWithRequest = _server$plugins$elasticsearch$getCluster.callWithRequest; var errors = _server$plugins$elasticsearch$getCluster.errors; // If the ui settings status isn't green, we shouldn't be attempting to get // user settings, since we can't be sure that all the necessary conditions // (e.g. elasticsearch being available) are met. if (status.state !== 'green') { return hydrateUserSettings({}); } var params = getClientSettings(config); var allowedErrors = [errors[404], errors[403], errors.NoConnections]; if (ignore401Errors) allowedErrors.push(errors[401]); return (_Bluebird$resolve = _bluebird2['default'].resolve(callWithRequest(req, 'get', params, { wrap401Errors: !ignore401Errors })))['catch'].apply(_Bluebird$resolve, allowedErrors.concat([function (err) { return {}; }])).then(function (resp) { return resp._source || {}; }).then(function (source) { return hydrateUserSettings(source); }); }); var setMany = _asyncToGenerator(function* (req, changes) { assertRequest(req); var _server$plugins$elasticsearch$getCluster2 = server.plugins.elasticsearch.getCluster('admin'); var callWithRequest = _server$plugins$elasticsearch$getCluster2.callWithRequest; var clientParams = _extends({}, getClientSettings(config), { body: { doc: changes } }); return callWithRequest(req, 'update', clientParams).then(function () { return {}; }); }); var set = _asyncToGenerator(function* (req, key, value) { assertRequest(req); return setMany(req, _defineProperty({}, key, value)); }); var remove = _asyncToGenerator(function* (req, key) { assertRequest(req); return set(req, key, null); }); var removeMany = _asyncToGenerator(function* (req, keys) { assertRequest(req); var changes = {}; keys.forEach(function (key) { changes[key] = null; }); return setMany(req, changes); }); var status = kbnServer.status.create('ui settings'); if (!config.get('uiSettings.enabled')) { status.disabled('uiSettings.enabled config is set to `false`'); return; } var uiSettings = { // returns a Promise for the value of the requested setting get: get, // returns a Promise for a hash of setting key/value pairs getAll: getAll, // .set(key, value), returns a Promise for persisting the new value to ES set: set, // takes a key/value hash, returns a Promise for persisting the new values to ES setMany: setMany, // returns a Promise for removing the provided key from user-specific settings remove: remove, // takes an array, returns a Promise for removing every provided key from user-specific settings removeMany: removeMany, // returns a Promise for the default settings, follows metadata format (see ./defaults) getDefaults: getDefaults, // returns a Promise for user-specific settings stored in ES, follows metadata format getUserProvided: getUserProvided, // returns a Promise merging results of getDefaults & getUserProvided, follows metadata format getRaw: getRaw }; server.decorate('server', 'uiSettings', function () { return uiSettings; }); kbnServer.ready().then(mirrorEsStatus); function getDefaults() { return Promise.resolve((0, _defaults2['default'])()); } function mirrorEsStatus() { var esStatus = kbnServer.status.getForPluginId('elasticsearch'); if (!esStatus) { status.red('UI Settings requires the elasticsearch plugin'); return; } copyStatus(); esStatus.on('change', copyStatus); function copyStatus() { var state = esStatus.state; var statusMessage = state === 'green' ? 'Ready' : 'Elasticsearch plugin is ' + state; status[state](statusMessage); } } } function hydrateUserSettings(user) { return Object.keys(user).reduce(expand, {}); function expand(expanded, key) { var userValue = user[key]; if (userValue !== null) { expanded[key] = { userValue: userValue }; } return expanded; } } function getClientSettings(config) { var index = config.get('kibana.index'); var id = config.get('pkg.version'); var type = 'config'; return { index: index, type: type, id: id }; } function assertRequest(req) { if (typeof req === 'object' && typeof req.path === 'string' && typeof req.headers === 'object') return; throw new TypeError('all uiSettings methods must be passed a hapi.Request object'); } module.exports = exports['default'];