diff --git a/src/bin/tracker_checker.rs b/src/bin/tracker_checker.rs index d2f67609..926a0026 100644 --- a/src/bin/tracker_checker.rs +++ b/src/bin/tracker_checker.rs @@ -1,7 +1,16 @@ //! Program to run checks against running trackers. //! +//! Run providing a config file path: +//! +//! ```text +//! cargo run --bin tracker_checker -- --config-path "./share/default/config/tracker_checker.json" +//! TORRUST_CHECKER_CONFIG_PATH="./share/default/config/tracker_checker.json" cargo run --bin tracker_checker +//! ``` +//! +//! Run providing the configuration: +//! //! ```text -//! cargo run --bin tracker_checker "./share/default/config/tracker_checker.json" +//! TORRUST_CHECKER_CONFIG=$(cat "./share/default/config/tracker_checker.json") cargo run --bin tracker_checker //! ``` use torrust_tracker::checker::app; diff --git a/src/checker/app.rs b/src/checker/app.rs index 66bbf127..1e91ce84 100644 --- a/src/checker/app.rs +++ b/src/checker/app.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use std::sync::Arc; -use anyhow::Context; +use anyhow::{Context, Result}; use clap::Parser; use super::config::Configuration; @@ -12,16 +12,22 @@ use crate::checker::config::parse_from_json; #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] struct Args { - config_path: PathBuf, + /// Path to the JSON configuration file. + #[clap(short, long, env = "TORRUST_CHECKER_CONFIG_PATH")] + config_path: Option, + + /// Direct configuration content in JSON. + #[clap(env = "TORRUST_CHECKER_CONFIG", hide_env_values = true)] + config_content: Option, } /// # Errors /// -/// Will return an error if it can't read or parse the configuration file. -pub async fn run() -> anyhow::Result> { +/// Will return an error if the configuration was not provided. +pub async fn run() -> Result> { let args = Args::parse(); - let config = setup_config(&args)?; + let config = setup_config(args)?; let console_printer = Console {}; @@ -33,9 +39,16 @@ pub async fn run() -> anyhow::Result> { Ok(service.run_checks().await) } -fn setup_config(args: &Args) -> anyhow::Result { - let file_content = - std::fs::read_to_string(&args.config_path).with_context(|| format!("can't read config file {:?}", args.config_path))?; +fn setup_config(args: Args) -> Result { + match (args.config_path, args.config_content) { + (Some(config_path), _) => load_config_from_file(&config_path), + (_, Some(config_content)) => parse_from_json(&config_content).context("invalid config format"), + _ => Err(anyhow::anyhow!("no configuration provided")), + } +} + +fn load_config_from_file(path: &PathBuf) -> Result { + let file_content = std::fs::read_to_string(path).with_context(|| format!("can't read config file {path:?}"))?; parse_from_json(&file_content).context("invalid config format") } diff --git a/src/e2e/runner.rs b/src/e2e/runner.rs index aaac0e91..90c98608 100644 --- a/src/e2e/runner.rs +++ b/src/e2e/runner.rs @@ -197,14 +197,14 @@ fn write_tracker_checker_config_file(config_file_path: &Path, config: &str) { /// Will panic if the config path is not a valid string. pub fn run_tracker_checker(config_path: &Path) -> io::Result<()> { info!( - "Running Tracker Checker: cargo --bin tracker_checker {}", + "Running Tracker Checker: cargo run --bin tracker_checker -- --config-path \"{}\"", config_path.display() ); let path = config_path.to_str().expect("The path should be a valid string"); let status = Command::new("cargo") - .args(["run", "--bin", "tracker_checker", path]) + .args(["run", "--bin", "tracker_checker", "--", "--config-path", path]) .status()?; if status.success() {