Skip to content

Instantly share code, notes, and snippets.

@hwmrocker
Last active August 29, 2015 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hwmrocker/f5051494e361864bebbd to your computer and use it in GitHub Desktop.
Save hwmrocker/f5051494e361864bebbd to your computer and use it in GitHub Desktop.
#/usr/bin/env python
import re
import subprocess
def get_networks_in_range_fast(lines=None):
if lines is None:
lines = subprocess.check_output(['nmcli', 'dev', 'wifi', 'list']).splitlines()
re_key = re.compile(r'[A-Z]+\s*')
first_line = lines[0]
keylist = []
start = 0
while start < len(first_line):
match = re_key.match(first_line, start)
if match:
end = match.end()
keylist.append((start, end, first_line[start:end].strip().lower()))
start = end
else:
# we should not end up here, but better safe than sorry
break
for line in lines[1:]:
network_dict = dict(
(key, line[start:end].strip())
for start, end, key in keylist
)
# we need to remove '-signs around the ssid name
network_dict["ssid"] = network_dict["ssid"][1:-1]
yield network_dict
def get_networks_in_range_slow(lines=None):
if lines is None:
lines = subprocess.check_output(['iwlist', 'wlan0', 'scan']).splitlines()
re_start = re.compile(r'\s+Cell\b')
re_ssid = re.compile(r'\s+ESSID:"([^"]+)"')
re_signal = re.compile(r'\s+Quality=(\d+)/70')
d = None
for line in lines:
if re_start.match(line):
if d:
yield d
d = dict(ssid='', signal='', active='')
continue
for regex, property_name in [
(re_ssid, "ssid"),
(re_signal, "signal"),
]:
match = regex.match(line)
if match:
d[property_name] = match.groups()[0]
break
if d:
yield d
test_input_fast = """\
SSID BSSID MODE FREQ RATE SIGNAL SECURITY ACTIVE
'UPC1859162' XX:XX:XX:XX:XX:XX Infrastructure 2412 MHz 54 MB/s 67 WPA WPA2 yes
'dlink' XX:XX:XX:XX:XX:XX Infrastructure 2412 MHz 54 MB/s 24 WPA WPA2 no
""".splitlines()
test_input_slow = """\
wlan0 Scan completed :
Cell 01 - Address: XX:XX:XX:XX:XX:XX
Channel:1
Frequency:2.412 GHz (Channel 1)
Quality=60/70 Signal level=-50 dBm
Encryption key:on
ESSID:"UPC1859162"
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s
24 Mb/s; 36 Mb/s; 54 Mb/s
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s
Mode:Master
Extra:tsf=XXXXXXXXXXXXXXXX
Extra: Last beacon: 16ms ago
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : TKIP
Pairwise Ciphers (2) : CCMP TKIP
Authentication Suites (1) : PSK
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: WPA Version 1
Group Cipher : TKIP
Pairwise Ciphers (2) : CCMP TKIP
Authentication Suites (1) : PSK
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Cell 02 - Address: XX:XX:XX:XX:XX:XX
Channel:1
Frequency:2.412 GHz (Channel 1)
Quality=30/70 Signal level=-50 dBm
Encryption key:on
ESSID:"TestNetwork"
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s
24 Mb/s; 36 Mb/s; 54 Mb/s
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s
Mode:Master
Extra:tsf=XXXXXXXXXXXXXXXX
Extra: Last beacon: 16ms ago
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : TKIP
Pairwise Ciphers (2) : CCMP TKIP
Authentication Suites (1) : PSK
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: WPA Version 1
Group Cipher : TKIP
Pairwise Ciphers (2) : CCMP TKIP
Authentication Suites (1) : PSK
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
IE: Unknown: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
""".splitlines()
if __name__ == "__main__":
from pprint import pprint
fast_list = list(get_networks_in_range_fast(test_input_fast))
slow_list = list(get_networks_in_range_slow(test_input_slow))
assert len(fast_list) == 2
assert len(slow_list) == 2
# test fast parser
assert fast_list[0]["active"] == "yes"
assert fast_list[1]["active"] == "no"
assert fast_list[0]["ssid"] == "UPC1859162"
assert fast_list[1]["ssid"] == "dlink"
assert fast_list[0]["signal"] == "67"
assert fast_list[1]["signal"] == "24"
# test slow parser
assert slow_list[0]["active"] == ""
assert slow_list[1]["active"] == ""
assert slow_list[0]["ssid"] == "UPC1859162"
assert slow_list[1]["ssid"] == "TestNetwork"
assert slow_list[0]["signal"] == "60"
assert slow_list[1]["signal"] == "30"
print("tests done")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment