pm2
Version:
Production process manager for Node.JS applications with a built-in load balancer.
142 lines (117 loc) • 3.73 kB
JavaScript
const Debug = require('debug')
const debug = Debug('axm:configuration')
const { ServiceManager } = require('./serviceManager')
const Autocast = require('./utils/autocast')
const path = require('path')
const fs = require('fs')
const VERSION = '8.0.0'
class Configuration {
static configureModule (opts) {
if (ServiceManager.get('transport')) ServiceManager.get('transport').setOptions(opts)
}
static findPackageJson () {
try {
require.main = Configuration.getMain()
} catch (_e) {
// Ignore error when getter is set on require.main, but no setter
}
if (!require.main) {
return
}
if (!require.main.paths) {
return
}
let pkgPath = path.resolve(path.dirname(require.main.filename), 'package.json')
try {
fs.statSync(pkgPath)
} catch (e) {
try {
pkgPath = path.resolve(path.dirname(require.main.filename), '..', 'package.json')
fs.statSync(pkgPath)
} catch (e) {
debug('Cannot find package.json')
try {
pkgPath = path.resolve(path.dirname(require.main.filename), '..', '..', 'package.json')
fs.statSync(pkgPath)
} catch (e) {
debug('Cannot find package.json')
return null
}
}
return pkgPath
}
return pkgPath
}
static init (conf, doNotTellPm2) {
const packageFilepath = Configuration.findPackageJson()
let packageJson
if (!conf.module_conf) {
conf.module_conf = {}
}
conf.apm = {
type: 'node',
version: VERSION
}
if (conf.isModule === true) {
/**
* Merge package.json metadata
*/
try {
if (!packageFilepath) throw new Error('Cannot find package.json')
packageJson = require(packageFilepath)
conf.module_version = packageJson.version
conf.module_name = packageJson.name
conf.description = packageJson.description
if (packageJson.config) {
conf = Object.assign(conf, packageJson.config)
conf.module_conf = packageJson.config
}
} catch (e) {
throw new Error(e)
}
} else {
conf.module_name = process.env.name || 'outside-pm2'
try {
if (!packageFilepath) throw new Error('Cannot find package.json')
packageJson = require(packageFilepath)
conf.module_version = packageJson.version
if (packageJson.config) {
conf = Object.assign(conf, packageJson.config)
conf.module_conf = packageJson.config
}
} catch (e) {
debug(e.message)
}
}
/**
* If custom variables has been set, merge with returned configuration
*/
try {
if (process.env[conf.module_name]) {
const castedConf = new Autocast().autocast(JSON.parse(process.env[conf.module_name] || ''))
conf = Object.assign(conf, castedConf)
// Do not display probe configuration in Keymetrics
delete castedConf.probes
// This is the configuration variable modifiable from keymetrics
conf.module_conf = JSON.parse(JSON.stringify(Object.assign(conf.module_conf, castedConf)))
// Obfuscate passwords
Object.keys(conf.module_conf).forEach(function (key) {
if ((key === 'password' || key === 'passwd') &&
conf.module_conf[key].length >= 1) {
conf.module_conf[key] = 'Password hidden'
}
})
}
} catch (e) {
debug(e)
}
if (doNotTellPm2 === true) return conf
Configuration.configureModule(conf)
return conf
}
static getMain () {
return require.main || { filename: './somefile.js' }
}
}
module.exports = Configuration