Blame examples/python/dbus/vpn.py

Packit Service b23acc
#!/usr/bin/env python
Packit Service b23acc
# SPDX-License-Identifier: GPL-2.0+
Packit Service b23acc
#
Packit Service b23acc
# Copyright (C) 2009 Novell, Inc.
Packit Service b23acc
# Copyright (C) 2009 Red Hat, Inc.
Packit Service b23acc
#
Packit Service b23acc
Packit Service b23acc
# Run this script without any arguments to list the available connection uuids.
Packit Service b23acc
Packit Service b23acc
# The uuid of the connection to activate
Packit Service b23acc
CONNECTION_UUID = "ac6dc9b2-85ef-4311-83d8-add5d7db3f59"
Packit Service b23acc
Packit Service b23acc
# UID to use. Note that NM only allows the owner of the connection to activate it.
Packit Service b23acc
# UID=1000
Packit Service b23acc
UID = 0
Packit Service b23acc
Packit Service b23acc
import sys
Packit Service b23acc
import os
Packit Service b23acc
import dbus
Packit Service b23acc
from dbus.mainloop.glib import DBusGMainLoop
Packit Service b23acc
import gobject
Packit Service b23acc
Packit Service b23acc
DBusGMainLoop(set_as_default=True)
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def get_connections():
Packit Service b23acc
    bus = dbus.SystemBus()
Packit Service b23acc
    proxy = bus.get_object(
Packit Service b23acc
        "org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Settings"
Packit Service b23acc
    )
Packit Service b23acc
    iface = dbus.Interface(
Packit Service b23acc
        proxy, dbus_interface="org.freedesktop.NetworkManager.Settings"
Packit Service b23acc
    )
Packit Service b23acc
    return iface.ListConnections()
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def get_connection_by_uuid(uuid):
Packit Service b23acc
    bus = dbus.SystemBus()
Packit Service b23acc
    for c in get_connections():
Packit Service b23acc
        proxy = bus.get_object("org.freedesktop.NetworkManager", c)
Packit Service b23acc
        iface = dbus.Interface(
Packit Service b23acc
            proxy, dbus_interface="org.freedesktop.NetworkManager.Settings.Connection"
Packit Service b23acc
        )
Packit Service b23acc
        settings = iface.GetSettings()
Packit Service b23acc
        if settings["connection"]["uuid"] == uuid:
Packit Service b23acc
            return c
Packit Service b23acc
Packit Service b23acc
    return None
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def list_uuids():
Packit Service b23acc
    bus = dbus.SystemBus()
Packit Service b23acc
    for c in get_connections():
Packit Service b23acc
        proxy = bus.get_object("org.freedesktop.NetworkManager", c)
Packit Service b23acc
        iface = dbus.Interface(
Packit Service b23acc
            proxy, dbus_interface="org.freedesktop.NetworkManager.Settings.Connection"
Packit Service b23acc
        )
Packit Service b23acc
        settings = iface.GetSettings()
Packit Service b23acc
        conn = settings["connection"]
Packit Service b23acc
        print("%s - %s (%s)" % (conn["uuid"], conn["id"], conn["type"]))
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def get_active_connection_path(uuid):
Packit Service b23acc
    bus = dbus.SystemBus()
Packit Service b23acc
    proxy = bus.get_object(
Packit Service b23acc
        "org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager"
Packit Service b23acc
    )
Packit Service b23acc
    iface = dbus.Interface(proxy, dbus_interface="org.freedesktop.DBus.Properties")
Packit Service b23acc
    active_connections = iface.Get(
Packit Service b23acc
        "org.freedesktop.NetworkManager", "ActiveConnections"
Packit Service b23acc
    )
Packit Service b23acc
Packit Service b23acc
    for a in active_connections:
Packit Service b23acc
        proxy = bus.get_object("org.freedesktop.NetworkManager", a)
Packit Service b23acc
        iface = dbus.Interface(proxy, dbus_interface="org.freedesktop.DBus.Properties")
Packit Service b23acc
        path = iface.Get(
Packit Service b23acc
            "org.freedesktop.NetworkManager.Connection.Active", "Connection"
Packit Service b23acc
        )
