|
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()
|