From 54d961c687f208b7f6bc2d7b0bc16442116d9eb6 Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Fri, 2 Aug 2024 11:53:02 +0100 Subject: [PATCH] feat!: [#938] add mandatory config options Some configuration options are mandatory. The tracker will panic if the user doesn't provide an explicit value for them from one of the configuration sources: TOML or ENV VARS. The mandatory options are: ```toml [metadata] schema_version = "2.0.0" [logging] threshold = "info" [core] private = false listed = false ``` --- packages/configuration/src/lib.rs | 6 +++ packages/configuration/src/v2_0_0/mod.rs | 45 +++++++++++++++++++ .../config/tracker.container.mysql.toml | 7 +++ .../config/tracker.container.sqlite3.toml | 7 +++ .../config/tracker.development.sqlite3.toml | 7 +++ .../config/tracker.e2e.container.sqlite3.toml | 7 +++ .../config/tracker.udp.benchmarking.toml | 2 + 7 files changed, 81 insertions(+) diff --git a/packages/configuration/src/lib.rs b/packages/configuration/src/lib.rs index aedf3a6f..18ab29eb 100644 --- a/packages/configuration/src/lib.rs +++ b/packages/configuration/src/lib.rs @@ -303,6 +303,12 @@ pub enum Error { #[error("Unsupported configuration version: {version}")] UnsupportedVersion { version: Version }, + + #[error("Missing mandatory option: {path}")] + MissingMandatoryOption { path: String }, + + #[error("Missing figment metadata for mandatory option: {path}")] + MissingMandatoryOptionMetadata { path: String }, } impl From for Error { diff --git a/packages/configuration/src/v2_0_0/mod.rs b/packages/configuration/src/v2_0_0/mod.rs index b426b5c0..75c8cc04 100644 --- a/packages/configuration/src/v2_0_0/mod.rs +++ b/packages/configuration/src/v2_0_0/mod.rs @@ -332,6 +332,8 @@ impl Configuration { .merge(Env::prefixed(CONFIG_OVERRIDE_PREFIX).split(CONFIG_OVERRIDE_SEPARATOR)) }; + Self::check_mandatory_options(&figment)?; + let config: Configuration = figment.extract()?; if config.metadata.schema_version != Version::new(VERSION_2_0_0) { @@ -343,6 +345,49 @@ impl Configuration { Ok(config) } + /// Some configuration options are mandatory. The tracker will panic if + /// the user doesn't provide an explicit value for them from one of the + /// configuration sources: TOML or ENV VARS. + /// + /// # Errors + /// + /// Will return an error if a mandatory configuration option is only + /// obtained by default value (code), meaning the user hasn't overridden it. + fn check_mandatory_options(figment: &Figment) -> Result<(), Error> { + let mandatory_options = ["metadata.schema_version", "logging.threshold", "core.private", "core.listed"]; + + for mandatory_option in mandatory_options { + let value = figment + .find_value(mandatory_option) + .map_err(|_err| Error::MissingMandatoryOption { + path: mandatory_option.to_owned(), + })?; + + let metadata = figment + .get_metadata(value.tag()) + .ok_or_else(|| Error::MissingMandatoryOptionMetadata { + path: mandatory_option.to_owned(), + })?; + + match &metadata.source { + Some(source) => { + if let figment::Source::Code(_) = source { + return Err(Error::MissingMandatoryOption { + path: mandatory_option.to_owned(), + }); + }; + } + None => { + return Err(Error::MissingMandatoryOption { + path: mandatory_option.to_owned(), + }) + } + } + } + + Ok(()) + } + /// Saves the configuration to the configuration file. /// /// # Errors diff --git a/share/default/config/tracker.container.mysql.toml b/share/default/config/tracker.container.mysql.toml index 1fcad4df..865ea224 100644 --- a/share/default/config/tracker.container.mysql.toml +++ b/share/default/config/tracker.container.mysql.toml @@ -3,6 +3,13 @@ app = "torrust-tracker" purpose = "configuration" schema_version = "2.0.0" +[logging] +threshold = "info" + +[core] +listed = false +private = false + [core.database] driver = "mysql" path = "mysql://db_user:db_user_secret_password@mysql:3306/torrust_tracker" diff --git a/share/default/config/tracker.container.sqlite3.toml b/share/default/config/tracker.container.sqlite3.toml index 017df5b4..6c73cf54 100644 --- a/share/default/config/tracker.container.sqlite3.toml +++ b/share/default/config/tracker.container.sqlite3.toml @@ -3,6 +3,13 @@ app = "torrust-tracker" purpose = "configuration" schema_version = "2.0.0" +[logging] +threshold = "info" + +[core] +listed = false +private = false + [core.database] path = "/var/lib/torrust/tracker/database/sqlite3.db" diff --git a/share/default/config/tracker.development.sqlite3.toml b/share/default/config/tracker.development.sqlite3.toml index 1ecc7653..96addaf8 100644 --- a/share/default/config/tracker.development.sqlite3.toml +++ b/share/default/config/tracker.development.sqlite3.toml @@ -3,6 +3,13 @@ app = "torrust-tracker" purpose = "configuration" schema_version = "2.0.0" +[logging] +threshold = "info" + +[core] +listed = false +private = false + [[udp_trackers]] bind_address = "0.0.0.0:6969" diff --git a/share/default/config/tracker.e2e.container.sqlite3.toml b/share/default/config/tracker.e2e.container.sqlite3.toml index 7c6f4bb7..73c6df21 100644 --- a/share/default/config/tracker.e2e.container.sqlite3.toml +++ b/share/default/config/tracker.e2e.container.sqlite3.toml @@ -3,6 +3,13 @@ app = "torrust-tracker" purpose = "configuration" schema_version = "2.0.0" +[logging] +threshold = "info" + +[core] +listed = false +private = false + [core.database] path = "/var/lib/torrust/tracker/database/sqlite3.db" diff --git a/share/default/config/tracker.udp.benchmarking.toml b/share/default/config/tracker.udp.benchmarking.toml index afbef84b..a73760b9 100644 --- a/share/default/config/tracker.udp.benchmarking.toml +++ b/share/default/config/tracker.udp.benchmarking.toml @@ -7,6 +7,8 @@ schema_version = "2.0.0" threshold = "error" [core] +listed = false +private = false remove_peerless_torrents = false tracker_usage_statistics = false