Blame examples/python/gi/nm-update2.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) 2019 Red Hat, Inc.
Packit Service b23acc
#
Packit Service b23acc
Packit Service b23acc
import sys
Packit Service b23acc
Packit Service b23acc
import gi
Packit Service b23acc
Packit Service b23acc
gi.require_version("NM", "1.0")
Packit Service b23acc
from gi.repository import GLib, NM
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def find_connections(nm_client, arg_type, arg_id):
Packit Service b23acc
    for c in nm_client.get_connections():
Packit Service b23acc
        if arg_type in [None, "id"] and c.get_id() == arg_id:
Packit Service b23acc
            yield c
Packit Service b23acc
        if arg_type in [None, "uuid"] and c.get_uuid() == arg_id:
Packit Service b23acc
            yield c
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def find_connection_first(nm_client, arg_type, arg_id):
Packit Service b23acc
    for f in find_connections(nm_client, arg_type, arg_id):
Packit Service b23acc
        return f
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def con_to_str(con):
Packit Service b23acc
    s_con = con.get_setting_connection()
Packit Service b23acc
    return '"%s" (%s)' % (s_con.get_id(), s_con.get_uuid())
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def usage():
Packit Service b23acc
    arg0 = sys.argv[0]
Packit Service b23acc
    arg0_spaced = " " * len(arg0)
Packit Service b23acc
    print("Usage: %s [ [id] <id> | [uuid] <uuid> ] \\" % (arg0))
Packit Service b23acc
    print(
Packit Service b23acc
        "       %s [ --to-disk | --in-memory | --in-memory-detached | --in-memory-only ] \\"
Packit Service b23acc
        % (arg0_spaced)
Packit Service b23acc
    )
Packit Service b23acc
    print("       %s [ --block-autoconnect ] \\" % (arg0_spaced))
Packit Service b23acc
    print("       %s [ --volatile ] \\" % (arg0_spaced))
Packit Service b23acc
    print("       %s [ --no-reapply ] \\" % (arg0_spaced))
Packit Service b23acc
    return 1
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def die(msg, print_usage=False):
Packit Service b23acc
    print(msg)
Packit Service b23acc
    if print_usage:
Packit Service b23acc
        usage()
Packit Service b23acc
    sys.exit(1)
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
def main():
Packit Service b23acc
Packit Service b23acc
    main_loop = GLib.MainLoop()
Packit Service b23acc
Packit Service b23acc
    nm_client = NM.Client.new(None)
Packit Service b23acc
Packit Service b23acc
    arg_mode = None
Packit Service b23acc
    arg_block_autoconnect = NM.SettingsUpdate2Flags.NONE
Packit Service b23acc
    arg_volatile = NM.SettingsUpdate2Flags.NONE
Packit Service b23acc
    arg_no_reapply = NM.SettingsUpdate2Flags.NONE
Packit Service b23acc
Packit Service b23acc
    cons = []
Packit Service b23acc
Packit Service b23acc
    argv = list(sys.argv[1:])
Packit Service b23acc
    while argv:
Packit Service b23acc
        if argv[0] in ["id", "uuid"]:
Packit Service b23acc
            if cons:
Packit Service b23acc
                die("cannot specify multiple connections")
Packit Service b23acc
            if len(argv) < 2:
Packit Service b23acc
                die('missing argument for "%s" specifier' % (argv[0]))
Packit Service b23acc
            cons.extend(find_connections(nm_client, argv[0], argv[1]))
Packit Service b23acc
            if len(cons) == 0:
Packit Service b23acc
                die('could not find connection for "%s %s"' % (argv[0], argv[1]))
Packit Service b23acc
            if len(cons) != 1:
Packit Service b23acc
                die('could not find unique connection for "%s %s"' % (argv[0], argv[1]))
Packit Service b23acc
            argv = argv[2:]
Packit Service b23acc
            continue
Packit Service b23acc
        if argv[0] in ["--block-autoconnect"]:
Packit Service b23acc
            arg_block_autoconnect = NM.SettingsUpdate2Flags.BLOCK_AUTOCONNECT
Packit Service b23acc
            argv = argv[1:]
Packit Service b23acc
            continue
Packit Service b23acc
        if argv[0] in ["--volatile"]:
Packit Service b23acc
            arg_volatile = NM.SettingsUpdate2Flags.VOLATILE
Packit Service b23acc
            argv = argv[1:]
Packit Service b23acc
            continue
Packit Service b23acc
        if argv[0] in ["--no-reapply"]:
