From 34590ad9e5348c3d117196929a92468535c56ac4 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Sun, 1 Sep 2024 21:13:29 +0200 Subject: [PATCH] use new env vars MM_MODULES_DIR and MM_CUSTOMCSS_FILE for setting these things from outside (and overriding corresponding config.js properties) --- CHANGELOG.md | 3 +++ js/app.js | 4 +++- js/loader.js | 22 +++++++++++++++++----- js/server.js | 12 ++++++++---- js/server_functions.js | 28 +++++++++++++++++++++++++++- 5 files changed, 58 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03a61342d0..708957cf4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,9 @@ _This release is scheduled to be released on 2024-10-01._ ### Added +- [core] add variable `MM_CUSTOMCSS_FILE` which - if set - overrides `config.customCss` +- [core] add variable `MM_MODULES_DIR` which - if set - overrides `config.paths.modules` for foreign modules (not default modules) + ### Removed - [core] removed installer only files (#3492) diff --git a/js/app.js b/js/app.js index f6d510a64a..3bdf47ceca 100644 --- a/js/app.js +++ b/js/app.js @@ -9,6 +9,7 @@ const Log = require("logger"); const Server = require(`${__dirname}/server`); const Utils = require(`${__dirname}/utils`); const defaultModules = require(`${__dirname}/../modules/default/defaultmodules`); +const { getEnvVarsAsObj } = require(`${__dirname}/server_functions`); // Get version number. global.version = require(`${__dirname}/../package.json`).version; @@ -159,7 +160,8 @@ function App () { function loadModule (module) { const elements = module.split("/"); const moduleName = elements[elements.length - 1]; - let moduleFolder = `${__dirname}/../modules/${module}`; + const env = getEnvVarsAsObj(); + let moduleFolder = `${__dirname}/../${env.modulesDir}/${module}`; if (defaultModules.includes(moduleName)) { moduleFolder = `${__dirname}/../modules/default/${module}`; diff --git a/js/loader.js b/js/loader.js index e8dff1907c..362f3690ff 100644 --- a/js/loader.js +++ b/js/loader.js @@ -10,6 +10,15 @@ const Loader = (function () { /* Private Methods */ + /** + * Retrieve object of env variables. + * @returns {object} with key: values as assembled in js/server_functions.js + */ + const getEnvVars = async function () { + const res = await fetch(`${location.protocol}//${location.host}/env`); + return JSON.parse(await res.text()); + }; + /** * Loops through all modules and requests start for every module. */ @@ -58,19 +67,20 @@ const Loader = (function () { * Generate array with module information including module paths. * @returns {object[]} Module information. */ - const getModuleData = function () { + const getModuleData = async function () { const modules = getAllModules(); const moduleFiles = []; + const envVars = await getEnvVars(); modules.forEach(function (moduleData, index) { const module = moduleData.module; const elements = module.split("/"); const moduleName = elements[elements.length - 1]; - let moduleFolder = `${config.paths.modules}/${module}`; + let moduleFolder = `${envVars.modulesDir}/${module}`; if (defaultModules.indexOf(moduleName) !== -1) { - moduleFolder = `${config.paths.modules}/default/${module}`; + moduleFolder = `modules/default/${module}`; } if (moduleData.disabled === true) { @@ -197,7 +207,9 @@ const Loader = (function () { * Load all modules as defined in the config. */ async loadModules () { - let moduleData = getModuleData(); + let moduleData = await getModuleData(); + const envVars = await getEnvVars(); + const customCss = envVars.customCss; /** * @returns {Promise} when all modules are loaded @@ -212,7 +224,7 @@ const Loader = (function () { // All modules loaded. Load custom.css // This is done after all the modules so we can // overwrite all the defined styles. - await loadFile(config.customCss); + await loadFile(customCss); // custom.css loaded. Start all modules. await startModules(); } diff --git a/js/server.js b/js/server.js index bfa0f911d7..0830034d32 100644 --- a/js/server.js +++ b/js/server.js @@ -8,8 +8,7 @@ const helmet = require("helmet"); const socketio = require("socket.io"); const Log = require("logger"); -const Utils = require("./utils"); -const { cors, getConfig, getHtml, getVersion, getStartup } = require("./server_functions"); +const { cors, getConfig, getHtml, getVersion, getStartup, getEnvVars } = require("./server_functions"); /** * Server @@ -73,8 +72,11 @@ function Server (config) { app.use(helmet(config.httpHeaders)); app.use("/js", express.static(__dirname)); - // TODO add tests directory only when running tests? - const directories = ["/config", "/css", "/fonts", "/modules", "/vendor", "/translations", "/tests/configs", "/tests/mocks"]; + let directories = ["/config", "/css", "/fonts", "/modules", "/vendor", "/translations", "/env"]; + if (process.env.JEST_WORKER_ID !== undefined) { + // add tests directories only when running tests + directories.push("/tests/configs", "/tests/mocks"); + } for (const directory of directories) { app.use(directory, express.static(path.resolve(global.root_path + directory))); } @@ -87,6 +89,8 @@ function Server (config) { app.get("/startup", (req, res) => getStartup(req, res)); + app.get("/env", (req, res) => getEnvVars(req, res)); + app.get("/", (req, res) => getHtml(req, res)); server.on("listening", () => { diff --git a/js/server_functions.js b/js/server_functions.js index 7d4358b2e5..a470fe0900 100644 --- a/js/server_functions.js +++ b/js/server_functions.js @@ -128,4 +128,30 @@ function getVersion (req, res) { res.send(global.version); } -module.exports = { cors, getConfig, getHtml, getVersion, getStartup }; +/** + * Gets environment variables needed in the browser. + * @returns {object} environment variables key: values + */ +function getEnvVarsAsObj () { + const obj = { modulesDir: `${config.paths.modules}`, customCss: `${config.customCss}` }; + if (process.env.MM_MODULES_DIR) { + obj.modulesDir = process.env.MM_MODULES_DIR.replace(`${global.root_path}/`, ""); + } + if (process.env.MM_CUSTOMCSS_FILE) { + obj.customCss = process.env.MM_CUSTOMCSS_FILE.replace(`${global.root_path}/`, ""); + } + + return obj; +} + +/** + * Gets environment variables needed in the browser. + * @param {Request} req - the request + * @param {Response} res - the result + */ +function getEnvVars (req, res) { + const obj = getEnvVarsAsObj(); + res.send(obj); +} + +module.exports = { cors, getConfig, getHtml, getVersion, getStartup, getEnvVars, getEnvVarsAsObj };