use std::process::Command;
fn ip_command_exists() -> bool {
Command::new("ip")
.arg("-V")
.output()
.is_ok_and(|output| output.status.success())
}
pub fn get_network_interface_and_user_ip() -> Option<(String, String)> {
if let Ok(output) = Command::new("ip")
.args(["route", "get", "8.8.8.8"])
.output()
{
let mut interface = String::new();
let mut user_ip = String::new();
let text = String::from_utf8_lossy(&output.stdout);
let mut words = text.split_whitespace();
while let Some(word) = words.next() {
if word == "dev"
&& let Some(v1) = words.next()
{
interface = v1.to_string();
} else if word == "src"
&& let Some(v2) = words.next()
{
user_ip = v2.to_string();
}
}
return Some((interface, user_ip));
}
None
}
pub fn get_local_ip() -> Option<String> {
if let Ok(output) = Command::new("ip")
.args(["route", "get", "8.8.8.8"])
.output()
{
let text = String::from_utf8_lossy(&output.stdout);
let mut words = text.split_whitespace();
while let Some(word) = words.next() {
if word == "src" {
let ip = words.next();
return ip.map(|ip| ip.to_string());
}
}
}
None
}
fn get_broadcast_addr(interface: &str) -> Option<String> {
if let Ok(output) = Command::new("ip")
.args(["address", "show", interface])
.output()
{
let text = String::from_utf8_lossy(&output.stdout);
for line in text.lines() {
let mut words = line.split_whitespace();
while let Some(w1) = words.next() {
if w1 == "inet" {
while let Some(w2) = words.next() {
if w2 == "brd" {
return words.next().map(str::to_string);
}
}
}
}
}
}
None
}