1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#![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(())
}