Packit Service b23acc
            arg_no_reapply = NM.SettingsUpdate2Flags.NO_REAPPLY
Packit Service b23acc
            argv = argv[1:]
Packit Service b23acc
            continue
Packit Service b23acc
        if argv[0] in [
Packit Service b23acc
            "--to-disk",
Packit Service b23acc
            "--in-memory",
Packit Service b23acc
            "--in-memory-detached",
Packit Service b23acc
            "--in-memory-only",
Packit Service b23acc
        ]:
Packit Service b23acc
            if argv[0] == "--to-disk":
Packit Service b23acc
                v = NM.SettingsUpdate2Flags.TO_DISK
Packit Service b23acc
            elif argv[0] == "--in-memory":
Packit Service b23acc
                v = NM.SettingsUpdate2Flags.IN_MEMORY
Packit Service b23acc
            elif argv[0] == "--in-memory-detached":
Packit Service b23acc
                v = NM.SettingsUpdate2Flags.IN_MEMORY_DETACHED
Packit Service b23acc
            elif argv[0] == "--in-memory-only":
Packit Service b23acc
                v = NM.SettingsUpdate2Flags.IN_MEMORY_ONLY
Packit Service b23acc
            elif argv[0] == "--keep":
Packit Service b23acc
                v = NM.SettingsUpdate2Flags.NONE
Packit Service b23acc
            else:
Packit Service b23acc
                assert False
Packit Service b23acc
            if arg_mode is not None:
Packit Service b23acc
                die('duplicate storage modes ("%s")' % (argv[0]))
Packit Service b23acc
            arg_mode = v
Packit Service b23acc
            argv = argv[1:]
Packit Service b23acc
            continue
Packit Service b23acc
        if cons:
Packit Service b23acc
            die('unknown argument "%s"' % (argv[0]))
Packit Service b23acc
        cons.extend(find_connections(nm_client, None, argv[0]))
Packit Service b23acc
        if len(cons) == 0:
Packit Service b23acc
            die('could not find connection for "%s"' % (argv[0]))
Packit Service b23acc
        if len(cons) != 1:
Packit Service b23acc
            die('could not find unique connection for "%s"' % (argv[0]))
Packit Service b23acc
        argv = argv[1:]
Packit Service b23acc
        continue
Packit Service b23acc
Packit Service b23acc
    if len(cons) != 1:
Packit Service b23acc
        die("missing connection argument", True)
Packit Service b23acc
Packit Service b23acc
    con = cons[0]
Packit Service b23acc
Packit Service b23acc
    con2 = NM.SimpleConnection.new_clone(con)
Packit Service b23acc
Packit Service b23acc
    result = {}
Packit Service b23acc
Packit Service b23acc
    def _update2_cb(con, async_result, user_data):
Packit Service b23acc
        try:
Packit Service b23acc
            r = con.update2_finish(async_result)
Packit Service b23acc
        except Exception as e:
Packit Service b23acc
            result["error"] = e
Packit Service b23acc
        else:
Packit Service b23acc
            result["result"] = r
Packit Service b23acc
        main_loop.quit()
Packit Service b23acc
Packit Service b23acc
    con.update2(
Packit Service b23acc
        con2.to_dbus(NM.ConnectionSerializationFlags.ALL),
Packit Service b23acc
        (arg_mode if arg_mode is not None else NM.SettingsUpdate2Flags.NONE)
Packit Service b23acc
        | arg_block_autoconnect
Packit Service b23acc
        | arg_volatile
Packit Service b23acc
        | arg_no_reapply,
Packit Service b23acc
        None,
Packit Service b23acc
        None,
Packit Service b23acc
        _update2_cb,
Packit Service b23acc
        None,
Packit Service b23acc
    )
Packit Service b23acc
Packit Service b23acc
    main_loop.run()
Packit Service b23acc
Packit Service b23acc
    if "error" in result:
Packit Service b23acc
        die(
Packit Service b23acc
            "update connection %s failed [%s]: %s"
Packit Service b23acc
            % (con_to_str(con2), " ".join(sys.argv), result["error"])
Packit Service b23acc
        )
Packit Service b23acc
Packit Service b23acc
    print(
Packit Service b23acc
        "update connection %s succeeded [%s]: %s"
Packit Service b23acc
        % (con_to_str(con2), " ".join(sys.argv), result["result"])
Packit Service b23acc
    )
Packit Service b23acc
Packit Service b23acc
Packit Service b23acc
if __name__ == "__main__":
Packit Service b23acc
    main()