From 4d74abe8323ecbfb549415d6f0ba416404ddedb1 Mon Sep 17 00:00:00 2001 From: "Odd E. Ebbesen" Date: Sat, 6 Dec 2025 14:36:37 +0100 Subject: [PATCH] fix(reload): WIP - store paths to config files Paths given via --config are now stored inside the config struct at runtime, to make it possible to reload config without setting an env var for the config file location. --- docs/public/.well-known/matrix/client | 2 +- src/admin/server/commands.rs | 7 +++++-- src/core/config/mod.rs | 20 +++++++++++--------- src/main/clap.rs | 8 +++++++- src/main/server.rs | 11 +++-------- src/service/config/mod.rs | 10 ++++------ 6 files changed, 31 insertions(+), 27 deletions(-) diff --git a/docs/public/.well-known/matrix/client b/docs/public/.well-known/matrix/client index 388875ba..52ed98b3 100644 --- a/docs/public/.well-known/matrix/client +++ b/docs/public/.well-known/matrix/client @@ -1 +1 @@ -{"m.homeserver":{"base_url": "https://matrix.continuwuity.org"},"org.matrix.msc3575.proxy":{"url": "https://matrix.continuwuity.org"},"org.matrix.msc4143.rtc_foci":[{"type":"livekit","livekit_service_url":"https://livekit.ellis.link"}]} \ No newline at end of file +{"m.homeserver":{"base_url": "https://matrix.continuwuity.org"},"org.matrix.msc3575.proxy":{"url": "https://matrix.continuwuity.org"},"org.matrix.msc4143.rtc_foci":[{"type":"livekit","livekit_service_url":"https://livekit.ellis.link"}]} diff --git a/src/admin/server/commands.rs b/src/admin/server/commands.rs index 6027a9eb..90e8b042 100644 --- a/src/admin/server/commands.rs +++ b/src/admin/server/commands.rs @@ -30,8 +30,11 @@ pub(super) async fn show_config(&self) -> Result { #[admin_command] pub(super) async fn reload_config(&self, path: Option) -> Result { - let path = path.as_deref().into_iter(); - self.services.config.reload(path)?; + let mut paths = Vec::new(); + if let Some(p) = path { + paths.push(p); + } + self.services.config.reload(&paths)?; self.write_str("Successfully reconfigured.").await } diff --git a/src/core/config/mod.rs b/src/core/config/mod.rs index fbb29357..fd35d950 100644 --- a/src/core/config/mod.rs +++ b/src/core/config/mod.rs @@ -6,7 +6,7 @@ pub mod proxy; use std::{ collections::{BTreeMap, BTreeSet}, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, - path::{Path, PathBuf}, + path::PathBuf, }; use conduwuit_macros::config_example_generator; @@ -53,9 +53,13 @@ use crate::{Result, err, error::Error, utils::sys}; ### For more information, see: ### https://continuwuity.org/configuration.html "#, - ignore = "catchall well_known tls blurhashing allow_invalid_tls_certificates_yes_i_know_what_the_fuck_i_am_doing_with_this_and_i_know_this_is_insecure" + ignore = "config_paths catchall well_known tls blurhashing allow_invalid_tls_certificates_yes_i_know_what_the_fuck_i_am_doing_with_this_and_i_know_this_is_insecure" )] pub struct Config { + // Paths to config file(s). Not supposed to be set manually in the config file, + // only updated dynamically from the --config option given at runtime. + pub config_paths: Option>, + /// The server_name is the pretty name of this server. It is used as a /// suffix for user and room IDs/aliases. /// @@ -2223,26 +2227,24 @@ const DEPRECATED_KEYS: &[&str; 9] = &[ impl Config { /// Pre-initialize config - pub fn load<'a, I>(paths: I) -> Result - where - I: Iterator, - { + pub fn load(paths: &[PathBuf]) -> Result { let envs = [ Env::var("CONDUIT_CONFIG"), Env::var("CONDUWUIT_CONFIG"), Env::var("CONTINUWUITY_CONFIG"), ]; - - let config = envs + let mut config = envs .into_iter() .flatten() .map(Toml::file) - .chain(paths.map(Toml::file)) + .chain(paths.iter().cloned().map(Toml::file)) .fold(Figment::new(), |config, file| config.merge(file.nested())) .merge(Env::prefixed("CONDUIT_").global().split("__")) .merge(Env::prefixed("CONDUWUIT_").global().split("__")) .merge(Env::prefixed("CONTINUWUITY_").global().split("__")); + config = config.join(("config_paths", paths)); + Ok(config) } diff --git a/src/main/clap.rs b/src/main/clap.rs index f0b6d7f0..57c75b74 100644 --- a/src/main/clap.rs +++ b/src/main/clap.rs @@ -19,7 +19,13 @@ use conduwuit_core::{ version = conduwuit_core::version(), )] pub struct Args { - #[arg(short, long)] + #[arg( + short, + long, + env = "CONDUIT_CONFIG", + env = "CONDUWUIT_CONFIG", + env = "CONTINUWUITY_CONFIG" + )] /// Path to the config TOML file (optional) pub config: Option>, diff --git a/src/main/server.rs b/src/main/server.rs index b060dc5a..4c1abc25 100644 --- a/src/main/server.rs +++ b/src/main/server.rs @@ -1,4 +1,4 @@ -use std::{path::PathBuf, sync::Arc}; +use std::sync::Arc; use conduwuit_core::{ Error, Result, @@ -38,14 +38,9 @@ impl Server { ) -> Result, Error> { let _runtime_guard = runtime.map(runtime::Handle::enter); - let config_paths = args - .config - .as_deref() - .into_iter() - .flat_map(<[_]>::iter) - .map(PathBuf::as_path); + let config_paths = args.config.clone().unwrap_or_default(); - let config = Config::load(config_paths) + let config = Config::load(&config_paths) .and_then(|raw| update(raw, args)) .and_then(|raw| Config::new(&raw))?; diff --git a/src/service/config/mod.rs b/src/service/config/mod.rs index 414c22b6..efeed743 100644 --- a/src/service/config/mod.rs +++ b/src/service/config/mod.rs @@ -1,4 +1,4 @@ -use std::{iter, ops::Deref, path::Path, sync::Arc}; +use std::{ops::Deref, path::PathBuf, sync::Arc}; use async_trait::async_trait; use conduwuit::{ @@ -51,7 +51,8 @@ fn handle_reload(&self) -> Result { ]) .expect("failed to notify systemd of reloading state"); - self.reload(iter::empty())?; + let config_paths = self.server.config.config_paths.clone().unwrap_or_default(); + self.reload(&config_paths)?; #[cfg(all(feature = "systemd", target_os = "linux"))] sd_notify::notify(false, &[sd_notify::NotifyState::Ready]) @@ -62,10 +63,7 @@ fn handle_reload(&self) -> Result { } #[implement(Service)] -pub fn reload<'a, I>(&self, paths: I) -> Result> -where - I: Iterator, -{ +pub fn reload(&self, paths: &[PathBuf]) -> Result> { let old = self.server.config.clone(); let new = Config::load(paths).and_then(|raw| Config::new(&raw))?;