diff --git a/src/config.rs b/src/config.rs index cf57885..94d9420 100644 --- a/src/config.rs +++ b/src/config.rs @@ -54,18 +54,20 @@ pub struct Config { #[arg(long, short, default_value_t = 8000)] pub port: u16, - /// Bind local UDP client for `scrape_udp_server` + /// Bind local UDP socket on given address /// - /// * not in use if the `scrape_udp_server` is not set + /// * the default UDP server is not in use without the optional `scrape` argument value #[arg(long, default_values_t = vec![ SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 0)), SocketAddr::V6(SocketAddrV6::new(Ipv6Addr::UNSPECIFIED, 0, 0, 0)) ])] - pub scrape_udp_client: Vec, + pub udp: Vec, - /// Scrape given UDP trackers to display peers/seeders/leechers info + /// Scrape given trackers (to display peers/seeders/leechers info) + /// + /// * supports multi-stack IPv4/IPv6 trackers #[arg(long)] - pub scrape_udp_server: Option>, + pub scrape: Option>, /// Configure instance in the debug mode #[arg(long, default_value_t = false)] diff --git a/src/main.rs b/src/main.rs index d6f442d..51901e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -121,8 +121,31 @@ fn rocket() -> _ { ); let scraper = Scraper::init( config - .scrape_udp_server - .map(|s| (config.scrape_udp_client, s)), + .scrape + .map(|u| { + u.into_iter() + .map(|url| { + use std::str::FromStr; + if url.scheme() == "tcp" { + todo!("TCP scrape is not implemented") + } + if url.scheme() != "udp" { + todo!("Scheme `{}` is not supported", url.scheme()) + } + std::net::SocketAddr::new( + std::net::IpAddr::from_str( + url.host_str() + .expect("Required valid host value") + .trim_start_matches('[') + .trim_end_matches(']'), + ) + .unwrap(), + url.port().expect("Required valid port value"), + ) + }) + .collect() + }) + .map(|a| (config.udp, a)), ); let storage = Storage::init(config.preload, config.list_limit, config.capacity).unwrap(); // @TODO handle rocket::build()