diff --git a/docs/setup_docker.md b/docs/setup_docker.md index f91518f..3ce6919 100644 --- a/docs/setup_docker.md +++ b/docs/setup_docker.md @@ -25,7 +25,7 @@ In short, please make sure that the mjolnir configuration exists under `./config Run the following command in your terminal, replace `./mjolnir` with the root directory of your config, if it is in another spot. ```bash -docker run --rm -it -v ./mjolnir:/data matrixdotorg/mjolnir:latest +docker run --rm -it -v ./mjolnir:/data matrixdotorg/mjolnir:latest bot --mjolnir-config /data/config/production.yaml ``` # Docker Compose diff --git a/docs/setup_selfbuild.md b/docs/setup_selfbuild.md index b39a755..35c06e9 100644 --- a/docs/setup_selfbuild.md +++ b/docs/setup_selfbuild.md @@ -13,5 +13,5 @@ yarn build cp config/default.yaml config/production.yaml nano config/production.yaml -NODE_ENV=production node lib/index.js +node lib/index.js --mjolnir-config ./config/production.yaml ``` diff --git a/package.json b/package.json index 99f3696..d1d404b 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "version": "sed -i '/# version automated/s/[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*/'$npm_package_version'/' synapse_antispam/setup.py && git add synapse_antispam/setup.py && cat synapse_antispam/setup.py" }, "devDependencies": { + "@types/config": "^3.3.0", "@types/crypto-js": "^4.0.2", "@types/express": "^4.17.13", "@types/html-to-text": "^8.0.1", @@ -45,6 +46,7 @@ "dependencies": { "await-lock": "^2.2.2", "body-parser": "^1.20.1", + "config": "^3.3.8", "express": "^4.17", "html-to-text": "^8.0.0", "humanize-duration": "^3.27.1", diff --git a/src/config.ts b/src/config.ts index dad9ee4..e62359a 100644 --- a/src/config.ts +++ b/src/config.ts @@ -15,9 +15,9 @@ limitations under the License. */ import * as fs from "fs"; -import * as path from "path"; import { load } from "js-yaml"; import { MatrixClient } from "matrix-bot-sdk"; +import Config from "config"; /** * The configuration, as read from production.yaml @@ -170,12 +170,32 @@ const defaultConfig: IConfig = { }, }; -export function read(): IConfig { - const config_dir = process.env.NODE_CONFIG_DIR || "./config"; - const config_file = `${process.env.NODE_ENV || "default"}.yaml` - - const content = fs.readFileSync(path.join(config_dir, config_file), "utf8"); - const parsed = load(content); - const config = {...defaultConfig, ...(parsed as object)} as IConfig; - return config; +/** + * Grabs an explicit path provided for mjolnir's config from an arguments vector if provided, otherwise returns undefined. + * @param argv An arguments vector sourced from `process.argv`. + * @returns The path if one was provided or undefined. + */ +function configPathFromArguments(argv: string[]): undefined|string { + const configOptionIndex = argv.findIndex(arg => arg === "--mjolnir-config"); + if (configOptionIndex > 0) { + const configOptionPath = argv.at(configOptionIndex + 1); + if (!configOptionPath) { + throw new Error("No path provided with option --mjolnir-config"); + } + return configOptionPath; + } else { + return; + } +} + +export function read(): IConfig { + const explicitConfigPath = configPathFromArguments(process.argv); + if (explicitConfigPath) { + const content = fs.readFileSync(explicitConfigPath, "utf8"); + const parsed = load(content); + return Config.util.extendDeep({}, defaultConfig, parsed); + } else { + const config = Config.util.extendDeep({}, defaultConfig, Config.util.toObject()) as IConfig; + return config; + } } diff --git a/yarn.lock b/yarn.lock index b21a752..ffcaeb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -122,6 +122,11 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== +"@types/config@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@types/config/-/config-3.3.0.tgz#2b632cb37c639bf8d57054561f5a77d31dcebc1e" + integrity sha512-9kZSbl3/X3TVNowLCu5HFQdQmD+4287Om55avknEYkuo6R2dDrsp/EXEHUFvfYeG7m1eJ0WYGj+cbcUIhARJAQ== + "@types/connect@*": version "3.4.35" resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" @@ -776,6 +781,13 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +config@^3.3.8: + version "3.3.8" + resolved "https://registry.yarnpkg.com/config/-/config-3.3.8.tgz#14ef7aef22af25877fdaee696ec64d761feb7be0" + integrity sha512-rFzF6VESOdp7wAXFlB9IOZI4ouL05g3A03v2eRcTHj2JBQaTNJ40zhAUl5wRbWHqLZ+uqp/7OE0BWWtAVgrong== + dependencies: + json5 "^2.2.1" + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" @@ -2052,6 +2064,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + jsonpointer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559"