Skip to content

Instantly share code, notes, and snippets.

@notpushkin
Last active April 16, 2019 18:24
Show Gist options
  • Save notpushkin/7872a22a39f33a3394635df3bd2a0c4d to your computer and use it in GitHub Desktop.
Save notpushkin/7872a22a39f33a3394635df3bd2a0c4d to your computer and use it in GitHub Desktop.
Print Wi-Fi connection details saved in NetworkManager as a QR code
"""
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("")
@notpushkin
Copy link
Author

Named after https://www.qifi.org/, a wifi QR generator by @evgeni that I've been using regularly before.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment