From 12db4f51783022f761956f1b07b31abe0109d3e0 Mon Sep 17 00:00:00 2001 From: Smittix Date: Wed, 21 Jan 2026 23:27:05 +0000 Subject: [PATCH] Auto-detect monitor mode and use deep scan in TSCM WiFi scanning When a monitor mode interface (e.g., wlan0mon) is detected, automatically use airodump-ng deep scan instead of quick scan which doesn't work with monitor mode interfaces. Co-Authored-By: Claude Opus 4.5 --- routes/tscm.py | 54 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/routes/tscm.py b/routes/tscm.py index 56dce52..6b0f58f 100644 --- a/routes/tscm.py +++ b/routes/tscm.py @@ -642,6 +642,9 @@ def _scan_wifi_networks(interface: str) -> list[dict]: This is a facade that maintains backwards compatibility with TSCM while using the new unified scanner module. + Automatically detects monitor mode interfaces and uses deep scan + (airodump-ng) when appropriate. + Args: interface: WiFi interface name (optional). @@ -652,18 +655,51 @@ def _scan_wifi_networks(interface: str) -> list[dict]: from utils.wifi import get_wifi_scanner scanner = get_wifi_scanner() - result = scanner.quick_scan(interface=interface, timeout=15) - if result.error: - logger.warning(f"WiFi scan error: {result.error}") + # Check if interface is in monitor mode + is_monitor = False + if interface: + is_monitor = scanner._is_monitor_mode_interface(interface) - # Convert to legacy format for TSCM - networks = [] - for ap in result.access_points: - networks.append(ap.to_legacy_dict()) + if is_monitor: + # Use deep scan for monitor mode interfaces + logger.info(f"Interface {interface} is in monitor mode, using deep scan") - logger.info(f"WiFi scan found {len(networks)} networks") - return networks + # Check if airodump-ng is available + caps = scanner.check_capabilities() + if not caps.has_airodump_ng: + logger.warning("airodump-ng not available for monitor mode scanning") + return [] + + # Start a short deep scan + if not scanner.is_scanning: + scanner.start_deep_scan(interface=interface, band='all') + + # Wait briefly for some results + import time + time.sleep(5) + + # Get current access points + networks = [] + for ap in scanner.access_points: + networks.append(ap.to_legacy_dict()) + + logger.info(f"WiFi deep scan found {len(networks)} networks") + return networks + else: + # Use quick scan for managed mode interfaces + result = scanner.quick_scan(interface=interface, timeout=15) + + if result.error: + logger.warning(f"WiFi scan error: {result.error}") + + # Convert to legacy format for TSCM + networks = [] + for ap in result.access_points: + networks.append(ap.to_legacy_dict()) + + logger.info(f"WiFi scan found {len(networks)} networks") + return networks except ImportError as e: logger.error(f"Failed to import wifi scanner: {e}")