forked from torrust/torrust-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathenvironment.rs
More file actions
135 lines (114 loc) · 4.07 KB
/
environment.rs
File metadata and controls
135 lines (114 loc) · 4.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
use std::sync::Arc;
use bittorrent_http_tracker_core::container::HttpTrackerCoreContainer;
use bittorrent_primitives::info_hash::InfoHash;
use bittorrent_tracker_core::container::TrackerCoreContainer;
use futures::executor::block_on;
use torrust_axum_server::tsl::make_rust_tls;
use torrust_server_lib::registar::Registar;
use torrust_tracker_configuration::{logging, Configuration};
use torrust_tracker_primitives::peer;
use crate::server::{HttpServer, Launcher, Running, Stopped};
pub type Started = Environment<Running>;
pub struct Environment<S> {
pub container: Arc<EnvContainer>,
pub registar: Registar,
pub server: HttpServer<S>,
}
impl<S> Environment<S> {
/// Add a torrent to the tracker
pub fn add_torrent_peer(&self, info_hash: &InfoHash, peer: &peer::Peer) {
let _number_of_downloads_increased = self
.container
.tracker_core_container
.in_memory_torrent_repository
.upsert_peer(info_hash, peer, None);
}
}
impl Environment<Stopped> {
/// # Panics
///
/// Will panic if it fails to make the TSL config from the configuration.
#[allow(dead_code)]
#[must_use]
pub fn new(configuration: &Arc<Configuration>) -> Self {
initialize_global_services(configuration);
let container = Arc::new(EnvContainer::initialize(configuration));
let bind_to = container.http_tracker_core_container.http_tracker_config.bind_address;
let tls = block_on(make_rust_tls(
&container.http_tracker_core_container.http_tracker_config.tsl_config,
))
.map(|tls| tls.expect("tls config failed"));
let server = HttpServer::new(Launcher::new(bind_to, tls));
Self {
container,
registar: Registar::default(),
server,
}
}
/// # Panics
///
/// Will panic if the server fails to start.
#[allow(dead_code)]
pub async fn start(self) -> Environment<Running> {
Environment {
container: self.container.clone(),
registar: self.registar.clone(),
server: self
.server
.start(self.container.http_tracker_core_container.clone(), self.registar.give_form())
.await
.unwrap(),
}
}
}
impl Environment<Running> {
pub async fn new(configuration: &Arc<Configuration>) -> Self {
Environment::<Stopped>::new(configuration).start().await
}
/// # Panics
///
/// Will panic if the server fails to stop.
pub async fn stop(self) -> Environment<Stopped> {
Environment {
container: self.container,
registar: Registar::default(),
server: self.server.stop().await.unwrap(),
}
}
#[must_use]
pub fn bind_address(&self) -> &std::net::SocketAddr {
&self.server.state.binding
}
}
pub struct EnvContainer {
pub tracker_core_container: Arc<TrackerCoreContainer>,
pub http_tracker_core_container: Arc<HttpTrackerCoreContainer>,
}
impl EnvContainer {
/// # Panics
///
/// Will panic if the configuration is missing the HTTP tracker configuration.
#[must_use]
pub fn initialize(configuration: &Configuration) -> Self {
let core_config = Arc::new(configuration.core.clone());
let http_tracker_config = configuration
.http_trackers
.clone()
.expect("missing HTTP tracker configuration");
let http_tracker_config = Arc::new(http_tracker_config[0].clone());
let tracker_core_container = Arc::new(TrackerCoreContainer::initialize(&core_config));
let http_tracker_container =
HttpTrackerCoreContainer::initialize_from_tracker_core(&tracker_core_container, &http_tracker_config);
Self {
tracker_core_container,
http_tracker_core_container: http_tracker_container,
}
}
}
fn initialize_global_services(configuration: &Configuration) {
initialize_static();
logging::setup(&configuration.logging);
}
fn initialize_static() {
torrust_tracker_clock::initialize_static();
}