#!/usr/bin/env python3
import dbus
import time
bus = dbus.SystemBus()
manager_obj = bus.get_object("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager")
device_paths = manager_obj.Get("org.freedesktop.NetworkManager",
"Devices",
dbus_interface="org.freedesktop.DBus.Properties")
for device_path in device_paths:
device_obj = bus.get_object("org.freedesktop.NetworkManager", device_path)
# device_props = device_obj.GetAll("org.freedesktop.NetworkManager.Device",
# dbus_interface="org.freedesktop.DBus.Properties")
try:
last_scan_ms = device_obj.Get("org.freedesktop.NetworkManager.Device.Wireless",
"LastScan",
dbus_interface="org.freedesktop.DBus.Properties")
except dbus.exceptions.DBusException:
# not a wireless interface (too lazy to check device_props["Type"])
continue
boottime_now = time.clock_gettime(time.CLOCK_BOOTTIME)
#last_scan = wireless_props["LastScan"] / 1000
last_scan = last_scan_ms / 1000
if boottime_now - last_scan > 120:
device_obj.RequestScan({},
dbus_interface="org.freedesktop.NetworkManager.Device.Wireless")
print("Requested a fresh scan, waiting 5 seconds")
time.sleep(5)
else:
print("Using recent scan results")
ap_paths = device_obj.Get("org.freedesktop.NetworkManager.Device.Wireless",
"AccessPoints",
dbus_interface="org.freedesktop.DBus.Properties")
for ap_path in ap_paths:
ap_obj = bus.get_object("org.freedesktop.NetworkManager", ap_path)
ap_props = ap_obj.GetAll("org.freedesktop.NetworkManager.AccessPoint",
dbus_interface="org.freedesktop.DBus.Properties"),
ssid_bytes = bytes(ap_props["Ssid"] byte_arrays=True)
print(ap_props["HwAddress"], ssid_bytesap_props["Ssid"])
#!/usr/bin/env python3
import dbus
import time
bus = dbus.SystemBus()
manager_obj = bus.get_object("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager")
device_paths = manager_obj.Get("org.freedesktop.NetworkManager",
"Devices",
dbus_interface="org.freedesktop.DBus.Properties")
for device_path in device_paths:
device_obj = bus.get_object("org.freedesktop.NetworkManager", device_path)
# device_props = device_obj.GetAll("org.freedesktop.NetworkManager.Device",
# dbus_interface="org.freedesktop.DBus.Properties")
try:
last_scan_ms = device_obj.Get("org.freedesktop.NetworkManager.Device.Wireless",
"LastScan",
dbus_interface="org.freedesktop.DBus.Properties")
except dbus.exceptions.DBusException:
# not a wireless interface (too lazy to check device_props["Type"])
continue
boottime_now = time.clock_gettime(time.CLOCK_BOOTTIME)
#last_scan = wireless_props["LastScan"] / 1000
last_scan = last_scan_ms / 1000
if boottime_now - last_scan > 120:
device_obj.RequestScan({},
dbus_interface="org.freedesktop.NetworkManager.Device.Wireless")
print("Requested a fresh scan, waiting 5 seconds")
time.sleep(5)
else:
print("Using recent scan results")
ap_paths = device_obj.Get("org.freedesktop.NetworkManager.Device.Wireless",
"AccessPoints",
dbus_interface="org.freedesktop.DBus.Properties")
for ap_path in ap_paths:
ap_obj = bus.get_object("org.freedesktop.NetworkManager", ap_path)
ap_props = ap_obj.GetAll("org.freedesktop.NetworkManager.AccessPoint",
dbus_interface="org.freedesktop.DBus.Properties")
ssid_bytes = bytes(ap_props["Ssid"])
print(ap_props["HwAddress"], ssid_bytes)
#!/usr/bin/env python3
import dbus
import time
bus = dbus.SystemBus()
manager_obj = bus.get_object("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager")
device_paths = manager_obj.Get("org.freedesktop.NetworkManager",
"Devices",
dbus_interface="org.freedesktop.DBus.Properties")
for device_path in device_paths:
device_obj = bus.get_object("org.freedesktop.NetworkManager", device_path)
# device_props = device_obj.GetAll("org.freedesktop.NetworkManager.Device",
# dbus_interface="org.freedesktop.DBus.Properties")
try:
last_scan_ms = device_obj.Get("org.freedesktop.NetworkManager.Device.Wireless",
"LastScan",
dbus_interface="org.freedesktop.DBus.Properties")
except dbus.exceptions.DBusException:
# not a wireless interface (too lazy to check device_props["Type"])
continue
boottime_now = time.clock_gettime(time.CLOCK_BOOTTIME)
#last_scan = wireless_props["LastScan"] / 1000
last_scan = last_scan_ms / 1000
if boottime_now - last_scan > 120:
device_obj.RequestScan({},
dbus_interface="org.freedesktop.NetworkManager.Device.Wireless")
print("Requested a fresh scan, waiting 5 seconds")
time.sleep(5)
else:
print("Using recent scan results")
ap_paths = device_obj.Get("org.freedesktop.NetworkManager.Device.Wireless",
"AccessPoints",
dbus_interface="org.freedesktop.DBus.Properties")
for ap_path in ap_paths:
ap_obj = bus.get_object("org.freedesktop.NetworkManager", ap_path)
ap_props = ap_obj.GetAll("org.freedesktop.NetworkManager.AccessPoint",
dbus_interface="org.freedesktop.DBus.Properties",
byte_arrays=True)
print(ap_props["HwAddress"], ap_props["Ssid"])
I have to manage the output of the command nmcli by a Python script.
No you don't. Python can directly access NetworkManager's API in several ways.
For example, you can call libnm through pygobject:
import gi
gi.require_version("NM", "1.0")
from gi.repository import NM
The rest is documented at: https://networkmanager.dev/docs/developers/
There's a whole example at: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/examples/python/gi/show-wifi-networks.py
Here's another example using raw D-Bus. While more verbose than shell scripting (maybe even more so because I used the legacy 'dbus-python' module as that's what I was already familiar with), it's still more robust than shell scripts when it comes to weird SSIDs, as they remain byte-arrays throughout the whole process:
#!/usr/bin/env python3
import dbus
import time
bus = dbus.SystemBus()
manager_obj = bus.get_object("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager")
device_paths = manager_obj.Get("org.freedesktop.NetworkManager",
"Devices",
dbus_interface="org.freedesktop.DBus.Properties")
for device_path in device_paths:
device_obj = bus.get_object("org.freedesktop.NetworkManager", device_path)
# device_props = device_obj.GetAll("org.freedesktop.NetworkManager.Device",
# dbus_interface="org.freedesktop.DBus.Properties")
try:
last_scan_ms = device_obj.Get("org.freedesktop.NetworkManager.Device.Wireless",
"LastScan",
dbus_interface="org.freedesktop.DBus.Properties")
except dbus.exceptions.DBusException:
# not a wireless interface (too lazy to check device_props["Type"])
continue
boottime_now = time.clock_gettime(time.CLOCK_BOOTTIME)
#last_scan = wireless_props["LastScan"] / 1000
last_scan = last_scan_ms / 1000
if boottime_now - last_scan > 120:
device_obj.RequestScan({},
dbus_interface="org.freedesktop.NetworkManager.Device.Wireless")
print("Requested a fresh scan, waiting 5 seconds")
time.sleep(5)
else:
print("Using recent scan results")
ap_paths = device_obj.Get("org.freedesktop.NetworkManager.Device.Wireless",
"AccessPoints",
dbus_interface="org.freedesktop.DBus.Properties")
for ap_path in ap_paths:
ap_obj = bus.get_object("org.freedesktop.NetworkManager", ap_path)
ap_props = ap_obj.GetAll("org.freedesktop.NetworkManager.AccessPoint",
dbus_interface="org.freedesktop.DBus.Properties")
ssid_bytes = bytes(ap_props["Ssid"])
print(ap_props["HwAddress"], ssid_bytes)