rsubdomain 1.2.13

A high-performance subdomain brute-force tool written in Rust
Documentation
mod listing;
mod probing;
mod selection;

use std::net::Ipv4Addr;
use std::str::FromStr;

pub use listing::{list_network_devices, print_network_devices, NetworkDevice};
pub use selection::{
    auto_get_devices, auto_get_devices_for_dns, get_device_by_name, get_device_by_name_for_dns,
};

const DEFAULT_DNS_PROBE_TARGETS: &[&str] = &[
    "223.5.5.5",
    "223.6.6.6",
    "119.29.29.29",
    "114.114.114.114",
    "8.8.8.8",
];

#[derive(Debug, Clone)]
pub(crate) struct RouteResolution {
    pub interface: Option<String>,
    pub gateway: Option<Ipv4Addr>,
}

pub(super) fn choose_probe_target(dns_servers: &[String]) -> Option<Ipv4Addr> {
    for server in dns_servers {
        if let Ok(ip) = Ipv4Addr::from_str(server.trim()) {
            return Some(ip);
        }
    }

    DEFAULT_DNS_PROBE_TARGETS
        .iter()
        .find_map(|value| Ipv4Addr::from_str(value).ok())
}

pub(super) fn parse_mac_addr(value: &str) -> Option<pnet::util::MacAddr> {
    let normalized = value.trim().replace('-', ":");
    let parts: Vec<&str> = normalized.split(':').collect();
    if parts.len() != 6 {
        return None;
    }

    let mut octets = [0u8; 6];
    for (index, part) in parts.iter().enumerate() {
        octets[index] = u8::from_str_radix(part, 16).ok()?;
    }

    Some(pnet::util::MacAddr::new(
        octets[0], octets[1], octets[2], octets[3], octets[4], octets[5],
    ))
}