2424use std:: sync:: Arc ;
2525
2626use tokio:: task:: JoinHandle ;
27- use torrust_tracker_configuration:: Configuration ;
27+ use torrust_tracker_configuration:: { Configuration , HttpTracker , UdpTracker } ;
2828use tracing:: instrument;
2929
30- use crate :: bootstrap;
3130use crate :: bootstrap:: jobs:: { health_check_api, http_tracker, torrent_cleanup, tracker_apis, udp_tracker} ;
31+ use crate :: bootstrap:: { self } ;
3232use crate :: container:: AppContainer ;
3333
3434pub async fn run ( ) -> ( Arc < AppContainer > , Vec < JoinHandle < ( ) > > ) {
@@ -41,6 +41,8 @@ pub async fn run() -> (Arc<AppContainer>, Vec<JoinHandle<()>>) {
4141 ( app_container, jobs)
4242}
4343
44+ /// Starts the tracker application.
45+ ///
4446/// # Panics
4547///
4648/// Will panic if:
@@ -49,16 +51,40 @@ pub async fn run() -> (Arc<AppContainer>, Vec<JoinHandle<()>>) {
4951/// - Can't load whitelist from database.
5052#[ instrument( skip( config, app_container) ) ]
5153pub async fn start ( config : & Configuration , app_container : & Arc < AppContainer > ) -> Vec < JoinHandle < ( ) > > {
54+ warn_if_no_services_enabled ( config) ;
55+
56+ load_data_from_database ( config, app_container) . await ;
57+
58+ start_jobs ( config, app_container) . await
59+ }
60+
61+ async fn load_data_from_database ( config : & Configuration , app_container : & Arc < AppContainer > ) {
62+ load_peer_keys ( config, app_container) . await ;
63+ load_whitelisted_torrents ( config, app_container) . await ;
64+ }
65+
66+ async fn start_jobs ( config : & Configuration , app_container : & Arc < AppContainer > ) -> Vec < JoinHandle < ( ) > > {
67+ let mut jobs: Vec < JoinHandle < ( ) > > = Vec :: new ( ) ;
68+
69+ start_the_udp_instances ( config, app_container, & mut jobs) . await ;
70+ start_the_http_instances ( config, app_container, & mut jobs) . await ;
71+ start_the_http_api ( config, app_container, & mut jobs) . await ;
72+ start_torrent_cleanup ( config, app_container, & mut jobs) ;
73+ start_health_check_api ( config, app_container, & mut jobs) . await ;
74+
75+ jobs
76+ }
77+
78+ fn warn_if_no_services_enabled ( config : & Configuration ) {
5279 if config. http_api . is_none ( )
5380 && ( config. udp_trackers . is_none ( ) || config. udp_trackers . as_ref ( ) . map_or ( true , std:: vec:: Vec :: is_empty) )
5481 && ( config. http_trackers . is_none ( ) || config. http_trackers . as_ref ( ) . map_or ( true , std:: vec:: Vec :: is_empty) )
5582 {
5683 tracing:: warn!( "No services enabled in configuration" ) ;
5784 }
85+ }
5886
59- let mut jobs: Vec < JoinHandle < ( ) > > = Vec :: new ( ) ;
60-
61- // Load peer keys
87+ async fn load_peer_keys ( config : & Configuration , app_container : & Arc < AppContainer > ) {
6288 if config. core . private {
6389 app_container
6490 . tracker_core_container
@@ -67,8 +93,9 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
6793 . await
6894 . expect ( "Could not retrieve keys from database." ) ;
6995 }
96+ }
7097
71- // Load whitelisted torrents
98+ async fn load_whitelisted_torrents ( config : & Configuration , app_container : & Arc < AppContainer > ) {
7299 if config. core . listed {
73100 app_container
74101 . tracker_core_container
@@ -77,8 +104,9 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
77104 . await
78105 . expect ( "Could not load whitelist from database." ) ;
79106 }
107+ }
80108
81- // Start the UDP blocks
109+ async fn start_the_udp_instances ( config : & Configuration , app_container : & Arc < AppContainer > , jobs : & mut Vec < JoinHandle < ( ) > > ) {
82110 if let Some ( udp_trackers) = & config. udp_trackers {
83111 for udp_tracker_config in udp_trackers {
84112 if config. core . private {
@@ -87,47 +115,61 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
87115 udp_tracker_config. bind_address
88116 ) ;
89117 } else {
90- let udp_tracker_container = app_container
91- . udp_tracker_container ( udp_tracker_config. bind_address )
92- . expect ( "Could not create UDP tracker container" ) ;
93- let udp_tracker_server_container = app_container. udp_tracker_server_container ( ) ;
94-
95- jobs. push (
96- udp_tracker:: start_job (
97- udp_tracker_container,
98- udp_tracker_server_container,
99- app_container. registar . give_form ( ) ,
100- )
101- . await ,
102- ) ;
118+ start_udp_instance ( udp_tracker_config, app_container, jobs) . await ;
103119 }
104120 }
105121 } else {
106122 tracing:: info!( "No UDP blocks in configuration" ) ;
107123 }
124+ }
125+
126+ async fn start_udp_instance ( udp_tracker_config : & UdpTracker , app_container : & Arc < AppContainer > , jobs : & mut Vec < JoinHandle < ( ) > > ) {
127+ let udp_tracker_container = app_container
128+ . udp_tracker_container ( udp_tracker_config. bind_address )
129+ . expect ( "Could not create UDP tracker container" ) ;
130+ let udp_tracker_server_container = app_container. udp_tracker_server_container ( ) ;
108131
109- // Start the HTTP blocks
132+ jobs. push (
133+ udp_tracker:: start_job (
134+ udp_tracker_container,
135+ udp_tracker_server_container,
136+ app_container. registar . give_form ( ) ,
137+ )
138+ . await ,
139+ ) ;
140+ }
141+
142+ async fn start_the_http_instances ( config : & Configuration , app_container : & Arc < AppContainer > , jobs : & mut Vec < JoinHandle < ( ) > > ) {
110143 if let Some ( http_trackers) = & config. http_trackers {
111144 for http_tracker_config in http_trackers {
112- let http_tracker_container = app_container
113- . http_tracker_container ( http_tracker_config. bind_address )
114- . expect ( "Could not create HTTP tracker container" ) ;
115-
116- if let Some ( job) = http_tracker:: start_job (
117- http_tracker_container,
118- app_container. registar . give_form ( ) ,
119- torrust_axum_http_tracker_server:: Version :: V1 ,
120- )
121- . await
122- {
123- jobs. push ( job) ;
124- }
145+ start_http_instance ( http_tracker_config, app_container, jobs) . await ;
125146 }
126147 } else {
127148 tracing:: info!( "No HTTP blocks in configuration" ) ;
128149 }
150+ }
151+
152+ async fn start_http_instance (
153+ http_tracker_config : & HttpTracker ,
154+ app_container : & Arc < AppContainer > ,
155+ jobs : & mut Vec < JoinHandle < ( ) > > ,
156+ ) {
157+ let http_tracker_container = app_container
158+ . http_tracker_container ( http_tracker_config. bind_address )
159+ . expect ( "Could not create HTTP tracker container" ) ;
160+
161+ if let Some ( job) = http_tracker:: start_job (
162+ http_tracker_container,
163+ app_container. registar . give_form ( ) ,
164+ torrust_axum_http_tracker_server:: Version :: V1 ,
165+ )
166+ . await
167+ {
168+ jobs. push ( job) ;
169+ }
170+ }
129171
130- // Start HTTP API
172+ async fn start_the_http_api ( config : & Configuration , app_container : & Arc < AppContainer > , jobs : & mut Vec < JoinHandle < ( ) > > ) {
131173 if let Some ( http_api_config) = & config. http_api {
132174 let http_api_config = Arc :: new ( http_api_config. clone ( ) ) ;
133175 let http_api_container = app_container. tracker_http_api_container ( & http_api_config) ;
@@ -144,17 +186,17 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
144186 } else {
145187 tracing:: info!( "No API block in configuration" ) ;
146188 }
189+ }
147190
148- // Start runners to remove torrents without peers, every interval
191+ fn start_torrent_cleanup ( config : & Configuration , app_container : & Arc < AppContainer > , jobs : & mut Vec < JoinHandle < ( ) > > ) {
149192 if config. core . inactive_peer_cleanup_interval > 0 {
150193 jobs. push ( torrent_cleanup:: start_job (
151194 & config. core ,
152195 & app_container. tracker_core_container . torrents_manager ,
153196 ) ) ;
154197 }
198+ }
155199
156- // Start Health Check API
200+ async fn start_health_check_api ( config : & Configuration , app_container : & Arc < AppContainer > , jobs : & mut Vec < JoinHandle < ( ) > > ) {
157201 jobs. push ( health_check_api:: start_job ( & config. health_check_api , app_container. registar . entries ( ) ) . await ) ;
158-
159- jobs
160202}
0 commit comments