From 663307be63425e9c88928d26f12fab701c7e43bc Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Thu, 21 Aug 2025 12:49:14 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20=C3=9Cberarbeitet=20`get=5Fip=5Ffrom=5Fm?= =?UTF-8?q?ac`,=20verbessert=20MAC-Normalisierung=20und=20IP-Erkennung.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/network/utils.rs | 64 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/src/network/utils.rs b/src/network/utils.rs index 4b5c94f..a77d063 100644 --- a/src/network/utils.rs +++ b/src/network/utils.rs @@ -113,18 +113,66 @@ pub fn get_ip_from_mac(mac: &str, network: &str) -> Option { let stdout = String::from_utf8_lossy(&out.stdout); log("network_utils", &*stdout, LogLevel::Debug); - for line in stdout.lines() { - if line.contains("Nmap scan report for") { - let ip_line = line; - log("network_utils", &*ip_line, LogLevel::Debug); - if let Some(next_line) = stdout.lines().find(|l| l.to_lowercase().contains(mac)) { - log("network_utils", &*next_line, LogLevel::Debug); - if let Some(ip) = ip_line.split_whitespace().last() { - return Some(ip.to_string()); + // MAC normalisieren: nur Hex-Zeichen, klein, ohne Trennzeichen + let normalize_mac = |m: &str| -> String { + m.chars() + .filter(|c| c.is_ascii_hexdigit()) + .flat_map(|c| c.to_lowercase()) + .collect::() + }; + let target_mac = normalize_mac(mac); + + // Beispielausgaben: + // Nmap scan report for 192.168.0.10 + // Nmap scan report for printer.lan (192.168.0.10) + // MAC Address: 00:11:22:33:44:55 (Vendor) + // + // Strategie: + // - Merke die zuletzt gesehene IP aus "Nmap scan report for ..." + // - Wenn danach eine "MAC Address:"-Zeile folgt und MAC passt -> gib IP zurück + let mut current_ip: Option = None; + + for raw_line in stdout.lines() { + let line = raw_line.trim(); + + if line.starts_with("Nmap scan report for") { + // Versuche IP zu extrahieren: + // 1) Klammerform: ... (x.x.x.x) + // 2) Sonst letztes Token als IP + let ip = if let Some(start) = line.rfind('(') { + if let Some(end) = line.rfind(')') { + let in_parens = &line[start + 1..end]; + Some(in_parens.to_string()) + } else { + None + } + } else { + line.split_whitespace() + .last() + .map(|s| s.to_string()) + }; + + // Grobe Validierung IPv4 + if let Some(ip_str) = ip { + let maybe_ip = ip_str.parse::().ok().map(|ip| ip.to_string()); + current_ip = maybe_ip; + } else { + current_ip = None; + } + } else if line.starts_with("MAC Address:") { + // Format: "MAC Address: XX:XX:XX:XX:XX:XX (Vendor)" + let mac_part = line.strip_prefix("MAC Address:").unwrap().trim(); + let mac_token = mac_part.split_whitespace().next().unwrap_or(""); + let seen_mac = normalize_mac(mac_token); + + if !seen_mac.is_empty() && seen_mac == target_mac { + if let Some(ip) = current_ip.clone() { + return Some(ip); } } } } + None } Err(e) => {