collect crawl status for entries found, print totals

This commit is contained in:
yggverse 2025-08-16 18:55:25 +03:00
parent 0aa60d6580
commit 42f80177ea

View file

@ -6,6 +6,7 @@ use anyhow::Result;
use colored::*; use colored::*;
use config::Config; use config::Config;
use std::{ use std::{
collections::HashMap,
net::{IpAddr, SocketAddr, TcpStream}, net::{IpAddr, SocketAddr, TcpStream},
time::Duration, time::Duration,
}; };
@ -24,13 +25,13 @@ fn main() -> Result<()> {
let mut ygg = Yggdrasil::init(&config.socket)?; let mut ygg = Yggdrasil::init(&config.socket)?;
let mut key: Vec<String> = Vec::with_capacity(config.index_capacity); let mut key: Vec<String> = Vec::with_capacity(config.index_capacity);
let mut tcp = if config.tcp { let mut tcp = if config.tcp {
Some(Vec::with_capacity(config.index_capacity)) Some(HashMap::with_capacity(config.index_capacity))
} else { } else {
None None
}; };
let mut udp = config.udp.as_ref().map(|bind| { let mut udp = config.udp.as_ref().map(|bind| {
let server = Udp::init(bind).unwrap(); let server = Udp::init(bind).unwrap();
let index = Vec::with_capacity(config.index_capacity); let index = HashMap::with_capacity(config.index_capacity);
(index, server) (index, server)
}); });
println!("crawler started..."); println!("crawler started...");
@ -48,6 +49,20 @@ fn main() -> Result<()> {
} }
None => println!("node has no peers to connect."), None => println!("node has no peers to connect."),
} }
println!("operation completed!");
if !key.is_empty() {
println!("\tkeys crawled: {}", key.len());
}
if let Some(tcp) = tcp {
println!("\tTCP: {}", tcp.len());
println!("\t\tfound: {}", tcp.values().filter(|v| **v).count());
println!("\t\ttotal: {}", tcp.len());
}
if let Some((udp, _)) = udp {
println!("\tUDP: {}", udp.len());
println!("\t\tfound: {}", udp.values().filter(|v| **v).count());
println!("\t\ttotal: {}", udp.len());
}
Ok(()) Ok(())
} }
@ -56,8 +71,8 @@ fn crawl(
config: &Config, config: &Config,
ygg: &mut Yggdrasil, ygg: &mut Yggdrasil,
key: &mut Vec<String>, key: &mut Vec<String>,
tcp: &mut Option<Vec<SocketAddr>>, tcp: &mut Option<HashMap<SocketAddr, bool>>,
udp: &mut Option<(Vec<SocketAddr>, Udp)>, udp: &mut Option<(HashMap<SocketAddr, bool>, Udp)>,
) -> Result<()> { ) -> Result<()> {
if key.contains(&k) { if key.contains(&k) {
return Ok(()); return Ok(());
@ -73,26 +88,29 @@ fn crawl(
for port in &config.port { for port in &config.port {
let address = SocketAddr::new(IpAddr::V6(host), *port); let address = SocketAddr::new(IpAddr::V6(host), *port);
if let Some(index) = tcp if let Some(index) = tcp
&& !index.contains(&address) && !index.contains_key(&address)
{ {
let url = format!("tcp://{address}"); let url = format!("tcp://{address}");
if TcpStream::connect_timeout(&address, Duration::from_secs(1)).is_ok() { let result =
TcpStream::connect_timeout(&address, Duration::from_secs(1)).is_ok();
if result {
println!("\t{}: {url}", SUCCESS.green()) println!("\t{}: {url}", SUCCESS.green())
} else if config.debug { } else if config.debug {
println!("\t{}: {url}", FAILURE.red()) println!("\t{}: {url}", FAILURE.red())
} }
index.push(address) assert!(index.insert(address, result).is_none())
} }
if let Some((index, server)) = udp { if let Some((index, server)) = udp
&& !index.contains_key(&address)
{
let url = format!("udp://{address}"); let url = format!("udp://{address}");
if !index.contains(&address) { let result = server.check(address);
if server.check(address) { if result {
println!("\t{}: {url}", SUCCESS.green()) println!("\t{}: {url}", SUCCESS.green())
} else if config.debug { } else if config.debug {
println!("\t{}: {url}", FAILURE.red()) println!("\t{}: {url}", FAILURE.red())
} }
index.push(address) assert!(index.insert(address, result).is_none())
}
} }
} }
for k in peers.keys { for k in peers.keys {