List files in a directory for file management
()
| 15986 | if secondary: |
| 15987 | # Put secondary adapter directly into monitor mode |
| 15988 | subprocess.run(['sudo', 'ip', 'link', 'set', secondary, 'down'], |
| 15989 | capture_output=True, timeout=3) |
| 15990 | r = subprocess.run( |
| 15991 | ['sudo', 'iw', 'dev', secondary, 'set', 'type', 'monitor'], |
| 15992 | capture_output=True, timeout=5 |
| 15993 | ) |
| 15994 | if r.returncode == 0: |
| 15995 | subprocess.run(['sudo', 'ip', 'link', 'set', secondary, 'up'], |
| 15996 | capture_output=True, timeout=3) |
| 15997 | capture_iface = secondary |
| 15998 | restore_secondary = secondary |
| 15999 | _monitor_mode_used[0] = True |
| 16000 | |
| 16001 | if not capture_iface: |
| 16002 | # Try virtual monitor on primary (won't work on Broadcom) |
| 16003 | subprocess.run(['sudo', 'iw', 'dev', _mon, 'del'], |
| 16004 | capture_output=True, timeout=3) |
| 16005 | r = subprocess.run( |
| 16006 | ['sudo', 'iw', 'dev', iface, 'interface', 'add', |
| 16007 | _mon, 'type', 'monitor'], |
| 16008 | capture_output=True, timeout=5 |
| 16009 | ) |
| 16010 | if r.returncode == 0: |
| 16011 | subprocess.run(['sudo', 'ip', 'link', 'set', _mon, 'up'], |
| 16012 | capture_output=True, timeout=5) |
| 16013 | capture_iface = _mon |
| 16014 | _monitor_mode_used[0] = True |
| 16015 | |
| 16016 | if not capture_iface: |
| 16017 | # Final fallback: iw event — only sees deauth on own connection |
| 16018 | proc = subprocess.Popen( |
| 16019 | ['sudo', 'iw', 'event', '-t'], |
| 16020 | stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True |
| 16021 | ) |
| 16022 | _time.sleep(3) |
| 16023 | proc.terminate() |
| 16024 | for line in (proc.stdout.read() or '').splitlines(): |
| 16025 | if any(k in line.lower() for k in ['deauth', 'disassoc']): |
| 16026 | deauth_events.append(line.strip()) |
| 16027 | return |
| 16028 | |
| 16029 | # --- Hop channels and capture deauth frames --- |
| 16030 | for ch in channels: |
| 16031 | subprocess.run( |
| 16032 | ['sudo', 'iw', 'dev', capture_iface, 'set', 'channel', str(ch)], |
| 16033 | capture_output=True, timeout=3 |
| 16034 | ) |
| 16035 | proc = subprocess.Popen( |
| 16036 | ['sudo', 'tcpdump', '-i', capture_iface, '-c', '100', |
| 16037 | '-n', '-l', |
| 16038 | 'type mgt subtype deauth or type mgt subtype disassoc'], |
| 16039 | stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True |
| 16040 | ) |
| 16041 | try: |
| 16042 | stdout, _ = proc.communicate(timeout=dwell) |
| 16043 | except subprocess.TimeoutExpired: |
| 16044 | proc.kill() |
| 16045 | stdout, _ = proc.communicate() |
nothing calls this directly
no test coverage detected