Blame examples/python/dbus/update-secrets.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) 2011 - 2012 Red Hat, Inc.
Packit Service b23acc
#
Packit Service b23acc
Packit Service b23acc
#
Packit Service b23acc
# The example shows how to update secrets in a connection by means of D-Bus
Packit Service b23acc
# Update() method. The method replaces all previous settings with new ones
Packit Service b23acc
# including possible secrets.
Packit Service b23acc
# So, we get all settings using GetSettings() and then find out what secrets
Packit Service b23acc
# are associated with the connection using GetSecrets(), ask for new secret
Packit Service b23acc
# values, and add them to the settings that we pass to Update().
Packit Service b23acc
#
Packit Service b23acc
Packit Service b23acc
import dbus
Packit Service b23acc
import sys
Packit Service b23acc
Packit Service b23acc
bus = dbus.SystemBus()
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def change_secrets_in_one_setting(proxy, config, setting_name):
Packit Service b23acc
    # Add new secret values to the connection config
Packit Service b23acc
    try:
Packit Service b23acc
        # returns a dict of dicts mapping name::setting, where setting is a dict
Packit Service b23acc
        # mapping key::value.  Each member of the 'setting' dict is a secret
Packit Service b23acc
        secrets = proxy.GetSecrets(setting_name)
Packit Service b23acc
        print("Current secrets:" + secrets)
Packit Service b23acc
Packit Service b23acc
        # Ask user for new secrets and put them into our connection config
Packit Service b23acc
        for setting in secrets:
Packit Service b23acc
            for key in secrets[setting]:
Packit Service b23acc
                new_secret = raw_input(
Packit Service b23acc
                    "Enter new secret for '%s' in '%s': " % (key, setting)
Packit Service b23acc
                )
Packit Service b23acc
                config[setting_name][key] = new_secret
Packit Service b23acc
    except Exception as e:
Packit Service b23acc
        # code = str(e).split(':')[0]
Packit Service b23acc
        # print("Exception:" + str(e))
Packit Service b23acc
        pass
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def change_secrets(con_path, config):
Packit Service b23acc
    # Get existing secrets; we grab the secrets for each type of connection
Packit Service b23acc
    # (since there isn't a "get all secrets" call because most of the time
Packit Service b23acc
    # you only need 'wifi' secrets or '802.1x' secrets, not everything) and
Packit Service b23acc
    # set new values into the connection settings (config)
Packit Service b23acc
    con_proxy = bus.get_object("org.freedesktop.NetworkManager", con_path)
Packit Service b23acc
    connection_secrets = dbus.Interface(
Packit Service b23acc
        con_proxy, "org.freedesktop.NetworkManager.Settings.Connection"
Packit Service b23acc
    )
Packit Service b23acc
    change_secrets_in_one_setting(connection_secrets, config, "802-11-wireless")
Packit Service b23acc
    change_secrets_in_one_setting(
Packit Service b23acc
        connection_secrets, config, "802-11-wireless-security"
Packit Service b23acc
    )
Packit Service b23acc
    change_secrets_in_one_setting(connection_secrets, config, "802-1x")
Packit Service b23acc
    change_secrets_in_one_setting(connection_secrets, config, "gsm")
Packit Service b23acc
    change_secrets_in_one_setting(connection_secrets, config, "cdma")
Packit Service b23acc
    change_secrets_in_one_setting(connection_secrets, config, "ppp")
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def find_connection(name):
Packit Service b23acc
    # Ask the settings service for the list of connections it provides
Packit Service b23acc
    global con_path
Packit Service b23acc
    proxy = bus.get_object(
Packit Service b23acc
        "org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Settings"
Packit Service b23acc
    )
Packit Service b23acc
    settings = dbus.Interface(proxy, "org.freedesktop.NetworkManager.Settings")
Packit Service b23acc
    connection_paths = settings.ListConnections()
Packit Service b23acc
Packit Service b23acc
    # Get the settings and look for connection's name
Packit Service b23acc
    for path in connection_paths:
Packit Service b23acc
        con_proxy = bus.get_object("org.freedesktop.NetworkManager", path)
Packit Service b23acc
        connection = dbus.Interface(
Packit Service b23acc
            con_proxy, "org.freedesktop.NetworkManager.Settings.Connection"
Packit Service b23acc
        )
Packit Service b23acc
        try:
Packit Service b23acc
            config = connection.GetSettings()
Packit Service b23acc
        except Exception as e:
Packit Service b23acc
            pass
Packit Service b23acc
Packit Service b23acc
        # Find connection by the id
Packit Service b23acc
        s_con = config["connection"]
Packit Service b23acc
        if name == s_con["id"]:
Packit Service b23acc
            con_path = path
Packit Service b23acc
            return config
Packit Service b23acc
        # Find connection by the uuid
Packit Service b23acc
        if name == s_con["uuid"]:
Packit Service b23acc
            con_path = path
Packit Service b23acc
            return config
Packit Service b23acc
Packit Service b23acc
    return None
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
# Main part
Packit Service b23acc
con_path = None
Packit Service b23acc
Packit Service b23acc
if len(sys.argv) != 2:
Packit Service b23acc
    sys.exit("Usage: %s <connection name/uuid>" % sys.argv[0])
Packit Service b23acc
Packit Service b23acc
# Find the connection
Packit Service b23acc
con = find_connection(sys.argv[1])
Packit Service b23acc
Packit Service b23acc
print("Connection found: " + con_path)
Packit Service b23acc
Packit Service b23acc
if con:
Packit Service b23acc
    # Obtain new secrets and put then into connection dict
Packit Service b23acc
    change_secrets(con_path, con)
Packit Service b23acc
Packit Service b23acc
    # Change the connection with Update()
Packit Service b23acc
    proxy = bus.get_object("org.freedesktop.NetworkManager", con_path)
Packit Service b23acc
    settings = dbus.Interface(
Packit Service b23acc
        proxy, "org.freedesktop.NetworkManager.Settings.Connection"
Packit Service b23acc
    )
Packit Service b23acc
    settings.Update(con)
Packit Service b23acc
else:
Packit Service b23acc
    sys.exit("No connection '%s' found" % sys.argv[1])