Skip to main content
added 12 characters in body
Source Link
grawity
  • 16.3k
  • 1
  • 34
  • 54
#!/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"])
Source Link
grawity
  • 16.3k
  • 1
  • 34
  • 54

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)