diff options
Diffstat (limited to 'lib/config.js')
-rw-r--r-- | lib/config.js | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/lib/config.js b/lib/config.js new file mode 100644 index 0000000..f74faa9 --- /dev/null +++ b/lib/config.js @@ -0,0 +1,140 @@ +/* +Copyright(c) 2017 AT&T Intellectual Property. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and limitations under the License. +*/ + +/* + * Dispatcher configuration + * Configuration may come from environment variables, configuration file, or defaults, + * in that order of precedence. + * The configuration file is optional. + * If present, the configuration file is a UTF-8 serialization of a JSON object. + * + * -------------------------------------------------------------------------------------- + * | JSON property | Environment variable | Required? | Default | + * -------------------------------------------------------------------------------------- + * | foreground | FOREGROUND | Yes | true | + * -------------------------------------------------------------------------------------- + * | logLevel | LOG_LEVEL | Yes | "INFO" | + * -------------------------------------------------------------------------------------- + * | listenHost | LISTEN_HOST | Yes | "0.0.0.0" | + * -------------------------------------------------------------------------------------- + * | listenPort | LISTEN_PORT | Yes | 8443 | + * -------------------------------------------------------------------------------------- + * | ssl.pfxFile | SSL_PFX_FILE | No | none | + * -------------------------------------------------------------------------------------- + * | ssl.pfxPassFile | SSL_PFX_PASSFILE | No | none | + * -------------------------------------------------------------------------------------- + * | cloudify.url | CLOUDIFY_URL | Yes | none | + * -------------------------------------------------------------------------------------- + * | cloudify.user | CLOUDIFY_USER | No | none | + * -------------------------------------------------------------------------------------- + * | cloudify.password | CLOUDIFY_PASSWORD | No | none | + * -------------------------------------------------------------------------------------- + * | inventory.url | INVENTORY_URL | Yes | http://inventory:8080 | + * -------------------------------------------------------------------------------------- + * | inventory.user | INVENTORY_USER | No | none | + * -------------------------------------------------------------------------------------- + * | inventory.password | INVENTORY_PASSWORD | No | none | + * -------------------------------------------------------------------------------------- + * + */ +"use strict"; + +const fs = require("fs"); +const utils = require("./utils"); + +const DEFAULT_FOREGROUND = true; +const DEFAULT_LISTEN_PORT = 8443; +const DEFAULT_LISTEN_HOST = "0.0.0.0"; +const DEFAULT_LOG_LEVEL = "INFO"; +const DEFAULT_INVENTORY_URL = "http://inventory:8080"; + +/* Check configuration for completeness */ +const findMissingConfig = function(cfg) { + const requiredProps = ['logLevel', 'listenHost', 'listenPort', 'cloudify.url', 'inventory.url']; + return requiredProps.filter(function(p){return !utils.hasProperty(cfg,p);}); +}; + +/** Reads configuration-related files and returns a configuration object + * Sets some defaults + * Throws I/O errors, JSON parsing errors, and an error if required config elements are missing + */ +exports.configure = function(configFile) { + var cfg = {}; + + /* If there's a config file, read it */ + if (configFile) { + cfg = JSON.parse(fs.readFileSync(configFile, 'utf8').trim()); + } + + /* Set config values */ + cfg.foreground = process.env['FOREGROUND'] || cfg.foreground || DEFAULT_FOREGROUND; + cfg.logLevel = process.env['LOG_LEVEL'] || cfg.logLevel || DEFAULT_LOG_LEVEL; + cfg.listenHost = process.env['LISTEN_HOST'] || cfg.listenHost || DEFAULT_LISTEN_HOST; + cfg.listenPort = (process.env['LISTEN_PORT'] && parseInt(process.env['LISTEN_PORT'])) || cfg.listenPort || DEFAULT_LISTEN_PORT; + + if (process.env['SSL_PFX_FILE']) { + if (!cfg.ssl) { + cfg.ssl = {}; + } + cfg.ssl.pfxFile = process.env['SSL_PFX_FILE']; + cfg.ssl.pfxPassFile = process.env['SSL_PFX_PASS_FILE'] || cfg.ssl.pfxPassFile; + } + + if (!cfg.cloudify) { + cfg.cloudify = {}; + } + cfg.cloudify.url = process.env['CLOUDIFY_URL'] || cfg.cloudify.url; + cfg.cloudify.user = process.env['CLOUDIFY_USER'] || cfg.cloudify.user; + cfg.cloudify.password = process.env['CLOUDIFY_PASSWORD'] || cfg.cloudify.password; + + if (!cfg.inventory) { + cfg.inventory = {}; + } + cfg.inventory.url = process.env['INVENTORY_URL'] || cfg.inventory.url || DEFAULT_INVENTORY_URL; + cfg.inventory.user = process.env['INVENTORY_USER'] || cfg.inventory.user; + cfg.inventory.password = process.env['INVENTORY_PASSWORD'] || cfg.inventory.password; + cfg.locations = {}; + + /* If https params are present, read in the cert/passphrase */ + if (cfg.ssl && cfg.ssl.pfxFile) { + cfg.ssl.pfx = fs.readFileSync(cfg.ssl.pfxFile); + if (cfg.ssl.pfxPassFile) { + cfg.ssl.passphrase = fs.readFileSync(cfg.ssl.pfxPassFile,'utf8').trim(); + } + } + + const missing = findMissingConfig(cfg); + if (missing.length > 0) { + throw new Error ("Required configuration elements missing: " + missing.join(',')); + cfg = null; + } + + return cfg; +}; + +/** Read locations file +*/ +exports.getLocations = function(locationsFile) { + let locations = {}; + + try { + locations = JSON.parse(fs.readFileSync(locationsFile)); + } + catch (e) { + locations = {}; + } + return locations; +}
\ No newline at end of file |