Skip to content

Commit bede15d

Browse files
committed
feat(scanner): add cancel token from task manager
1 parent 1c6f14e commit bede15d

2 files changed

Lines changed: 43 additions & 8 deletions

File tree

src/scanning/crawler.rs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,32 @@ use crate::scanning::scanner::{scan, ScanConfig};
1212
use crate::scanning::utils::{format_time, prettier_ping_result, save_server};
1313

1414
pub async fn crawl(gen_config: IpGenerator) {
15-
let _ = TaskManager::spawn("Crawler", move |_cancel_token| async move {
15+
let _ = TaskManager::spawn("Crawler", move |cancel_token| async move {
1616
loop {
17+
if cancel_token.is_cancelled() {
18+
logger::warning("Crawler shutting down...".to_string())
19+
.prefix("Crawler").send().await;
20+
break;
21+
}
22+
1723
let start_time = Instant::now();
1824

1925
let ports = vec![25565]; // Example for later implementation
2026
let targets: Vec<(Ipv4Addr, u16)> = gen_config.generate()
27+
.take_while(|_| {
28+
let cancelled = cancel_token.is_cancelled();
29+
async move { !cancelled }
30+
})
2131
.flat_map(|ip| {
2232
stream::iter(ports.clone().into_iter().map(move |port| (ip, port)))
2333
})
2434
.collect()
2535
.await;
2636

37+
if cancel_token.is_cancelled() && targets.is_empty() {
38+
break;
39+
}
40+
2741
let total_targets = targets.len();
2842
let mut found_batch: Vec<(ServerInfo, ServerHistory)> = Vec::new();
2943

@@ -54,6 +68,12 @@ pub async fn crawl(gen_config: IpGenerator) {
5468
while let Some(maybe_result) = scan_stream.next().await {
5569
processed_count += 1;
5670

71+
if cancel_token.is_cancelled() {
72+
logger::warning("Scan interrupted. Saving results...".to_string())
73+
.prefix("Crawler").send().await;
74+
break;
75+
}
76+
5777
// Success
5878
if let Some(result) = maybe_result {
5979
let parsed = parse_server(result.ip, result.port, result.ping.clone(), result.query, result.join);
@@ -70,12 +90,11 @@ pub async fn crawl(gen_config: IpGenerator) {
7090
);
7191
output.push_str(&prettier_ping_result(result.ping).await);
7292
logger::success(output).prefix("Crawler").send().await;
73-
}
7493

75-
// Database insert
76-
if processed_count % 10000 == 0 {
77-
let batch_to_insert = std::mem::take(&mut found_batch);
78-
save_server(&batch_to_insert).await;
94+
if found_batch.len() >= 30 {
95+
let batch_to_insert = std::mem::take(&mut found_batch);
96+
save_server(&batch_to_insert).await;
97+
}
7998
}
8099

81100
// Progress calc
@@ -103,6 +122,10 @@ pub async fn crawl(gen_config: IpGenerator) {
103122
save_server(&found_batch).await;
104123
}
105124

125+
if cancel_token.is_cancelled() {
126+
break;
127+
}
128+
106129
// Finished
107130
let elapsed_time = start_time.elapsed();
108131

src/scanning/file_scanner.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::scanning::utils::{count_lines_fast, format_time, prettier_ping_result
1515

1616
// TODO: Make a live stream from the file to scanner, because its more RAM efficient
1717
pub async fn scan_file(path: String) {
18-
let _ = TaskManager::spawn("File Scanner", move |_cancel_token| async move {
18+
let _ = TaskManager::spawn("File Scanner", move |cancel_token| async move {
1919
let file = match File::open(&path).await {
2020
Ok(f) => f,
2121
Err(e) => {
@@ -43,6 +43,12 @@ pub async fn scan_file(path: String) {
4343

4444
// Read file
4545
while let Ok(Some(line)) = lines.next_line().await {
46+
if cancel_token.is_cancelled() {
47+
logger::warning("File reading interrupted.".to_string())
48+
.prefix("File Scanner").send().await;
49+
return;
50+
}
51+
4652
let line = line.trim();
4753
// Skip comments
4854
if line.is_empty() || line.starts_with('#') { continue; }
@@ -86,6 +92,12 @@ pub async fn scan_file(path: String) {
8692

8793
// Scan stream
8894
while let Some(maybe_result) = scan_stream.next().await {
95+
if cancel_token.is_cancelled() {
96+
logger::warning("Scan interrupted. Saving results...".to_string())
97+
.prefix("File Scanner").send().await;
98+
break;
99+
}
100+
89101
processed_count += 1;
90102

91103
// Success
@@ -105,7 +117,7 @@ pub async fn scan_file(path: String) {
105117
output.push_str(&prettier_ping_result(result.ping).await);
106118
logger::success(output).prefix("File Scanner").send().await;
107119

108-
if found_batch.len() >= 50 {
120+
if found_batch.len() >= 30 {
109121
let batch_to_insert = std::mem::take(&mut found_batch);
110122
save_server(&batch_to_insert).await;
111123
}

0 commit comments

Comments
 (0)