66import subprocess
77import re
88
9- from .cmd import get_airport
9+ from .cmd import get_airport , running_as_root
1010
1111
1212def cli_config_check () -> bool :
@@ -32,7 +32,7 @@ def cli_config_check() -> bool:
3232def get_signal () -> str :
3333
3434 try :
35- ret = subprocess .check_output ([get_airport (), "-s" ], text = True , timeout = 30.0 )
35+ ret = subprocess .check_output ([get_airport (), "-s" ], text = True , timeout = 30 )
3636 except subprocess .CalledProcessError as err :
3737 logging .error (f"consider slowing scan cadence. { err } " )
3838
@@ -41,17 +41,31 @@ def get_signal() -> str:
4141
4242def parse_signal (raw : str ) -> list [dict [str , T .Any ]]:
4343
44- pat = re .compile (r"\s*([0-9a-zA-Z\-\.]+)\s+([0-9a-f]{2}(?::[0-9a-f]{2}){5})\s+(-\d{2,3})" )
44+ isroot = running_as_root ()
45+ if not isroot :
46+ raise RuntimeError ("airport requires running as sudo to get BSSID" )
47+
48+ psudo = r"\s*([0-9a-zA-Z\s\-\.]+)\s+([0-9a-f]{2}(?::[0-9a-f]{2}){5})\s+(-\d{2,3})"
49+ # BSSID only present if sudo
50+ # puser = r"\s*([0-9a-zA-Z\s\-\.]+)\s+(-\d{2,3})"
51+ # non-sudo has no BSSID
52+
53+ p = psudo
54+ i = 2
55+
56+ pat = re .compile (p )
4557 dat : list [dict [str , str ]] = []
4658
4759 for line in raw .split ("\n " ):
4860 mat = pat .match (line )
4961 if mat :
62+ # Hidden SSID optout implicitly excluded by regex
5063 ssid = mat .group (1 )
5164 # optout
5265 if ssid .endswith ("_nomap" ):
5366 continue
54-
55- dat .append ({"ssid" : ssid , "macAddress" : mat .group (2 ), "signalStrength" : mat .group (3 )})
67+ dat .append (
68+ {"ssid" : ssid , "macAddress" : mat .group (i ), "signalStrength" : mat .group (i + 1 )}
69+ )
5670
5771 return dat
0 commit comments