Skip to content

Commit f5433f7

Browse files
committed
refactor: extract app setup and app start mods
1 parent 5dab523 commit f5433f7

File tree

7 files changed

+124
-109
lines changed

7 files changed

+124
-109
lines changed

src/app.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
use std::sync::Arc;
2+
3+
use log::warn;
4+
use tokio::task::JoinHandle;
5+
use torrust_tracker_configuration::Configuration;
6+
7+
use crate::bootstrap::jobs::{http_tracker, torrent_cleanup, tracker_apis, udp_tracker};
8+
use crate::servers::http::Version;
9+
use crate::tracker;
10+
11+
/// # Panics
12+
///
13+
/// Will panic if the socket address for API can't be parsed.
14+
pub async fn start(config: Arc<Configuration>, tracker: Arc<tracker::Tracker>) -> Vec<JoinHandle<()>> {
15+
let mut jobs: Vec<JoinHandle<()>> = Vec::new();
16+
17+
// Load peer keys
18+
if tracker.is_private() {
19+
tracker
20+
.load_keys_from_database()
21+
.await
22+
.expect("Could not retrieve keys from database.");
23+
}
24+
25+
// Load whitelisted torrents
26+
if tracker.is_whitelisted() {
27+
tracker
28+
.load_whitelist_from_database()
29+
.await
30+
.expect("Could not load whitelist from database.");
31+
}
32+
33+
// Start the UDP blocks
34+
for udp_tracker_config in &config.udp_trackers {
35+
if !udp_tracker_config.enabled {
36+
continue;
37+
}
38+
39+
if tracker.is_private() {
40+
warn!(
41+
"Could not start UDP tracker on: {} while in {:?}. UDP is not safe for private trackers!",
42+
udp_tracker_config.bind_address, config.mode
43+
);
44+
} else {
45+
jobs.push(udp_tracker::start_job(udp_tracker_config, tracker.clone()));
46+
}
47+
}
48+
49+
// Start the HTTP blocks
50+
for http_tracker_config in &config.http_trackers {
51+
if !http_tracker_config.enabled {
52+
continue;
53+
}
54+
jobs.push(http_tracker::start_job(http_tracker_config, tracker.clone(), Version::V1).await);
55+
}
56+
57+
// Start HTTP API
58+
if config.http_api.enabled {
59+
jobs.push(tracker_apis::start_job(&config.http_api, tracker.clone()).await);
60+
}
61+
62+
// Remove torrents without peers, every interval
63+
if config.inactive_peer_cleanup_interval > 0 {
64+
jobs.push(torrent_cleanup::start_job(&config, &tracker));
65+
}
66+
67+
jobs
68+
}

src/bootstrap/app.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use std::env;
2+
use std::sync::Arc;
3+
4+
use crate::bootstrap::stats;
5+
use crate::tracker::Tracker;
6+
use crate::{bootstrap, ephemeral_instance_keys, static_time, tracker};
7+
use torrust_tracker_configuration::Configuration;
8+
9+
/// # Panics
10+
///
11+
/// Will panic if it can't load the configuration from either
12+
/// `./config.toml` file or env var `TORRUST_TRACKER_CONFIG`.
13+
#[must_use]
14+
pub fn setup() -> (Arc<Configuration>, Arc<Tracker>) {
15+
const CONFIG_PATH: &str = "./config.toml";
16+
const CONFIG_ENV_VAR_NAME: &str = "TORRUST_TRACKER_CONFIG";
17+
18+
// Set the time of Torrust app starting
19+
lazy_static::initialize(&static_time::TIME_AT_APP_START);
20+
21+
// Initialize the Ephemeral Instance Random Seed
22+
lazy_static::initialize(&ephemeral_instance_keys::RANDOM_SEED);
23+
24+
// Initialize Torrust config
25+
let config = if env::var(CONFIG_ENV_VAR_NAME).is_ok() {
26+
println!("Loading configuration from env var {CONFIG_ENV_VAR_NAME}");
27+
Arc::new(Configuration::load_from_env_var(CONFIG_ENV_VAR_NAME).unwrap())
28+
} else {
29+
println!("Loading configuration from config file {CONFIG_PATH}");
30+
Arc::new(Configuration::load_from_file(CONFIG_PATH).unwrap())
31+
};
32+
33+
// Initialize statistics
34+
let (stats_event_sender, stats_repository) = stats::setup(config.tracker_usage_statistics);
35+
36+
// Initialize Torrust tracker
37+
let tracker = match tracker::Tracker::new(config.clone(), stats_event_sender, stats_repository) {
38+
Ok(tracker) => Arc::new(tracker),
39+
Err(error) => {
40+
panic!("{}", error)
41+
}
42+
};
43+
44+
// Initialize logging
45+
bootstrap::logging::setup(&config);
46+
47+
(config, tracker)
48+
}

