From 42f80177ea62ca781cf6dfaed047e13d04c9041f Mon Sep 17 00:00:00 2001 From: yggverse Date: Sat, 16 Aug 2025 18:55:25 +0300 Subject: [PATCH] collect crawl status for entries found, print totals --- src/main.rs | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/src/main.rs b/src/main.rs index 57cc8b1..83526bd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ use anyhow::Result; use colored::*; use config::Config; use std::{ + collections::HashMap, net::{IpAddr, SocketAddr, TcpStream}, time::Duration, }; @@ -24,13 +25,13 @@ fn main() -> Result<()> { let mut ygg = Yggdrasil::init(&config.socket)?; let mut key: Vec = Vec::with_capacity(config.index_capacity); let mut tcp = if config.tcp { - Some(Vec::with_capacity(config.index_capacity)) + Some(HashMap::with_capacity(config.index_capacity)) } else { None }; let mut udp = config.udp.as_ref().map(|bind| { let server = Udp::init(bind).unwrap(); - let index = Vec::with_capacity(config.index_capacity); + let index = HashMap::with_capacity(config.index_capacity); (index, server) }); println!("crawler started..."); @@ -48,6 +49,20 @@ fn main() -> Result<()> { } 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(()) } @@ -56,8 +71,8 @@ fn crawl( config: &Config, ygg: &mut Yggdrasil, key: &mut Vec, - tcp: &mut Option>, - udp: &mut Option<(Vec, Udp)>, + tcp: &mut Option>, + udp: &mut Option<(HashMap, Udp)>, ) -> Result<()> { if key.contains(&k) { return Ok(()); @@ -73,26 +88,29 @@ fn crawl( for port in &config.port { let address = SocketAddr::new(IpAddr::V6(host), *port); if let Some(index) = tcp - && !index.contains(&address) + && !index.contains_key(&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()) } else if config.debug { 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}"); - if !index.contains(&address) { - if server.check(address) { - println!("\t{}: {url}", SUCCESS.green()) - } else if config.debug { - println!("\t{}: {url}", FAILURE.red()) - } - index.push(address) + let result = server.check(address); + if result { + println!("\t{}: {url}", SUCCESS.green()) + } else if config.debug { + println!("\t{}: {url}", FAILURE.red()) } + assert!(index.insert(address, result).is_none()) } } for k in peers.keys {