UNPKG

yahoo-swiv

Version:

A web-based exploratory visualization UI for Druid.io

243 lines (242 loc) 10.1 kB
"use strict"; var path = require('path'); var nopt = require('nopt'); var logger_tracker_1 = require('logger-tracker'); var general_1 = require('../common/utils/general/general'); var index_1 = require('../common/models/index'); var yaml_helper_1 = require('../common/utils/yaml-helper/yaml-helper'); var index_2 = require('./models/index'); var index_3 = require('./utils/index'); var AUTH_MODULE_VERSION = 1; var PACKAGE_FILE = path.join(__dirname, '../../package.json'); function exitWithMessage(message) { console.log(message); try { index_3.loadFileSync(PACKAGE_FILE, 'json'); } catch (e) { } process.exit(); } function exitWithError(message) { console.error(message); process.exit(1); } function zeroOne(thing) { return Number(Boolean(thing)); } var packageObj = null; try { packageObj = index_3.loadFileSync(PACKAGE_FILE, 'json'); } catch (e) { exitWithError("Could not read package.json: " + e.message); } exports.VERSION = packageObj.version; var USAGE = "\nUsage: swiv [options]\n\nPossible usage:\n\n swiv --examples\n swiv --druid your.broker.host:8082\n\nGeneral arguments:\n\n --help Print this help message\n --version Display the version number\n -v, --verbose Display the DB queries that are being made\n\nServer arguments:\n\n -p, --port <port-number> The port swiv will run on (default: " + index_2.ServerSettings.DEFAULT_PORT + ")\n --server-host <host> The host on which to listen on (default: all hosts)\n --server-root <root> A custom server root to listen on (default " + index_2.ServerSettings.DEFAULT_SERVER_ROOT + ")\n\nData connection options:\n\n Exactly one data connection option must be provided.\n\n -c, --config <path> Use this local configuration (YAML) file\n --examples Start Swiv with some example data for testing / demo\n -f, --file <path> Start Swiv on top of this file based data cube (must be JSON, CSV, or TSV)\n -d, --druid <host> The Druid broker node to connect to\n --postgres <host> The Postgres cluster to connect to\n --mysql <host> The MySQL cluster to connect to\n\n --user <string> The cluster 'user' (if needed)\n --password <string> The cluster 'password' (if needed)\n --database <string> The cluster 'database' (if needed)\n\nConfiguration printing utilities:\n\n --print-config Prints out the auto generated config\n --with-comments Adds comments when printing the auto generated config\n"; function parseArgs() { return nopt({ "help": Boolean, "version": Boolean, "verbose": Boolean, "port": Number, "server-host": String, "server-root": String, "examples": Boolean, "example": String, "config": String, "auth": String, "print-config": Boolean, "with-comments": Boolean, "file": String, "druid": String, "postgres": String, "mysql": String, "user": String, "password": String, "database": String }, { "v": ["--verbose"], "p": ["--port"], "c": ["--config"], "f": ["--file"], "d": ["--druid"] }, process.argv); } var parsedArgs = parseArgs(); if (parsedArgs['help']) { exitWithMessage(USAGE); } if (parsedArgs['version']) { exitWithMessage(exports.VERSION); } if (parsedArgs['example']) { delete parsedArgs['example']; parsedArgs['examples'] = true; } var SETTINGS_INPUTS = ['config', 'examples', 'file', 'druid', 'postgres', 'mysql']; var numSettingsInputs = general_1.arraySum(SETTINGS_INPUTS.map(function (input) { return zeroOne(parsedArgs[input]); })); if (numSettingsInputs === 0) { exitWithMessage(USAGE); } if (numSettingsInputs > 1) { console.error("only one of --" + SETTINGS_INPUTS.join(', --') + " can be given on the command line"); if (parsedArgs['druid'] && parsedArgs['config']) { console.error("Looks like you are using --config and --druid in conjunction with each other"); console.error("This usage is no longer supported. If you are migrating from Swiv < 0.9.x"); console.error("Please visit: (https://github.com/yahoo/swiv/blob/master/docs/swiv-0.9.x-migration.md)"); } process.exit(1); } exports.PRINT_CONFIG = Boolean(parsedArgs['print-config']); exports.START_SERVER = !exports.PRINT_CONFIG; if (exports.START_SERVER) logger_tracker_1.LOGGER.init(); var serverSettingsFilePath = parsedArgs['config']; if (parsedArgs['examples']) { serverSettingsFilePath = path.join(__dirname, "../../config-examples.yaml"); } var anchorPath; var serverSettingsJS; if (serverSettingsFilePath) { anchorPath = path.dirname(serverSettingsFilePath); try { serverSettingsJS = index_3.loadFileSync(serverSettingsFilePath, 'yaml'); logger_tracker_1.LOGGER.log("Using config " + serverSettingsFilePath); } catch (e) { exitWithError("Could not load config from '" + serverSettingsFilePath + "': " + e.message); } } else { anchorPath = process.cwd(); serverSettingsJS = {}; } if (parsedArgs['port']) { serverSettingsJS.port = parsedArgs['port']; } if (parsedArgs['server-host']) { serverSettingsJS.serverHost = parsedArgs['server-host']; } if (parsedArgs['server-root']) { serverSettingsJS.serverRoot = parsedArgs['server-root']; } if (parsedArgs['auth']) { serverSettingsJS.auth = parsedArgs['auth']; } exports.VERBOSE = Boolean(parsedArgs['verbose'] || serverSettingsJS.verbose); exports.SERVER_SETTINGS = index_2.ServerSettings.fromJS(serverSettingsJS); if (exports.START_SERVER) { var trackingUrl = exports.SERVER_SETTINGS.getTrackingUrl(); if (trackingUrl) { logger_tracker_1.TRACKER.init(exports.VERSION, trackingUrl, exports.SERVER_SETTINGS.getTrackingContext()); } } var auth = exports.SERVER_SETTINGS.auth; var authMiddleware = null; if (auth && auth !== 'none') { auth = path.resolve(anchorPath, auth); logger_tracker_1.LOGGER.log("Using auth " + auth); try { var authModule = require(auth); } catch (e) { exitWithError("error loading auth module: " + e.message); } if (authModule.version !== AUTH_MODULE_VERSION) { exitWithError("incorrect auth module version " + authModule.version + " needed " + AUTH_MODULE_VERSION); } if (typeof authModule.auth !== 'function') exitWithError("Invalid auth module: must export 'auth' function"); authMiddleware = authModule.auth({ logger: logger_tracker_1.LOGGER, tracker: logger_tracker_1.TRACKER, verbose: exports.VERBOSE, version: exports.VERSION, serverSettings: exports.SERVER_SETTINGS }); } exports.AUTH = authMiddleware; if (exports.START_SERVER) { logger_tracker_1.LOGGER.log("Starting Swiv v" + exports.VERSION); logger_tracker_1.TRACKER.track({ eventType: 'swiv_init', metric: 'init', value: 1 }); } var CLUSTER_TYPES = ['druid', 'postgres', 'mysql']; var settingsStore = null; if (serverSettingsFilePath) { var settingsLocation = exports.SERVER_SETTINGS.getSettingsLocation(); if (settingsLocation) { switch (settingsLocation.getLocation()) { case 'file': var settingsFilePath = path.resolve(anchorPath, settingsLocation.uri); if (settingsLocation.getReadOnly()) { settingsStore = index_3.SettingsStore.fromReadOnlyFile(settingsFilePath, settingsLocation.getFormat()); } else { settingsStore = index_3.SettingsStore.fromWritableFile(settingsFilePath, settingsLocation.getFormat()); } break; case 'mysql': throw new Error('todo'); case 'postgres': throw new Error('todo'); default: exitWithError("unknown location '" + settingsLocation.location + "'"); } } else { settingsStore = index_3.SettingsStore.fromReadOnlyFile(serverSettingsFilePath, 'yaml'); } } else { var initAppSettings = index_1.AppSettings.BLANK; var fileToLoad = parsedArgs['file']; if (fileToLoad) { initAppSettings = initAppSettings.addDataCube(new index_1.DataCube({ name: path.basename(fileToLoad, path.extname(fileToLoad)), clusterName: 'native', source: fileToLoad })); } for (var _i = 0, CLUSTER_TYPES_1 = CLUSTER_TYPES; _i < CLUSTER_TYPES_1.length; _i++) { var clusterType = CLUSTER_TYPES_1[_i]; var host = parsedArgs[clusterType]; if (host) { initAppSettings = initAppSettings.addCluster(new index_1.Cluster({ name: clusterType, type: clusterType, host: host, sourceListScan: 'auto', sourceListRefreshInterval: 15000, user: parsedArgs['user'], password: parsedArgs['password'], database: parsedArgs['database'] })); } } settingsStore = index_3.SettingsStore.fromTransient(initAppSettings); } exports.SETTINGS_MANAGER = new index_3.SettingsManager(settingsStore, { logger: logger_tracker_1.LOGGER, verbose: exports.VERBOSE, anchorPath: anchorPath, initialLoadTimeout: exports.SERVER_SETTINGS.getPageMustLoadTimeout() }); if (exports.PRINT_CONFIG) { var withComments = Boolean(parsedArgs['with-comments']); exports.SETTINGS_MANAGER.getSettings({ timeout: 10000 }).then(function (appSettings) { console.log(yaml_helper_1.appSettingsToYAML(appSettings, withComments, { header: true, version: exports.VERSION, verbose: exports.VERBOSE, port: exports.SERVER_SETTINGS.getPort() })); }).catch(function (e) { exitWithError("There was an error generating a config: " + e.message); }); }