From fd206f0b2d7e5c8e00e2817266d90ec54f79e1da Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 17 Jan 2018 10:32:03 +0100 Subject: Add ability to update some configuration keys --- server/initializers/constants.ts | 84 ++++++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 17 deletions(-) (limited to 'server/initializers') diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 759880201..7b63a9ccd 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -1,11 +1,14 @@ -import * as config from 'config' -import { join } from 'path' +import { IConfig } from 'config' +import { dirname, join } from 'path' import { JobCategory, JobState, VideoRateType } from '../../shared/models' import { ActivityPubActorType } from '../../shared/models/activitypub' import { FollowState } from '../../shared/models/actors' import { VideoPrivacy } from '../../shared/models/videos' // Do not use barrels, remain constants as independent as possible -import { buildPath, isTestInstance, sanitizeHost, sanitizeUrl } from '../helpers/core-utils' +import { buildPath, isTestInstance, root, sanitizeHost, sanitizeUrl } from '../helpers/core-utils' + +// Use a variable to reload the configuration if we need +let config: IConfig = require('config') // --------------------------------------------------------------------------- @@ -82,6 +85,7 @@ let SCHEDULER_INTERVAL = 60000 * 60 // --------------------------------------------------------------------------- const CONFIG = { + CUSTOM_FILE: getLocalConfigFilePath(), LISTEN: { PORT: config.get('listen.port') }, @@ -110,29 +114,29 @@ const CONFIG = { HOST: '' }, ADMIN: { - EMAIL: config.get('admin.email') + get EMAIL () { return config.get('admin.email') } }, SIGNUP: { - ENABLED: config.get('signup.enabled'), - LIMIT: config.get('signup.limit') + get ENABLED () { return config.get('signup.enabled') }, + get LIMIT () { return config.get('signup.limit') } }, USER: { - VIDEO_QUOTA: config.get('user.video_quota') + get VIDEO_QUOTA () { return config.get('user.video_quota') } }, TRANSCODING: { - ENABLED: config.get('transcoding.enabled'), - THREADS: config.get('transcoding.threads'), + get ENABLED () { return config.get('transcoding.enabled') }, + get THREADS () { return config.get('transcoding.threads') }, RESOLUTIONS: { - '240' : config.get('transcoding.resolutions.240p'), - '360': config.get('transcoding.resolutions.360p'), - '480': config.get('transcoding.resolutions.480p'), - '720': config.get('transcoding.resolutions.720p'), - '1080': config.get('transcoding.resolutions.1080p') + get '240p' () { return config.get('transcoding.resolutions.240p') }, + get '360p' () { return config.get('transcoding.resolutions.360p') }, + get '480p' () { return config.get('transcoding.resolutions.480p') }, + get '720p' () { return config.get('transcoding.resolutions.720p') }, + get '1080p' () { return config.get('transcoding.resolutions.1080p') } } }, CACHE: { PREVIEWS: { - SIZE: config.get('cache.previews.size') + get SIZE () { return config.get('cache.previews.size') } } } } @@ -361,8 +365,7 @@ if (isTestInstance() === true) { SCHEDULER_INTERVAL = 10000 } -CONFIG.WEBSERVER.URL = sanitizeUrl(CONFIG.WEBSERVER.SCHEME + '://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT) -CONFIG.WEBSERVER.HOST = sanitizeHost(CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT, REMOTE_SCHEME.HTTP) +updateWebserverConfig() // --------------------------------------------------------------------------- @@ -404,3 +407,50 @@ export { AVATAR_MIMETYPE_EXT, SCHEDULER_INTERVAL } + +// --------------------------------------------------------------------------- + +function getLocalConfigFilePath () { + const configSources = config.util.getConfigSources() + if (configSources.length === 0) throw new Error('Invalid config source.') + + let filename = 'local' + if (process.env.NODE_ENV) filename += `-${process.env.NODE_ENV}` + if (process.env.NODE_APP_INSTANCE) filename += `-${process.env.NODE_APP_INSTANCE}` + + return join(dirname(configSources[ 0 ].name), filename + '.json') +} + +function updateWebserverConfig () { + CONFIG.WEBSERVER.URL = sanitizeUrl(CONFIG.WEBSERVER.SCHEME + '://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT) + CONFIG.WEBSERVER.HOST = sanitizeHost(CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT, REMOTE_SCHEME.HTTP) +} + +export function reloadConfig () { + + function directory () { + if (process.env.NODE_CONFIG_DIR) { + return process.env.NODE_CONFIG_DIR + } + + return join(root(), 'config') + } + + function purge () { + for (const fileName in require.cache) { + if (-1 === fileName.indexOf(directory())) { + continue + } + + delete require.cache[fileName] + } + + delete require.cache[require.resolve('config')] + } + + purge() + + config = require('config') + + updateWebserverConfig() +} -- cgit v1.2.3