Packit Service b23acc
Packit Service b23acc
        proxy = bus.get_object("org.freedesktop.NetworkManager", path)
Packit Service b23acc
        iface = dbus.Interface(
Packit Service b23acc
            proxy, dbus_interface="org.freedesktop.NetworkManager.Settings.Connection"
Packit Service b23acc
        )
Packit Service b23acc
        settings = iface.GetSettings()
Packit Service b23acc
Packit Service b23acc
        if settings["connection"]["uuid"] == uuid:
Packit Service b23acc
            return a
Packit Service b23acc
Packit Service b23acc
    return None
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def get_wifi_device_path():
Packit Service b23acc
    bus = dbus.SystemBus()
Packit Service b23acc
    proxy = bus.get_object(
Packit Service b23acc
        "org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager"
Packit Service b23acc
    )
Packit Service b23acc
    iface = dbus.Interface(proxy, dbus_interface="org.freedesktop.NetworkManager")
Packit Service b23acc
    devices = iface.GetDevices()
Packit Service b23acc
    for d in devices:
Packit Service b23acc
        proxy = bus.get_object("org.freedesktop.NetworkManager", d)
Packit Service b23acc
        iface = dbus.Interface(proxy, dbus_interface="org.freedesktop.DBus.Properties")
Packit Service b23acc
        devtype = iface.Get("org.freedesktop.NetworkManager.Device", "DeviceType")
Packit Service b23acc
        if devtype == 2:
Packit Service b23acc
            return d
Packit Service b23acc
    return None
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def activate_connection(connection_path, device_path):
Packit Service b23acc
    def reply_handler(opath):
Packit Service b23acc
        print("Success: device activating")
Packit Service b23acc
        sys.exit(0)
Packit Service b23acc
Packit Service b23acc
    def error_handler(*args):
Packit Service b23acc
        sys.stderr.write("Error activating device: %s\n" % args)
Packit Service b23acc
        sys.exit(1)
Packit Service b23acc
Packit Service b23acc
    bus = dbus.SystemBus()
Packit Service b23acc
    proxy = bus.get_object(
Packit Service b23acc
        "org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager"
Packit Service b23acc
    )
Packit Service b23acc
    iface = dbus.Interface(proxy, dbus_interface="org.freedesktop.NetworkManager")
Packit Service b23acc
    iface.ActivateConnection(
Packit Service b23acc
        "org.freedesktop.NetworkManager",
Packit Service b23acc
        connection_path,
Packit Service b23acc
        device_path,
Packit Service b23acc
        "/",
Packit Service b23acc
        reply_handler=reply_handler,
Packit Service b23acc
        error_handler=error_handler,
Packit Service b23acc
    )
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
# Change the UID first if required
Packit Service b23acc
if UID != 0:
Packit Service b23acc
    os.setuid(UID)
Packit Service b23acc
Packit Service b23acc
# Are we configured?
Packit Service b23acc
if not len(CONNECTION_UUID):
Packit Service b23acc
    print("missing connection UUID")
Packit Service b23acc
    sys.exit(0)
Packit Service b23acc
Packit Service b23acc
connection_path = get_connection_by_uuid(CONNECTION_UUID)
Packit Service b23acc
if not connection_path:
Packit Service b23acc
    # Configured VPN connection is not known to NM, check CONNECTION_UUID.
Packit Service b23acc
    print("couldn't find the connection")
Packit Service b23acc
    sys.exit(1)
Packit Service b23acc
Packit Service b23acc
device_path = get_wifi_device_path()
Packit Service b23acc
if not device_path:
Packit Service b23acc
    print("no Wi-Fi device found")
Packit Service b23acc
    sys.exit(1)
Packit Service b23acc
Packit Service b23acc
# Is it already activated?
Packit Service b23acc
if get_active_connection_path(CONNECTION_UUID):
Packit Service b23acc
    print("already connected")
Packit Service b23acc
    sys.exit(0)
Packit Service b23acc
Packit Service b23acc
print("Activating connection...")
Packit Service b23acc
activate_connection(connection_path, device_path)
Packit Service b23acc
loop = gobject.MainLoop()
Packit Service b23acc
loop.run()