Blame examples/python/gi/nm-add-connection2.py

Packit 5756e2
#!/usr/bin/env python
Packit Service 87a54e
# SPDX-License-Identifier: GPL-2.0-or-later
Packit 5756e2
#
Packit 5756e2
# Copyright (C) 2019 Red Hat, Inc.
Packit 5756e2
#
Packit 5756e2
Packit 5756e2
import sys
Packit 5756e2
Packit 5756e2
import gi
Packit 5756e2
Packit 5756e2
gi.require_version("NM", "1.0")
Packit 5756e2
from gi.repository import GLib, NM
Packit 5756e2
Packit 5756e2
Packit 5756e2
def find_connections(nm_client, arg_type, arg_id):
Packit 5756e2
    for c in nm_client.get_connections():
Packit 5756e2
        if arg_type in [None, "id"] and c.get_id() == arg_id:
Packit 5756e2
            yield c
Packit 5756e2
        if arg_type in [None, "uuid"] and c.get_uuid() == arg_id:
Packit 5756e2
            yield c
Packit 5756e2
Packit 5756e2
Packit 5756e2
def find_connection_first(nm_client, arg_type, arg_id):
Packit 5756e2
    for f in find_connections(nm_client, arg_type, arg_id):
Packit 5756e2
        return f
Packit 5756e2
Packit 5756e2
Packit 5756e2
def con_to_str(con):
Packit 5756e2
    s_con = con.get_setting_connection()
Packit 5756e2
    return '"%s" (%s)' % (s_con.get_id(), s_con.get_uuid())
Packit 5756e2
Packit 5756e2
Packit 5756e2
def usage():
Packit 5756e2
    arg0 = sys.argv[0]
Packit 5756e2
    arg0_spaced = " " * len(arg0)
Packit 5756e2
    print("Usage: %s [ --clone ( [id] <id> | [uuid] <uuid> ) ] \\" % (arg0))
Packit 5756e2
    print("       %s [ --to-disk | --in-memory ] \\" % (arg0_spaced))
Packit 5756e2
    print("       %s [ --block-autoconnect ] \\" % (arg0_spaced))
Packit 5756e2
    print("       %s [ --id <new-id> ] \\" % (arg0_spaced))
Packit 5756e2
    print("       %s [ --uuid <new-uuid> ] \\" % (arg0_spaced))
Packit 5756e2
    return 1
Packit 5756e2
Packit 5756e2
Packit 5756e2
def die(msg, print_usage=False):
Packit 5756e2
    print(msg)
Packit 5756e2
    if print_usage:
Packit 5756e2
        usage()
Packit 5756e2
    sys.exit(1)
Packit 5756e2
Packit 5756e2
Packit 5756e2
def main():
Packit 5756e2
Packit 5756e2
    main_loop = GLib.MainLoop()
Packit 5756e2
Packit 5756e2
    nm_client = NM.Client.new(None)
Packit 5756e2
Packit 5756e2
    arg_mode = None
Packit 5756e2
    arg_block_autoconnect = NM.SettingsAddConnection2Flags.NONE
Packit 5756e2
    arg_id = None
Packit 5756e2
    arg_uuid = None
Packit 5756e2
Packit 5756e2
    cons = []
Packit 5756e2
Packit 5756e2
    argv = list(sys.argv[1:])
Packit 5756e2
    while argv:
Packit 5756e2
        if argv[0] == "--clone":
Packit 5756e2
            match_type = None
Packit 5756e2
            if len(argv) < 2:
Packit 5756e2
                die("missing argument for --clone option")
Packit 5756e2
            if argv[0] in ["id", "uuid"]:
Packit 5756e2
                match_type = argv[0]
Packit 5756e2
                if len(argv) < 3:
Packit 5756e2
                    die('missing argument for "--clone %s" option' % (match_type))
Packit 5756e2
                argv = argv[1:]
Packit 5756e2
            if cons:
Packit 5756e2
                die("cannot specify --clone argument more than once")
Packit 5756e2
            cons.extend(find_connections(nm_client, match_type, argv[1]))
Packit 5756e2
            if len(cons) == 0:
Packit 5756e2
                die(
Packit 5756e2
                    'could not find connection for "--clone %s%s"'
Packit 5756e2
                    % ((match_type or ""), argv[1])
Packit 5756e2
                )
Packit 5756e2
            if len(cons) != 1:
Packit 5756e2
                die(
Packit 5756e2
                    'could not find unique connection for "--clone %s%s"'
Packit 5756e2
                    % ((match_type or ""), argv[1])
Packit 5756e2
                )
