Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Odd E. Ebbesen
4d74abe832 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.
2025-12-06 14:54:29 +01:00
6 changed files with 31 additions and 27 deletions

View file

@ -30,8 +30,11 @@ pub(super) async fn show_config(&self) -> Result {
#[admin_command] #[admin_command]
pub(super) async fn reload_config(&self, path: Option<PathBuf>) -> Result { pub(super) async fn reload_config(&self, path: Option<PathBuf>) -> Result {
let path = path.as_deref().into_iter(); let mut paths = Vec::new();
self.services.config.reload(path)?; if let Some(p) = path {
paths.push(p);
}
self.services.config.reload(&paths)?;
self.write_str("Successfully reconfigured.").await self.write_str("Successfully reconfigured.").await
} }

View file

@ -6,7 +6,7 @@ pub mod proxy;
use std::{ use std::{
collections::{BTreeMap, BTreeSet}, collections::{BTreeMap, BTreeSet},
net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr},
path::{Path, PathBuf}, path::PathBuf,
}; };
use conduwuit_macros::config_example_generator; use conduwuit_macros::config_example_generator;
@ -53,9 +53,13 @@ use crate::{Result, err, error::Error, utils::sys};
### For more information, see: ### For more information, see:
### https://continuwuity.org/configuration.html ### 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 { 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<Vec<PathBuf>>,
/// The server_name is the pretty name of this server. It is used as a /// The server_name is the pretty name of this server. It is used as a
/// suffix for user and room IDs/aliases. /// suffix for user and room IDs/aliases.
/// ///
@ -2223,26 +2227,24 @@ const DEPRECATED_KEYS: &[&str; 9] = &[
impl Config { impl Config {
/// Pre-initialize config /// Pre-initialize config
pub fn load<'a, I>(paths: I) -> Result<Figment> pub fn load(paths: &[PathBuf]) -> Result<Figment> {
where
I: Iterator<Item = &'a Path>,
{
let envs = [ let envs = [
Env::var("CONDUIT_CONFIG"), Env::var("CONDUIT_CONFIG"),
Env::var("CONDUWUIT_CONFIG"), Env::var("CONDUWUIT_CONFIG"),
Env::var("CONTINUWUITY_CONFIG"), Env::var("CONTINUWUITY_CONFIG"),
]; ];
let mut config = envs
let config = envs
.into_iter() .into_iter()
.flatten() .flatten()
.map(Toml::file) .map(Toml::file)
.chain(paths.map(Toml::file)) .chain(paths.iter().cloned().map(Toml::file))
.fold(Figment::new(), |config, file| config.merge(file.nested())) .fold(Figment::new(), |config, file| config.merge(file.nested()))
.merge(Env::prefixed("CONDUIT_").global().split("__")) .merge(Env::prefixed("CONDUIT_").global().split("__"))
.merge(Env::prefixed("CONDUWUIT_").global().split("__")) .merge(Env::prefixed("CONDUWUIT_").global().split("__"))
.merge(Env::prefixed("CONTINUWUITY_").global().split("__")); .merge(Env::prefixed("CONTINUWUITY_").global().split("__"));
config = config.join(("config_paths", paths));
Ok(config) Ok(config)
} }

View file

@ -19,7 +19,13 @@ use conduwuit_core::{
version = conduwuit_core::version(), version = conduwuit_core::version(),
)] )]
pub struct Args { 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) /// Path to the config TOML file (optional)
pub config: Option<Vec<PathBuf>>, pub config: Option<Vec<PathBuf>>,

View file

@ -1,4 +1,4 @@
use std::{path::PathBuf, sync::Arc}; use std::sync::Arc;
use conduwuit_core::{ use conduwuit_core::{
Error, Result, Error, Result,
@ -38,14 +38,9 @@ impl Server {
) -> Result<Arc<Self>, Error> { ) -> Result<Arc<Self>, Error> {
let _runtime_guard = runtime.map(runtime::Handle::enter); let _runtime_guard = runtime.map(runtime::Handle::enter);
let config_paths = args let config_paths = args.config.clone().unwrap_or_default();
.config
.as_deref()
.into_iter()
.flat_map(<[_]>::iter)
.map(PathBuf::as_path);
let config = Config::load(config_paths) let config = Config::load(&config_paths)
.and_then(|raw| update(raw, args)) .and_then(|raw| update(raw, args))
.and_then(|raw| Config::new(&raw))?; .and_then(|raw| Config::new(&raw))?;

View file

@ -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 async_trait::async_trait;
use conduwuit::{ use conduwuit::{
@ -51,7 +51,8 @@ fn handle_reload(&self) -> Result {
]) ])
.expect("failed to notify systemd of reloading state"); .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"))] #[cfg(all(feature = "systemd", target_os = "linux"))]
sd_notify::notify(false, &[sd_notify::NotifyState::Ready]) sd_notify::notify(false, &[sd_notify::NotifyState::Ready])
@ -62,10 +63,7 @@ fn handle_reload(&self) -> Result {
} }
#[implement(Service)] #[implement(Service)]
pub fn reload<'a, I>(&self, paths: I) -> Result<Arc<Config>> pub fn reload(&self, paths: &[PathBuf]) -> Result<Arc<Config>> {
where
I: Iterator<Item = &'a Path>,
{
let old = self.server.config.clone(); let old = self.server.config.clone();
let new = Config::load(paths).and_then(|raw| Config::new(&raw))?; let new = Config::load(paths).and_then(|raw| Config::new(&raw))?;