Last active
April 16, 2019 18:24
-
-
Save notpushkin/7872a22a39f33a3394635df3bd2a0c4d to your computer and use it in GitHub Desktop.
Print Wi-Fi connection details saved in NetworkManager as a QR code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Print Wi-Fi connection details saved in NetworkManager as a QR code supported | |
on Android (with Barcode Scanner or NeoReader) and iOS 11+. | |
Usage: | |
python3 qifi.py [SSID] | |
# (by default, currently active network will be used) | |
""" | |
import dbus # sudo apt install python3-dbus | |
from qrcode import QRCode # pip install qrcode | |
def get_all_props(obj, type): | |
props = dbus.Interface(obj, "org.freedesktop.DBus.Properties") | |
return props.GetAll(type) | |
def get_connection_info(ssid=None): | |
bus = dbus.SystemBus() | |
if ssid is None: | |
nm_obj = bus.get_object( | |
"org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager" | |
) | |
nm_props = get_all_props(nm_obj, "org.freedesktop.NetworkManager") | |
for act_conn_path in nm_props["ActiveConnections"]: | |
act_conn_obj = bus.get_object( | |
"org.freedesktop.NetworkManager", act_conn_path | |
) | |
act_conn_props = get_all_props( | |
act_conn_obj, "org.freedesktop.NetworkManager.Connection.Active" | |
) | |
if act_conn_props["Type"] == "802-11-wireless": | |
break | |
conn_obj = bus.get_object( | |
"org.freedesktop.NetworkManager", act_conn_props["Connection"] | |
) | |
conn = dbus.Interface( | |
conn_obj, "org.freedesktop.NetworkManager.Settings.Connection" | |
) | |
settings = conn.GetSettings() | |
else: | |
settings_obj = bus.get_object( | |
"org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Settings" | |
) | |
settings_props = get_all_props( | |
settings_obj, "org.freedesktop.NetworkManager.Settings" | |
) | |
for conn_path in settings_props["Connections"]: | |
conn_obj = bus.get_object("org.freedesktop.NetworkManager", conn_path) | |
conn = dbus.Interface( | |
conn_obj, "org.freedesktop.NetworkManager.Settings.Connection" | |
) | |
try: | |
settings = conn.GetSettings() | |
except: | |
continue | |
if settings["connection"]["type"] != "802-11-wireless": | |
continue | |
conn_ssid = "".join(chr(i) for i in settings["802-11-wireless"]["ssid"]) | |
if conn_ssid == ssid: | |
break | |
else: | |
raise KeyError("No network with SSID " + ssid) | |
secrets = conn.GetSecrets("802-11-wireless-security") | |
return { | |
"ssid": "".join(chr(i) for i in settings["802-11-wireless"]["ssid"]), | |
"algo": ( | |
"WEP" | |
if settings["802-11-wireless-security"]["key-mgmt"].startswith("wep") | |
else "WPA" | |
), | |
"psk": secrets["802-11-wireless-security"]["psk"], | |
} | |
if __name__ == "__main__": | |
import sys | |
ssid = sys.argv[1] if len(sys.argv) > 1 else None | |
conn_info = get_connection_info(ssid) | |
qr = QRCode() | |
qr.add_data( | |
f"WIFI:S:{conn_info['ssid']};T:{conn_info['algo']};P:{conn_info['psk']};;" | |
) | |
qr.print_ascii(tty=True) | |
print("") | |
print(f" Network name: {conn_info['ssid']}") | |
print(f" Password: {conn_info['psk']}") | |
print("") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Named after https://www.qifi.org/, a wifi QR generator by @evgeni that I've been using regularly before.