Packit 5756e2
            argv = argv[2:]
Packit 5756e2
            continue
Packit 5756e2
        if argv[0] in ["--block-autoconnect"]:
Packit 5756e2
            arg_block_autoconnect = NM.SettingsAddConnection2Flags.BLOCK_AUTOCONNECT
Packit 5756e2
            argv = argv[1:]
Packit 5756e2
            continue
Packit 5756e2
        if argv[0] in ["--to-disk", "--in-memory"]:
Packit 5756e2
            if argv[0] == "--to-disk":
Packit 5756e2
                v = NM.SettingsAddConnection2Flags.TO_DISK
Packit 5756e2
            elif argv[0] == "--in-memory":
Packit 5756e2
                v = NM.SettingsAddConnection2Flags.IN_MEMORY
Packit 5756e2
            else:
Packit 5756e2
                assert False
Packit 5756e2
            if arg_mode is not None:
Packit 5756e2
                die('duplicate storage modes ("%s")' % (argv[0]))
Packit 5756e2
            arg_mode = v
Packit 5756e2
            argv = argv[1:]
Packit 5756e2
            continue
Packit 5756e2
        if argv[0] in ["--id"]:
Packit 5756e2
            if len(argv) < 2:
Packit 5756e2
                die("missing argument for --id option")
Packit 5756e2
            arg_id = argv[1]
Packit 5756e2
            argv = argv[2:]
Packit 5756e2
            continue
Packit 5756e2
        if argv[0] in ["--uuid"]:
Packit 5756e2
            if len(argv) < 2:
Packit 5756e2
                die("missing argument for --uuid option")
Packit 5756e2
            arg_uuid = argv[1]
Packit 5756e2
            argv = argv[2:]
Packit 5756e2
            continue
Packit 5756e2
        die('unknown argument "%s"' % (argv[0]))
Packit 5756e2
Packit 5756e2
    if len(cons) != 1:
Packit 5756e2
        die("missing --clone argument", True)
Packit 5756e2
Packit 5756e2
    con = cons[0]
Packit 5756e2
Packit 5756e2
    con2 = NM.SimpleConnection.new_clone(con)
Packit 5756e2
Packit 5756e2
    s_con = con2.get_setting_connection()
Packit 5756e2
    if arg_id:
Packit 5756e2
        s_con.set_property(NM.SETTING_CONNECTION_ID, arg_id)
Packit 5756e2
    s_con.set_property(NM.SETTING_CONNECTION_UUID, arg_uuid or NM.utils_uuid_generate())
Packit 5756e2
Packit 5756e2
    result = {}
Packit 5756e2
Packit 5756e2
    def _add_connection2_cb(cl, async_result, user_data):
Packit 5756e2
        try:
Packit 5756e2
            c, r = nm_client.add_connection2_finish(async_result)
Packit 5756e2
        except Exception as e:
Packit 5756e2
            result["error"] = e
Packit 5756e2
        else:
Packit 5756e2
            result["result"] = r
Packit 5756e2
            result["connection"] = c
Packit 5756e2
        main_loop.quit()
Packit 5756e2
Packit 5756e2
    nm_client.add_connection2(
Packit 5756e2
        con2.to_dbus(NM.ConnectionSerializationFlags.ALL),
Packit 5756e2
        (arg_mode if arg_mode is not None else NM.SettingsAddConnection2Flags.TO_DISK)
Packit 5756e2
        | arg_block_autoconnect,
Packit 5756e2
        None,
Packit 5756e2
        False,
Packit 5756e2
        None,
Packit 5756e2
        _add_connection2_cb,
Packit 5756e2
        None,
Packit 5756e2
    )
Packit 5756e2
Packit 5756e2
    main_loop.run()
Packit 5756e2
Packit 5756e2
    if "error" in result:
Packit 5756e2
        die(
Packit 5756e2
            "update connection %s failed [%s]: %s"
Packit 5756e2
            % (con_to_str(con2), " ".join(sys.argv), result["error"])
Packit 5756e2
        )
Packit 5756e2
Packit 5756e2
    print(
Packit 5756e2
        "update connection %s succeeded [%s]: %s, %s"
Packit 5756e2
        % (
Packit 5756e2
            con_to_str(con2),
Packit 5756e2
            " ".join(sys.argv),
Packit 5756e2
            result["connection"].get_path(),
Packit 5756e2
            result["result"],
Packit 5756e2
        )
Packit 5756e2
    )
Packit 5756e2
Packit 5756e2
Packit 5756e2
if __name__ == "__main__":
Packit 5756e2
    main()