-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
decc567
commit 9b64e17
Showing
8 changed files
with
478 additions
and
1,200 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
mod device_selector; | ||
mod file_selector; | ||
pub mod start_interface; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
use pcap::{ConnectionStatus, Device, IfFlags}; | ||
use std::io::stdin; | ||
use std::net::IpAddr; | ||
use std::thread::sleep; | ||
use std::time::Duration; | ||
|
||
pub(crate) fn select_device() -> String { | ||
loop { | ||
list_devices(); | ||
println!("Enter the name of the chosen device:"); | ||
let mut chosen_name = String::new(); | ||
stdin() | ||
.read_line(&mut chosen_name) | ||
.expect("Failed to read line"); | ||
let chosen_name = chosen_name.trim().to_string(); | ||
|
||
if Device::list() | ||
.expect("Error listing devices") | ||
.iter() | ||
.any(|dev| dev.name == chosen_name) | ||
{ | ||
return chosen_name; | ||
} else { | ||
println!("\nError: Invalid device name. Please choose a valid device.\n"); | ||
sleep(Duration::new(1, 0)) | ||
} | ||
} | ||
} | ||
|
||
fn list_devices() { | ||
println!("Available network devices:"); | ||
let devices = Device::list().expect("Error listing devices"); | ||
for device in devices { | ||
println!("Name: {}", device.name); | ||
println!("Description: {}", device.desc.unwrap_or("N/A".to_string())); | ||
println!( | ||
"Addresses: {}", | ||
if device.addresses.is_empty() { | ||
"N/A" | ||
} else { | ||
"" | ||
} | ||
); | ||
for address in &device.addresses { | ||
println!(" Address: {}", format_ip_addr(&address.addr)); | ||
println!(" Netmask: {}", format_optional_ip(&address.netmask)); | ||
println!( | ||
" Broadcast: {}", | ||
format_optional_ip(&address.broadcast_addr) | ||
); | ||
println!(" Destination: {}\n", format_optional_ip(&address.dst_addr)); | ||
} | ||
|
||
println!("Flags: {}", format_flags(device.flags.if_flags)); | ||
println!( | ||
"Connection status: {}", | ||
format_connection_status(device.flags.connection_status) | ||
); | ||
println!("--------------------------------------\n"); | ||
} | ||
} | ||
|
||
fn format_flags(flags: IfFlags) -> String { | ||
let mut result = Vec::new(); | ||
|
||
if flags.contains(IfFlags::LOOPBACK) { | ||
result.push("LOOPBACK"); | ||
} | ||
if flags.contains(IfFlags::UP) { | ||
result.push("UP"); | ||
} | ||
if flags.contains(IfFlags::RUNNING) { | ||
result.push("RUNNING"); | ||
} | ||
if flags.contains(IfFlags::WIRELESS) { | ||
result.push("WIRELESS"); | ||
} | ||
|
||
if result.is_empty() { | ||
result.push("N/A") | ||
} | ||
result.join(" | ") | ||
} | ||
|
||
fn format_connection_status(status: ConnectionStatus) -> String { | ||
match status { | ||
ConnectionStatus::Unknown => "Unknown".to_string(), | ||
ConnectionStatus::Connected => "Connected".to_string(), | ||
ConnectionStatus::Disconnected => "Disconnected".to_string(), | ||
ConnectionStatus::NotApplicable => "N/A".to_string(), | ||
} | ||
} | ||
|
||
fn format_ip_addr(ip: &IpAddr) -> String { | ||
match ip { | ||
IpAddr::V4(ipv4) => ipv4.to_string(), | ||
IpAddr::V6(ipv6) => ipv6.to_string(), | ||
} | ||
} | ||
|
||
fn format_optional_ip(ip: &Option<IpAddr>) -> String { | ||
ip.as_ref() | ||
.map_or("None".to_string(), |addr| format_ip_addr(addr)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
pub(crate) fn show_pick_file_dialog() -> String { | ||
loop { | ||
if let Some(path_buf) = rfd::FileDialog::new().pick_file() { | ||
if let Some(file_path) = path_buf.to_str() { | ||
return file_path.to_string(); | ||
} else { | ||
println!("Invalid file path. Please try again."); | ||
} | ||
} else { | ||
println!("Error showing file dialog. Please try again."); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
use crate::command_line_interface::device_selector::select_device; | ||
use crate::command_line_interface::file_selector::show_pick_file_dialog; | ||
use crate::command_line_interface::start_interface::Action::{AnalyzeFile, CapturePackets}; | ||
use std::io::stdin; | ||
|
||
pub enum Action { | ||
CapturePackets(String), | ||
AnalyzeFile(String), | ||
} | ||
|
||
pub fn command_line_interface() -> Action { | ||
let selected_action; | ||
loop { | ||
println!("Welcome to the rtpeeker!"); | ||
println!("Please choose an option:"); | ||
println!("A) Capture packets from a network interface"); | ||
println!("B) Analyze packets from a file"); | ||
|
||
let choice = read_line(); | ||
|
||
if choice == "A" { | ||
let device = select_device(); | ||
selected_action = CapturePackets(device); | ||
break; | ||
} else if choice == "B" { | ||
let path = show_pick_file_dialog(); | ||
selected_action = AnalyzeFile(path); | ||
break; | ||
} else { | ||
println!("Invalid choice.\n"); | ||
} | ||
} | ||
selected_action | ||
} | ||
|
||
fn read_line() -> String { | ||
let mut choice = String::new(); | ||
stdin().read_line(&mut choice).expect("Failed to read line"); | ||
let choice = choice.trim().to_uppercase(); | ||
choice | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
pub mod command_line_interface; | ||
pub mod sniffer; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters