diff --git a/Cargo.lock b/Cargo.lock index 18db4f012..8ab03180f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2573,14 +2573,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" -[[package]] -name = "test-helpers" -version = "2.3.0" -dependencies = [ - "lazy_static", - "tokio", -] - [[package]] name = "textwrap" version = "0.11.0" @@ -2829,14 +2821,42 @@ dependencies = [ "serde_bencode", "serde_json", "serde_with", - "test-helpers", "thiserror", "tokio", "toml", + "torrust-tracker-configuration", + "torrust-tracker-primitives", + "torrust-tracker-test-helpers", "uuid 1.2.1", "warp", ] +[[package]] +name = "torrust-tracker-configuration" +version = "2.3.0" +dependencies = [ + "config", + "serde", + "serde_with", + "toml", + "torrust-tracker-primitives", +] + +[[package]] +name = "torrust-tracker-primitives" +version = "2.3.0" +dependencies = [ + "serde", +] + +[[package]] +name = "torrust-tracker-test-helpers" +version = "2.3.0" +dependencies = [ + "lazy_static", + "tokio", +] + [[package]] name = "tower" version = "0.4.13" diff --git a/Cargo.toml b/Cargo.toml index 5daeeaec2..6992a9497 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,15 +41,19 @@ aquatic_udp_protocol = "0.2" uuid = { version = "1", features = ["v4"] } axum = "0.6.1" axum-server = { version = "0.4.4", features = ["tls-rustls"] } +torrust-tracker-primitives = { path = "packages/primitives" } +torrust-tracker-configuration = { path = "packages/configuration" } [dev-dependencies] mockall = "0.11" reqwest = { version = "0.11.13", features = ["json"] } -test-helpers = { path = "test-helpers" } +torrust-tracker-test-helpers = { path = "packages/test-helpers" } [workspace] members = [ - "test-helpers" + "packages/configuration", + "packages/primitives", + "packages/test-helpers" ] [profile.dev] diff --git a/packages/configuration/Cargo.toml b/packages/configuration/Cargo.toml new file mode 100644 index 000000000..a6de5d308 --- /dev/null +++ b/packages/configuration/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "torrust-tracker-configuration" +version.workspace = true +authors.workspace = true +edition.workspace = true + +[dependencies] +serde = { version = "1.0", features = ["derive"] } +serde_with = "2.0" +config = "0.13" +toml = "0.5" +torrust-tracker-primitives = { path = "../primitives" } diff --git a/src/config.rs b/packages/configuration/src/lib.rs similarity index 96% rename from src/config.rs rename to packages/configuration/src/lib.rs index 8f9b31a2b..30bbcd906 100644 --- a/src/config.rs +++ b/packages/configuration/src/lib.rs @@ -7,10 +7,7 @@ use std::{env, fs}; use config::{Config, ConfigError, File, FileFormat}; use serde::{Deserialize, Serialize}; use serde_with::{serde_as, NoneAsEmptyString}; -use {std, toml}; - -use crate::databases::driver::Driver; -use crate::tracker::mode; +use torrust_tracker_primitives::{DatabaseDriver, TrackerMode}; #[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] pub struct UdpTracker { @@ -56,8 +53,8 @@ impl HttpApi { #[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] pub struct Configuration { pub log_level: Option, - pub mode: mode::Mode, - pub db_driver: Driver, + pub mode: TrackerMode, + pub db_driver: DatabaseDriver, pub db_path: String, pub announce_interval: u32, pub min_announce_interval: u32, @@ -127,8 +124,8 @@ impl Default for Configuration { fn default() -> Self { let mut configuration = Configuration { log_level: Option::from(String::from("info")), - mode: mode::Mode::Public, - db_driver: Driver::Sqlite3, + mode: TrackerMode::Public, + db_driver: DatabaseDriver::Sqlite3, db_path: String::from("./storage/database/data.db"), announce_interval: 120, min_announce_interval: 120, @@ -187,7 +184,7 @@ impl Configuration { let config_builder = Config::builder(); #[allow(unused_assignments)] - let mut config = Config::default(); + let mut config = Config::default(); if Path::new(path).exists() { config = config_builder @@ -242,7 +239,7 @@ impl Configuration { #[cfg(test)] mod tests { - use crate::config::{Configuration, Error}; + use crate::{Configuration, Error}; #[cfg(test)] fn default_config_toml() -> String { @@ -281,10 +278,10 @@ mod tests { [http_api.access_tokens] admin = "MyAccessToken" "# - .lines() - .map(str::trim_start) - .collect::>() - .join("\n"); + .lines() + .map(str::trim_start) + .collect::>() + .join("\n"); config } diff --git a/packages/primitives/Cargo.toml b/packages/primitives/Cargo.toml new file mode 100644 index 000000000..49cc84f9a --- /dev/null +++ b/packages/primitives/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "torrust-tracker-primitives" +version.workspace = true +authors.workspace = true +edition.workspace = true + +[dependencies] +serde = { version = "1.0", features = ["derive"] } diff --git a/src/tracker/mode.rs b/packages/primitives/src/lib.rs similarity index 67% rename from src/tracker/mode.rs rename to packages/primitives/src/lib.rs index a0dba6e67..7821addf8 100644 --- a/src/tracker/mode.rs +++ b/packages/primitives/src/lib.rs @@ -1,8 +1,14 @@ -use serde; -use serde::{Deserialize, Serialize}; +use serde::{Serialize, Deserialize}; + +// TODO: Move to the database crate once that gets its own crate. +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +pub enum DatabaseDriver { + Sqlite3, + MySQL, +} #[derive(Serialize, Deserialize, Copy, Clone, PartialEq, Eq, Debug)] -pub enum Mode { +pub enum TrackerMode { // Will track every new info hash and serve every peer. #[serde(rename = "public")] Public, diff --git a/test-helpers/Cargo.toml b/packages/test-helpers/Cargo.toml similarity index 84% rename from test-helpers/Cargo.toml rename to packages/test-helpers/Cargo.toml index 7b949d3f8..76516fca8 100644 --- a/test-helpers/Cargo.toml +++ b/packages/test-helpers/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "test-helpers" +name = "torrust-tracker-test-helpers" version.workspace = true authors.workspace = true edition.workspace = true diff --git a/test-helpers/src/config.rs b/packages/test-helpers/src/config.rs similarity index 100% rename from test-helpers/src/config.rs rename to packages/test-helpers/src/config.rs diff --git a/test-helpers/src/lib.rs b/packages/test-helpers/src/lib.rs similarity index 100% rename from test-helpers/src/lib.rs rename to packages/test-helpers/src/lib.rs diff --git a/src/apis/middlewares/auth.rs b/src/apis/middlewares/auth.rs index e54311d33..6f6250173 100644 --- a/src/apis/middlewares/auth.rs +++ b/src/apis/middlewares/auth.rs @@ -5,9 +5,9 @@ use axum::http::Request; use axum::middleware::Next; use axum::response::{IntoResponse, Response}; use serde::Deserialize; +use torrust_tracker_configuration::{Configuration, HttpApi}; use crate::apis::responses::unhandled_rejection_response; -use crate::config::{Configuration, HttpApi}; #[derive(Deserialize, Debug)] pub struct QueryParams { diff --git a/src/databases/driver.rs b/src/databases/driver.rs deleted file mode 100644 index 7eaa9064e..000000000 --- a/src/databases/driver.rs +++ /dev/null @@ -1,7 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] -pub enum Driver { - Sqlite3, - MySQL, -} diff --git a/src/databases/mod.rs b/src/databases/mod.rs index 873dd70eb..c7fbf8f57 100644 --- a/src/databases/mod.rs +++ b/src/databases/mod.rs @@ -1,11 +1,10 @@ -pub mod driver; pub mod error; pub mod mysql; pub mod sqlite; use async_trait::async_trait; +use torrust_tracker_primitives::DatabaseDriver; -use self::driver::Driver; use self::error::Error; use crate::databases::mysql::Mysql; use crate::databases::sqlite::Sqlite; @@ -15,13 +14,13 @@ use crate::tracker::auth; /// # Errors /// /// Will return `r2d2::Error` if `db_path` is not able to create a database. -pub fn connect(db_driver: &Driver, db_path: &str) -> Result, r2d2::Error> { +pub fn connect(db_driver: &DatabaseDriver, db_path: &str) -> Result, r2d2::Error> { let database: Box = match db_driver { - Driver::Sqlite3 => { + DatabaseDriver::Sqlite3 => { let db = Sqlite::new(db_path)?; Box::new(db) } - Driver::MySQL => { + DatabaseDriver::MySQL => { let db = Mysql::new(db_path)?; Box::new(db) } diff --git a/src/jobs/http_tracker.rs b/src/jobs/http_tracker.rs index c62bc5cc9..be66afa32 100644 --- a/src/jobs/http_tracker.rs +++ b/src/jobs/http_tracker.rs @@ -3,8 +3,8 @@ use std::sync::Arc; use log::{info, warn}; use tokio::task::JoinHandle; +use torrust_tracker_configuration::HttpTracker; -use crate::config::HttpTracker; use crate::http::server::Http; use crate::tracker; diff --git a/src/jobs/torrent_cleanup.rs b/src/jobs/torrent_cleanup.rs index 073ceda61..4c4ed1f53 100644 --- a/src/jobs/torrent_cleanup.rs +++ b/src/jobs/torrent_cleanup.rs @@ -3,8 +3,8 @@ use std::sync::Arc; use chrono::Utc; use log::info; use tokio::task::JoinHandle; +use torrust_tracker_configuration::Configuration; -use crate::config::Configuration; use crate::tracker; #[must_use] diff --git a/src/jobs/tracker_apis.rs b/src/jobs/tracker_apis.rs index 00e39eeba..85bb1b59f 100644 --- a/src/jobs/tracker_apis.rs +++ b/src/jobs/tracker_apis.rs @@ -4,9 +4,9 @@ use axum_server::tls_rustls::RustlsConfig; use log::info; use tokio::sync::oneshot; use tokio::task::JoinHandle; +use torrust_tracker_configuration::HttpApi; use crate::apis::server; -use crate::config::HttpApi; use crate::tracker; #[derive(Debug)] diff --git a/src/jobs/udp_tracker.rs b/src/jobs/udp_tracker.rs index d0907c976..468f6dbbd 100644 --- a/src/jobs/udp_tracker.rs +++ b/src/jobs/udp_tracker.rs @@ -2,8 +2,8 @@ use std::sync::Arc; use log::{error, info, warn}; use tokio::task::JoinHandle; +use torrust_tracker_configuration::UdpTracker; -use crate::config::UdpTracker; use crate::tracker; use crate::udp::server::Udp; diff --git a/src/lib.rs b/src/lib.rs index e8cf53045..28a3066dc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,4 @@ pub mod apis; -pub mod config; pub mod databases; pub mod http; pub mod jobs; diff --git a/src/logging.rs b/src/logging.rs index 4d16f7670..83e2c9360 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -2,8 +2,7 @@ use std::str::FromStr; use std::sync::Once; use log::{info, LevelFilter}; - -use crate::config::Configuration; +use torrust_tracker_configuration::Configuration; static INIT: Once = Once::new(); diff --git a/src/main.rs b/src/main.rs index 199e8f5c5..fcb8331a4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,9 +2,9 @@ use std::env; use std::sync::Arc; use log::info; -use torrust_tracker::config::Configuration; use torrust_tracker::stats::setup_statistics; use torrust_tracker::{ephemeral_instance_keys, logging, setup, static_time, tracker}; +use torrust_tracker_configuration::Configuration; #[tokio::main] async fn main() { diff --git a/src/setup.rs b/src/setup.rs index e7535e67d..49d385d44 100644 --- a/src/setup.rs +++ b/src/setup.rs @@ -2,8 +2,8 @@ use std::sync::Arc; use log::warn; use tokio::task::JoinHandle; +use torrust_tracker_configuration::Configuration; -use crate::config::Configuration; use crate::jobs::{http_tracker, torrent_cleanup, tracker_apis, udp_tracker}; use crate::tracker; diff --git a/src/tracker/mod.rs b/src/tracker/mod.rs index 4f1dab49b..8c2f6c8d1 100644 --- a/src/tracker/mod.rs +++ b/src/tracker/mod.rs @@ -1,5 +1,4 @@ pub mod auth; -pub mod mode; pub mod peer; pub mod services; pub mod statistics; @@ -13,14 +12,15 @@ use std::time::Duration; use tokio::sync::mpsc::error::SendError; use tokio::sync::{RwLock, RwLockReadGuard}; +use torrust_tracker_configuration::Configuration; +use torrust_tracker_primitives::TrackerMode; -use crate::config::Configuration; use crate::databases::{self, Database}; use crate::protocol::info_hash::InfoHash; pub struct Tracker { pub config: Arc, - mode: mode::Mode, + mode: TrackerMode, keys: RwLock>, whitelist: RwLock>, torrents: RwLock>, @@ -61,15 +61,15 @@ impl Tracker { } pub fn is_public(&self) -> bool { - self.mode == mode::Mode::Public + self.mode == TrackerMode::Public } pub fn is_private(&self) -> bool { - self.mode == mode::Mode::Private || self.mode == mode::Mode::PrivateListed + self.mode == TrackerMode::Private || self.mode == TrackerMode::PrivateListed } pub fn is_whitelisted(&self) -> bool { - self.mode == mode::Mode::Listed || self.mode == mode::Mode::PrivateListed + self.mode == TrackerMode::Listed || self.mode == TrackerMode::PrivateListed } /// # Errors @@ -366,10 +366,10 @@ impl Tracker { #[cfg(test)] mod tests { use std::sync::Arc; + use torrust_tracker_configuration::{Configuration, ephemeral_configuration}; use super::statistics::Keeper; use super::{TorrentsMetrics, Tracker}; - use crate::config::{ephemeral_configuration, Configuration}; pub fn tracker_configuration() -> Arc { Arc::new(ephemeral_configuration()) diff --git a/src/tracker/services/common.rs b/src/tracker/services/common.rs index 8757e6a21..f3a140873 100644 --- a/src/tracker/services/common.rs +++ b/src/tracker/services/common.rs @@ -1,6 +1,6 @@ use std::sync::Arc; +use torrust_tracker_configuration::Configuration; -use crate::config::Configuration; use crate::tracker::statistics::Keeper; use crate::tracker::Tracker; diff --git a/src/tracker/services/statistics.rs b/src/tracker/services/statistics.rs index 745f5563c..663594a73 100644 --- a/src/tracker/services/statistics.rs +++ b/src/tracker/services/statistics.rs @@ -35,8 +35,8 @@ pub async fn get_metrics(tracker: Arc) -> TrackerMetrics { #[cfg(test)] mod tests { use std::sync::Arc; + use torrust_tracker_configuration::{Configuration, ephemeral_configuration}; - use crate::config::{ephemeral_configuration, Configuration}; use crate::tracker; use crate::tracker::services::common::tracker_factory; use crate::tracker::services::statistics::{get_metrics, TrackerMetrics}; diff --git a/src/tracker/services/torrent.rs b/src/tracker/services/torrent.rs index a08fd54d1..797e0429e 100644 --- a/src/tracker/services/torrent.rs +++ b/src/tracker/services/torrent.rs @@ -139,8 +139,8 @@ mod tests { use std::str::FromStr; use std::sync::Arc; + use torrust_tracker_configuration::{Configuration, ephemeral_configuration}; - use crate::config::{ephemeral_configuration, Configuration}; use crate::protocol::info_hash::InfoHash; use crate::tracker::services::common::tracker_factory; use crate::tracker::services::torrent::tests::sample_peer; @@ -192,8 +192,8 @@ mod tests { use std::str::FromStr; use std::sync::Arc; + use torrust_tracker_configuration::{Configuration, ephemeral_configuration}; - use crate::config::{ephemeral_configuration, Configuration}; use crate::protocol::info_hash::InfoHash; use crate::tracker::services::common::tracker_factory; use crate::tracker::services::torrent::tests::sample_peer; diff --git a/src/udp/handlers.rs b/src/udp/handlers.rs index 076710fb6..96f0eec89 100644 --- a/src/udp/handlers.rs +++ b/src/udp/handlers.rs @@ -244,10 +244,11 @@ mod tests { use std::sync::Arc; use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes}; + use torrust_tracker_configuration::{Configuration, ephemeral_configuration}; + use torrust_tracker_primitives::TrackerMode; - use crate::config::{ephemeral_configuration, Configuration}; use crate::protocol::clock::{Current, Time}; - use crate::tracker::{self, mode, peer, statistics}; + use crate::tracker::{self, peer, statistics}; fn tracker_configuration() -> Arc { Arc::new(default_testing_tracker_configuration()) @@ -258,17 +259,17 @@ mod tests { } fn initialized_public_tracker() -> Arc { - let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(mode::Mode::Public).into()); + let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(TrackerMode::Public).into()); initialized_tracker(&configuration) } fn initialized_private_tracker() -> Arc { - let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(mode::Mode::Private).into()); + let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(TrackerMode::Private).into()); initialized_tracker(&configuration) } fn initialized_whitelisted_tracker() -> Arc { - let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(mode::Mode::Listed).into()); + let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(TrackerMode::Listed).into()); initialized_tracker(&configuration) } @@ -348,7 +349,7 @@ mod tests { self } - pub fn with_mode(mut self, mode: mode::Mode) -> Self { + pub fn with_mode(mut self, mode: TrackerMode) -> Self { self.configuration.mode = mode; self } diff --git a/tests/api/server.rs b/tests/api/server.rs index 437e4eeb3..679ad1a7a 100644 --- a/tests/api/server.rs +++ b/tests/api/server.rs @@ -1,12 +1,12 @@ use core::panic; use std::sync::Arc; -use torrust_tracker::config::{Configuration, ephemeral_configuration}; use torrust_tracker::jobs::tracker_apis; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::peer::Peer; use torrust_tracker::tracker::statistics::Keeper; use torrust_tracker::{ephemeral_instance_keys, logging, static_time, tracker}; +use torrust_tracker_configuration::{Configuration, ephemeral_configuration}; use super::connection_info::ConnectionInfo; diff --git a/tests/udp.rs b/tests/udp.rs index 8405528af..f48c629eb 100644 --- a/tests/udp.rs +++ b/tests/udp.rs @@ -2,7 +2,7 @@ /// /// cargo test `udp_tracker_server` -- --nocapture extern crate rand; -extern crate test_helpers; +extern crate torrust_tracker_test_helpers; mod udp_tracker_server { use core::panic; @@ -17,11 +17,11 @@ mod udp_tracker_server { }; use tokio::net::UdpSocket; use tokio::task::JoinHandle; - use torrust_tracker::config::{Configuration, ephemeral_configuration}; use torrust_tracker::jobs::udp_tracker; use torrust_tracker::tracker::statistics::Keeper; use torrust_tracker::udp::MAX_PACKET_SIZE; use torrust_tracker::{ephemeral_instance_keys, logging, static_time, tracker}; + use torrust_tracker_configuration::{Configuration, ephemeral_configuration}; fn tracker_configuration() -> Arc { Arc::new(ephemeral_configuration())