diff --git a/listener.py b/listener.py index 3f431d4..1f2a13a 100755 --- a/listener.py +++ b/listener.py @@ -258,16 +258,28 @@ def channel_hopper(interface, hop_interval): def is_deadpoint(ap_bssid): return sum(ap_clients[ap_bssid].values()) < 2 # No meaningful client interaction -def wait_for_interface_up(iface, timeout=5): - print(f"[~] Waiting for interface {iface} to become available...") - for _ in range(timeout * 10): # check every 0.1s for `timeout` seconds - if iface in psutil.net_if_stats(): - print(f"[+] Interface {iface} is up!") - return True - time.sleep(0.1) - print(f"[!] Interface {iface} did not become available in {timeout} seconds.") +def wait_for_interface_up(interface, timeout=5): + import shutil + import time + + for _ in range(timeout * 5): + result = shutil.which("iw") # Just checking iw exists first + if not result: + print("[!] 'iw' not found.") + return False + + try: + info = subprocess.check_output(["iw", "dev"]).decode() + if f"Interface {interface}" in info: + if "type monitor" in info: + return True + except subprocess.CalledProcessError: + pass + time.sleep(0.2) + print(f"[!] Timeout waiting for interface {interface} to be up and in monitor mode.") return False + # === Main === def main(): parser = ArgumentParser() @@ -284,8 +296,10 @@ def main(): reset_interface(args.monitor_iface) if not wait_for_interface_up(args.monitor_iface): + print("[!] Interface failed to become available. Exiting.") sys.exit(1) + print(f"[+] Starting passive observer.") print(f" Main interface: {args.main_iface}") print(f" Monitor interface: {args.monitor_iface}") @@ -340,6 +354,7 @@ def main(): reset_interface(args.monitor_iface) if not wait_for_interface_up(args.monitor_iface): + print("[!] Interface failed to become available. Exiting.") sys.exit(1) def get_mac_vendor(mac):