network_toolset 0.1.0

A comprehensive network diagnostic toolset implemented in Rust
Documentation
#![allow(warnings)]
use clap::{Parser, Subcommand};
use anyhow::Result;

mod common;
mod ping;
mod traceroute;
mod arp_scan;
mod mtu_discover;

#[derive(Parser)]
#[command(name = "network_toolset")]
#[command(about = "A comprehensive network diagnostic toolset implemented in Rust")]
#[command(version = "0.1.0")]
struct Cli {
    #[command(subcommand)]
    command: Commands,
}

#[derive(Subcommand)]
enum Commands {
    /// Send enhanced TCP connectivity tests with automatic multi-port discovery
    Ping {
        /// Target host IP address or hostname
        target: String,
        /// Number of packets to send (default: 4)
        #[arg(short, long, default_value = "4")]
        count: u32,
        /// Time to wait for a response in seconds (default: 1)
        #[arg(short, long, default_value = "1")]
        timeout: u64,
        /// Interval between packets in seconds (default: 1)
        #[arg(short, long, default_value = "1")]
        interval: u64,
        /// Packet size in bytes (default: 32)
        #[arg(short = 's', long, default_value = "32")]
        size: usize,
    },
    /// Trace the network path to a target host using enhanced simulation
    Traceroute {
        /// Target host IP address or hostname
        target: String,
        /// Maximum number of hops (default: 30)
        #[arg(short, long, default_value = "30")]
        max_hops: u32,
        /// Time to wait for a response in seconds (default: 3)
        #[arg(short, long, default_value = "3")]
        timeout: u64,
        /// Starting port number for UDP probes (default: 33434)
        #[arg(short, long, default_value = "33434")]
        start_port: u16,
    },
    /// Scan local network for active hosts using enhanced multi-port TCP scanning
    ArpScan {
        /// Network interface (e.g., eth0, wlan0), "list-interfaces" to show available interfaces, or "any" for interface listing
        interface: String,
        /// Network range in CIDR notation (e.g., 192.168.1.0/24) or "list-ranges" to show common ranges
        network: String,
        /// Timeout between TCP connection attempts in milliseconds (default: 10)
        #[arg(short, long, default_value = "10")]
        timeout: u64,
    },
    /// Discover the Path MTU to a target host
    MtuDiscover {
        /// Target host IP address or hostname
        target: String,
        /// Starting MTU size (default: 1500)
        #[arg(short, long, default_value = "1500")]
        start_mtu: u16,
        /// Maximum number of probes (default: 10)
        #[arg(short, long, default_value = "10")]
        max_probes: u32,
    },
}

fn main() -> Result<()> {
    let cli = Cli::parse();

    // Check for root/admin privileges for raw socket operations
    if !common::utils::check_admin_privileges() {
        eprintln!("Error: This program requires administrator/root privileges to create raw sockets.");
        eprintln!("Please run with administrator privileges.");
        std::process::exit(1);
    }

    match cli.command {
        Commands::Ping { target, count, timeout, interval, size } => {
            ping::ping::run_ping(&target, count, timeout, interval, size)?;
        }
        Commands::Traceroute { target, max_hops, timeout, start_port } => {
            traceroute::traceroute::run_traceroute(&target, max_hops, timeout, start_port)?;
        }
        Commands::ArpScan { interface, network, timeout } => {
            arp_scan::arp_scan::run_arp_scan(&interface, &network, timeout)?;
        }
        Commands::MtuDiscover { target, start_mtu, max_probes } => {
            mtu_discover::mtu_discover::run_mtu_discover(&target, start_mtu, max_probes)?;
        }
    }

    Ok(())
}