src/bootstrap/jobs/mod.rs

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -2,71 +2,3 @@ pub mod http_tracker;
22
pub mod torrent_cleanup;
33
pub mod tracker_apis;
44
pub mod udp_tracker;
5-
6-
use std::sync::Arc;
7-
8-
use log::warn;
9-
use tokio::task::JoinHandle;
10-
use torrust_tracker_configuration::Configuration;
11-
12-
use crate::servers::http::Version;
13-
use crate::tracker;
14-
15-
/// # Panics
16-
///
17-
/// Will panic if the socket address for API can't be parsed.
18-
pub async fn setup(config: &Configuration, tracker: Arc<tracker::Tracker>) -> Vec<JoinHandle<()>> {
19-
let mut jobs: Vec<JoinHandle<()>> = Vec::new();
20-
21-
// Load peer keys
22-
if tracker.is_private() {
23-
tracker
24-
.load_keys_from_database()
25-
.await
26-
.expect("Could not retrieve keys from database.");
27-
}
28-
29-
// Load whitelisted torrents
30-
if tracker.is_whitelisted() {
31-
tracker
32-
.load_whitelist_from_database()
33-
.await
34-
.expect("Could not load whitelist from database.");
35-
}
36-
37-
// Start the UDP blocks
38-
for udp_tracker_config in &config.udp_trackers {
39-
if !udp_tracker_config.enabled {
40-
continue;
41-
}
42-
43-
if tracker.is_private() {
44-
warn!(
45-
"Could not start UDP tracker on: {} while in {:?}. UDP is not safe for private trackers!",
46-
udp_tracker_config.bind_address, config.mode
47-
);
48-
} else {
49-
jobs.push(udp_tracker::start_job(udp_tracker_config, tracker.clone()));
50-
}
51-
}
52-
53-
// Start the HTTP blocks
54-
for http_tracker_config in &config.http_trackers {
55-
if !http_tracker_config.enabled {
56-
continue;
57-
}
58-
jobs.push(http_tracker::start_job(http_tracker_config, tracker.clone(), Version::V1).await);
59-
}
60-
61-
// Start HTTP API
62-
if config.http_api.enabled {
63-
jobs.push(tracker_apis::start_job(&config.http_api, tracker.clone()).await);
64-
}
65-
66-
// Remove torrents without peers, every interval
67-
if config.inactive_peer_cleanup_interval > 0 {
68-
jobs.push(torrent_cleanup::start_job(config, &tracker));
69-
}
70-
71-
jobs
72-
}

src/bootstrap/jobs/torrent_cleanup.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use torrust_tracker_configuration::Configuration;
88
use crate::tracker;
99

1010
#[must_use]
11-
pub fn start_job(config: &Configuration, tracker: &Arc<tracker::Tracker>) -> JoinHandle<()> {
11+
pub fn start_job(config: &Arc<Configuration>, tracker: &Arc<tracker::Tracker>) -> JoinHandle<()> {
1212
let weak_tracker = std::sync::Arc::downgrade(tracker);
1313
let interval = config.inactive_peer_cleanup_interval;
1414

src/bootstrap/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub mod app;
12
pub mod jobs;
23
pub mod logging;
34
pub mod stats;

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub mod app;
12
pub mod bootstrap;
23
pub mod protocol;
34
pub mod servers;

src/main.rs

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,14 @@
1-
use std::env;
2-
use std::sync::Arc;
3-
41
use log::info;
5-
use torrust_tracker::bootstrap::stats::setup;
6-
use torrust_tracker::{bootstrap, ephemeral_instance_keys, static_time, tracker};
7-
use torrust_tracker_configuration::Configuration;
2+
use torrust_tracker::app;
3+
use torrust_tracker::bootstrap;
84

95
#[tokio::main]
106
async fn main() {
11-
const CONFIG_PATH: &str = "./config.toml";
12-
const CONFIG_ENV_VAR_NAME: &str = "TORRUST_TRACKER_CONFIG";
13-
14-
// Set the time of Torrust app starting
15-
lazy_static::initialize(&static_time::TIME_AT_APP_START);
16-
17-
// Initialize the Ephemeral Instance Random Seed
18-
lazy_static::initialize(&ephemeral_instance_keys::RANDOM_SEED);
19-
20-
// Initialize Torrust config
21-
let config = if env::var(CONFIG_ENV_VAR_NAME).is_ok() {
22-
println!("Loading configuration from env var {CONFIG_ENV_VAR_NAME}");
23-
Arc::new(Configuration::load_from_env_var(CONFIG_ENV_VAR_NAME).unwrap())
24-
} else {
25-
println!("Loading configuration from config file {CONFIG_PATH}");
26-
Arc::new(Configuration::load_from_file(CONFIG_PATH).unwrap())
27-
};
28-
29-
// Initialize statistics
30-
let (stats_event_sender, stats_repository) = setup(config.tracker_usage_statistics);
31-
32-
// Initialize Torrust tracker
33-
let tracker = match tracker::Tracker::new(config.clone(), stats_event_sender, stats_repository) {
34-
Ok(tracker) => Arc::new(tracker),
35-
Err(error) => {
36-
panic!("{}", error)
37-
}
38-
};
39-
40-
// Initialize logging
41-
bootstrap::logging::setup(&config);
7+
let (config, tracker) = bootstrap::app::setup();
428

43-
// Run jobs
44-
let jobs = bootstrap::jobs::setup(&config, tracker.clone()).await;
9+
let jobs = app::start(config.clone(), tracker.clone()).await;
4510

46-
// handle the signals here
11+
// handle the signals
4712
tokio::select! {
4813
_ = tokio::signal::ctrl_c() => {
4914
info!("Torrust shutting down..");

0 commit comments

Comments
 (0)