Skip to content

Commit 92349d3

Browse files
committed
Merge #810: chore:[#674] Tracker Checker: Ouput in JSON
b27f002 remove unused dependencies (ngthhu) 7de4fbc format fix (ngthhu) b301596 chore:[#674] Tracker Checker: Ouput in JSON (ngthhu) Pull request description: ACKs for top commit: josecelano: ACK b27f002 Tree-SHA512: 571125c6204f98e49d7003ab16549dc98f258f4c183e029dcddb53f5af5a72c8fa8cb564d2afef075ea5ee35edad72a593467b551c43dca18430d79f229b0eb6
2 parents 9a1ce0e + b27f002 commit 92349d3

File tree

8 files changed

+92
-73
lines changed

8 files changed

+92
-73
lines changed

Cargo.lock

+1-11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ axum-extra = { version = "0", features = ["query"] }
3939
axum-server = { version = "0", features = ["tls-rustls"] }
4040
chrono = { version = "0", default-features = false, features = ["clock"] }
4141
clap = { version = "4", features = ["derive", "env"] }
42-
colored = "2"
4342
config = "0"
4443
crossbeam-skiplist = "0.1"
4544
dashmap = "5.5.3"
@@ -62,7 +61,7 @@ ringbuf = "0"
6261
serde = { version = "1", features = ["derive"] }
6362
serde_bencode = "0"
6463
serde_bytes = "0"
65-
serde_json = "1"
64+
serde_json = { version = "1", features = ["preserve_order"] }
6665
serde_repr = "0"
6766
thiserror = "1"
6867
tokio = { version = "1", features = ["macros", "net", "rt-multi-thread", "signal", "sync"] }
+25-27
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,49 @@
11
use std::time::Duration;
22

3-
use colored::Colorize;
43
use reqwest::{Client as HttpClient, Url, Url as ServiceUrl};
54

6-
use crate::console::clients::checker::console::Console;
7-
use crate::console::clients::checker::printer::Printer;
5+
use super::structs::{CheckerOutput, Status};
86
use crate::console::clients::checker::service::{CheckError, CheckResult};
97

10-
pub async fn run(health_checks: &Vec<ServiceUrl>, console: &Console, check_results: &mut Vec<CheckResult>) {
11-
console.println("Health checks ...");
8+
#[allow(clippy::missing_panics_doc)]
9+
pub async fn run(health_checks: &Vec<ServiceUrl>, check_results: &mut Vec<CheckResult>) -> Vec<CheckerOutput> {
10+
let mut health_checkers: Vec<CheckerOutput> = Vec::new();
1211

1312
for health_check_url in health_checks {
14-
match run_health_check(health_check_url.clone(), console).await {
15-
Ok(()) => check_results.push(Ok(())),
16-
Err(err) => check_results.push(Err(err)),
13+
let mut health_checker = CheckerOutput {
14+
url: health_check_url.to_string(),
15+
status: Status {
16+
code: String::new(),
17+
message: String::new(),
18+
},
19+
};
20+
match run_health_check(health_check_url.clone()).await {
21+
Ok(()) => {
22+
check_results.push(Ok(()));
23+
health_checker.status.code = "ok".to_string();
24+
}
25+
Err(err) => {
26+
check_results.push(Err(err));
27+
health_checker.status.code = "error".to_string();
28+
health_checker.status.message = "Health API is failing.".to_string();
29+
}
1730
}
31+
health_checkers.push(health_checker);
1832
}
33+
health_checkers
1934
}
2035

21-
async fn run_health_check(url: Url, console: &Console) -> Result<(), CheckError> {
36+
async fn run_health_check(url: Url) -> Result<(), CheckError> {
2237
let client = HttpClient::builder().timeout(Duration::from_secs(5)).build().unwrap();
2338

24-
let colored_url = url.to_string().yellow();
25-
2639
match client.get(url.clone()).send().await {
2740
Ok(response) => {
2841
if response.status().is_success() {
29-
console.println(&format!("{} - Health API at {} is OK", "✓".green(), colored_url));
3042
Ok(())
3143
} else {
32-
console.eprintln(&format!(
33-
"{} - Health API at {} is failing: {:?}",
34-
"✗".red(),
35-
colored_url,
36-
response
37-
));
3844
Err(CheckError::HealthCheckError { url })
3945
}
4046
}
41-
Err(err) => {
42-
console.eprintln(&format!(
43-
"{} - Health API at {} is failing: {:?}",
44-
"✗".red(),
45-
colored_url,
46-
err
47-
));
48-
Err(CheckError::HealthCheckError { url })
49-
}
47+
Err(_) => Err(CheckError::HealthCheckError { url }),
5048
}
5149
}

src/console/clients/checker/checks/http.rs

+19-10
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,56 @@
11
use std::str::FromStr;
22

3-
use colored::Colorize;
43
use log::debug;
54
use reqwest::Url as ServiceUrl;
65
use torrust_tracker_primitives::info_hash::InfoHash;
76
use url::Url;
87

9-
use crate::console::clients::checker::console::Console;
10-
use crate::console::clients::checker::printer::Printer;
8+
use super::structs::{CheckerOutput, Status};
119
use crate::console::clients::checker::service::{CheckError, CheckResult};
1210
use crate::shared::bit_torrent::tracker::http::client::requests::announce::QueryBuilder;
1311
use crate::shared::bit_torrent::tracker::http::client::responses::announce::Announce;
1412
use crate::shared::bit_torrent::tracker::http::client::responses::scrape;
1513
use crate::shared::bit_torrent::tracker::http::client::{requests, Client};
1614

17-
pub async fn run(http_trackers: &Vec<ServiceUrl>, console: &Console, check_results: &mut Vec<CheckResult>) {
18-
console.println("HTTP trackers ...");
15+
#[allow(clippy::missing_panics_doc)]
16+
pub async fn run(http_trackers: &Vec<ServiceUrl>, check_results: &mut Vec<CheckResult>) -> Vec<CheckerOutput> {
17+
let mut http_checkers: Vec<CheckerOutput> = Vec::new();
1918

2019
for http_tracker in http_trackers {
21-
let colored_tracker_url = http_tracker.to_string().yellow();
20+
let mut http_checker = CheckerOutput {
21+
url: http_tracker.to_string(),
22+
status: Status {
23+
code: String::new(),
24+
message: String::new(),
25+
},
26+
};
2227

2328
match check_http_announce(http_tracker).await {
2429
Ok(()) => {
2530
check_results.push(Ok(()));
26-
console.println(&format!("{} - Announce at {} is OK", "✓".green(), colored_tracker_url));
31+
http_checker.status.code = "ok".to_string();
2732
}
2833
Err(err) => {
2934
check_results.push(Err(err));
30-
console.println(&format!("{} - Announce at {} is failing", "✗".red(), colored_tracker_url));
35+
http_checker.status.code = "error".to_string();
36+
http_checker.status.message = "Announce is failing.".to_string();
3137
}
3238
}
3339

3440
match check_http_scrape(http_tracker).await {
3541
Ok(()) => {
3642
check_results.push(Ok(()));
37-
console.println(&format!("{} - Scrape at {} is OK", "✓".green(), colored_tracker_url));
43+
http_checker.status.code = "ok".to_string();
3844
}
3945
Err(err) => {
4046
check_results.push(Err(err));
41-
console.println(&format!("{} - Scrape at {} is failing", "✗".red(), colored_tracker_url));
47+
http_checker.status.code = "error".to_string();
48+
http_checker.status.message = "Scrape is failing.".to_string();
4249
}
4350
}
51+
http_checkers.push(http_checker);
4452
}
53+
http_checkers
4554
}
4655

4756
async fn check_http_announce(tracker_url: &Url) -> Result<(), CheckError> {
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
pub mod health;
22
pub mod http;
3+
pub mod structs;
34
pub mod udp;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use serde::{Deserialize, Serialize};
2+
3+
#[derive(Serialize, Deserialize)]
4+
pub struct Status {
5+
pub code: String,
6+
pub message: String,
7+
}
8+
#[derive(Serialize, Deserialize)]
9+
pub struct CheckerOutput {
10+
pub url: String,
11+
pub status: Status,
12+
}
+24-17
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,31 @@
11
use std::net::SocketAddr;
22

33
use aquatic_udp_protocol::{Port, TransactionId};
4-
use colored::Colorize;
54
use hex_literal::hex;
65
use log::debug;
76
use torrust_tracker_primitives::info_hash::InfoHash;
87

9-
use crate::console::clients::checker::console::Console;
10-
use crate::console::clients::checker::printer::Printer;
8+
use crate::console::clients::checker::checks::structs::{CheckerOutput, Status};
119
use crate::console::clients::checker::service::{CheckError, CheckResult};
1210
use crate::console::clients::udp::checker;
1311

1412
const ASSIGNED_BY_OS: u16 = 0;
1513
const RANDOM_TRANSACTION_ID: i32 = -888_840_697;
1614

17-
pub async fn run(udp_trackers: &Vec<SocketAddr>, console: &Console, check_results: &mut Vec<CheckResult>) {
18-
console.println("UDP trackers ...");
15+
#[allow(clippy::missing_panics_doc)]
16+
pub async fn run(udp_trackers: &Vec<SocketAddr>, check_results: &mut Vec<CheckResult>) -> Vec<CheckerOutput> {
17+
let mut udp_checkers: Vec<CheckerOutput> = Vec::new();
1918

2019
for udp_tracker in udp_trackers {
21-
debug!("UDP tracker: {:?}", udp_tracker);
20+
let mut checker_output = CheckerOutput {
21+
url: udp_tracker.to_string(),
22+
status: Status {
23+
code: String::new(),
24+
message: String::new(),
25+
},
26+
};
2227

23-
let colored_tracker_url = udp_tracker.to_string().yellow();
28+
debug!("UDP tracker: {:?}", udp_tracker);
2429

2530
let transaction_id = TransactionId(RANDOM_TRANSACTION_ID);
2631

@@ -32,7 +37,8 @@ pub async fn run(udp_trackers: &Vec<SocketAddr>, console: &Console, check_result
3237
check_results.push(Err(CheckError::UdpError {
3338
socket_addr: *udp_tracker,
3439
}));
35-
console.println(&format!("{} - Can't connect to socket {}", "✗".red(), colored_tracker_url));
40+
checker_output.status.code = "error".to_string();
41+
checker_output.status.message = "Can't connect to socket.".to_string();
3642
break;
3743
};
3844

@@ -42,11 +48,8 @@ pub async fn run(udp_trackers: &Vec<SocketAddr>, console: &Console, check_result
4248
check_results.push(Err(CheckError::UdpError {
4349
socket_addr: *udp_tracker,
4450
}));
45-
console.println(&format!(
46-
"{} - Can't make tracker connection request to {}",
47-
"✗".red(),
48-
colored_tracker_url
49-
));
51+
checker_output.status.code = "error".to_string();
52+
checker_output.status.message = "Can't make tracker connection request.".to_string();
5053
break;
5154
};
5255

@@ -60,13 +63,14 @@ pub async fn run(udp_trackers: &Vec<SocketAddr>, console: &Console, check_result
6063
.is_ok()
6164
{
6265
check_results.push(Ok(()));
63-
console.println(&format!("{} - Announce at {} is OK", "✓".green(), colored_tracker_url));
66+
checker_output.status.code = "ok".to_string();
6467
} else {
6568
let err = CheckError::UdpError {
6669
socket_addr: *udp_tracker,
6770
};
6871
check_results.push(Err(err));
69-
console.println(&format!("{} - Announce at {} is failing", "✗".red(), colored_tracker_url));
72+
checker_output.status.code = "error".to_string();
73+
checker_output.status.message = "Announce is failing.".to_string();
7074
}
7175

7276
debug!("Send scrape request");
@@ -75,13 +79,16 @@ pub async fn run(udp_trackers: &Vec<SocketAddr>, console: &Console, check_result
7579

7680
if (client.send_scrape_request(connection_id, transaction_id, info_hashes).await).is_ok() {
7781
check_results.push(Ok(()));
78-
console.println(&format!("{} - Announce at {} is OK", "✓".green(), colored_tracker_url));
82+
checker_output.status.code = "ok".to_string();
7983
} else {
8084
let err = CheckError::UdpError {
8185
socket_addr: *udp_tracker,
8286
};
8387
check_results.push(Err(err));
84-
console.println(&format!("{} - Announce at {} is failing", "✗".red(), colored_tracker_url));
88+
checker_output.status.code = "error".to_string();
89+
checker_output.status.message = "Scrape is failing.".to_string();
8590
}
91+
udp_checkers.push(checker_output);
8692
}
93+
udp_checkers
8794
}

src/console/clients/checker/service.rs

+9-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::sync::Arc;
33

44
use reqwest::Url;
55

6-
use super::checks;
6+
use super::checks::{self};
77
use super::config::Configuration;
88
use super::console::Console;
99
use crate::console::clients::checker::printer::Printer;
@@ -26,16 +26,19 @@ impl Service {
2626
/// # Errors
2727
///
2828
/// Will return OK is all checks pass or an array with the check errors.
29+
#[allow(clippy::missing_panics_doc)]
2930
pub async fn run_checks(&self) -> Vec<CheckResult> {
30-
self.console.println("Running checks for trackers ...");
31-
3231
let mut check_results = vec![];
3332

34-
checks::udp::run(&self.config.udp_trackers, &self.console, &mut check_results).await;
33+
let udp_checkers = checks::udp::run(&self.config.udp_trackers, &mut check_results).await;
34+
35+
let http_checkers = checks::http::run(&self.config.http_trackers, &mut check_results).await;
3536

36-
checks::http::run(&self.config.http_trackers, &self.console, &mut check_results).await;
37+
let health_checkers = checks::health::run(&self.config.health_checks, &mut check_results).await;
3738

38-
checks::health::run(&self.config.health_checks, &self.console, &mut check_results).await;
39+
let json_output =
40+
serde_json::json!({ "udp_trackers": udp_checkers, "http_trackers": http_checkers, "health_checks": health_checkers });
41+
self.console.println(&serde_json::to_string_pretty(&json_output).unwrap());
3942

4043
check_results
4144
}

0 commit comments

Comments
 (0)