2424use std:: sync:: Arc ;
2525
2626use tokio:: task:: JoinHandle ;
27- use torrust_server_lib:: registar:: Registar ;
28- use torrust_tracker_configuration:: Configuration ;
27+ use torrust_tracker_configuration:: { Configuration , HttpTracker , UdpTracker } ;
2928use tracing:: instrument;
3029
31- use crate :: bootstrap;
3230use crate :: bootstrap:: jobs:: { health_check_api, http_tracker, torrent_cleanup, tracker_apis, udp_tracker} ;
31+ use crate :: bootstrap:: { self } ;
3332use crate :: container:: AppContainer ;
3433
35- pub async fn run ( ) -> ( Arc < AppContainer > , Vec < JoinHandle < ( ) > > , Registar ) {
34+ pub async fn run ( ) -> ( Arc < AppContainer > , Vec < JoinHandle < ( ) > > ) {
3635 let ( config, app_container) = bootstrap:: app:: setup ( ) ;
3736
3837 let app_container = Arc :: new ( app_container) ;
3938
40- let ( jobs, registar ) = start ( & config, & app_container) . await ;
39+ let jobs = start ( & config, & app_container) . await ;
4140
42- ( app_container, jobs, registar )
41+ ( app_container, jobs)
4342}
4443
44+ /// Starts the tracker application.
45+ ///
4546/// # Panics
4647///
4748/// Will panic if:
4849///
4950/// - Can't retrieve tracker keys from database.
5051/// - Can't load whitelist from database.
5152#[ instrument( skip( config, app_container) ) ]
52- pub async fn start ( config : & Configuration , app_container : & Arc < AppContainer > ) -> ( Vec < JoinHandle < ( ) > > , Registar ) {
53+ pub 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 ) {
5379 if config. http_api . is_none ( )
5480 && ( config. udp_trackers . is_none ( ) || config. udp_trackers . as_ref ( ) . map_or ( true , std:: vec:: Vec :: is_empty) )
5581 && ( config. http_trackers . is_none ( ) || config. http_trackers . as_ref ( ) . map_or ( true , std:: vec:: Vec :: is_empty) )
5682 {
5783 tracing:: warn!( "No services enabled in configuration" ) ;
5884 }
85+ }
5986
60- let mut jobs: Vec < JoinHandle < ( ) > > = Vec :: new ( ) ;
61-
62- let registar = Registar :: default ( ) ;
63-
64- // Load peer keys
87+ async fn load_peer_keys ( config : & Configuration , app_container : & Arc < AppContainer > ) {
6588 if config. core . private {
6689 app_container
6790 . tracker_core_container
@@ -70,8 +93,9 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
7093 . await
7194 . expect ( "Could not retrieve keys from database." ) ;
7295 }
96+ }
7397
74- // Load whitelisted torrents
98+ async fn load_whitelisted_torrents ( config : & Configuration , app_container : & Arc < AppContainer > ) {
7599 if config. core . listed {
76100 app_container
77101 . tracker_core_container
@@ -80,8 +104,9 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
80104 . await
81105 . expect ( "Could not load whitelist from database." ) ;
82106 }
107+ }
83108
84- // Start the UDP blocks
109+ async fn start_the_udp_instances ( config : & Configuration , app_container : & Arc < AppContainer > , jobs : & mut Vec < JoinHandle < ( ) > > ) {
85110 if let Some ( udp_trackers) = & config. udp_trackers {
86111 for udp_tracker_config in udp_trackers {
87112 if config. core . private {
@@ -90,49 +115,68 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
90115 udp_tracker_config. bind_address
91116 ) ;
92117 } else {
93- let udp_tracker_container = app_container
94- . udp_tracker_container ( udp_tracker_config. bind_address )
95- . expect ( "Could not create UDP tracker container" ) ;
96- let udp_tracker_server_container = app_container. udp_tracker_server_container ( ) ;
97-
98- jobs. push (
99- udp_tracker:: start_job ( udp_tracker_container, udp_tracker_server_container, registar. give_form ( ) ) . await ,
100- ) ;
118+ start_udp_instance ( udp_tracker_config, app_container, jobs) . await ;
101119 }
102120 }
103121 } else {
104122 tracing:: info!( "No UDP blocks in configuration" ) ;
105123 }
124+ }
106125
107- // Start the HTTP blocks
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 ( ) ;
131+
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 < ( ) > > ) {
108143 if let Some ( http_trackers) = & config. http_trackers {
109144 for http_tracker_config in http_trackers {
110- let http_tracker_container = app_container
111- . http_tracker_container ( http_tracker_config. bind_address )
112- . expect ( "Could not create HTTP tracker container" ) ;
113-
114- if let Some ( job) = http_tracker:: start_job (
115- http_tracker_container,
116- registar. give_form ( ) ,
117- torrust_axum_http_tracker_server:: Version :: V1 ,
118- )
119- . await
120- {
121- jobs. push ( job) ;
122- }
145+ start_http_instance ( http_tracker_config, app_container, jobs) . await ;
123146 }
124147 } else {
125148 tracing:: info!( "No HTTP blocks in configuration" ) ;
126149 }
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+ }
127171
128- // Start HTTP API
172+ async fn start_the_http_api ( config : & Configuration , app_container : & Arc < AppContainer > , jobs : & mut Vec < JoinHandle < ( ) > > ) {
129173 if let Some ( http_api_config) = & config. http_api {
130174 let http_api_config = Arc :: new ( http_api_config. clone ( ) ) ;
131175 let http_api_container = app_container. tracker_http_api_container ( & http_api_config) ;
132176
133177 if let Some ( job) = tracker_apis:: start_job (
134178 http_api_container,
135- registar. give_form ( ) ,
179+ app_container . registar . give_form ( ) ,
136180 torrust_axum_rest_tracker_api_server:: Version :: V1 ,
137181 )
138182 . await
@@ -142,17 +186,17 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
142186 } else {
143187 tracing:: info!( "No API block in configuration" ) ;
144188 }
189+ }
145190
146- // Start runners to remove torrents without peers, every interval
191+ fn start_torrent_cleanup ( config : & Configuration , app_container : & Arc < AppContainer > , jobs : & mut Vec < JoinHandle < ( ) > > ) {
147192 if config. core . inactive_peer_cleanup_interval > 0 {
148193 jobs. push ( torrent_cleanup:: start_job (
149194 & config. core ,
150195 & app_container. tracker_core_container . torrents_manager ,
151196 ) ) ;
152197 }
198+ }
153199
154- // Start Health Check API
155- jobs. push ( health_check_api:: start_job ( & config. health_check_api , registar. entries ( ) ) . await ) ;
156-
157- ( jobs, registar)
200+ async fn start_health_check_api ( config : & Configuration , app_container : & Arc < AppContainer > , jobs : & mut Vec < JoinHandle < ( ) > > ) {
201+ jobs. push ( health_check_api:: start_job ( & config. health_check_api , app_container. registar . entries ( ) ) . await ) ;
158202}
0 commit comments