1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
#!/usr/bin/env python
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Copyright (C) 2019 Red Hat, Inc.
#
import sys
import gi
gi.require_version("NM", "1.0")
from gi.repository import GLib, NM
def find_connections(nm_client, arg_type, arg_id):
for c in nm_client.get_connections():
if arg_type in [None, "id"] and c.get_id() == arg_id:
yield c
if arg_type in [None, "uuid"] and c.get_uuid() == arg_id:
yield c
def find_connection_first(nm_client, arg_type, arg_id):
for f in find_connections(nm_client, arg_type, arg_id):
return f
def con_to_str(con):
s_con = con.get_setting_connection()
return '"%s" (%s)' % (s_con.get_id(), s_con.get_uuid())
def usage():
arg0 = sys.argv[0]
arg0_spaced = " " * len(arg0)
print("Usage: %s [ --clone ( [id] <id> | [uuid] <uuid> ) ] \\" % (arg0))
print(" %s [ --to-disk | --in-memory ] \\" % (arg0_spaced))
print(" %s [ --block-autoconnect ] \\" % (arg0_spaced))
print(" %s [ --id <new-id> ] \\" % (arg0_spaced))
print(" %s [ --uuid <new-uuid> ] \\" % (arg0_spaced))
return 1
def die(msg, print_usage=False):
print(msg)
if print_usage:
usage()
sys.exit(1)
def main():
main_loop = GLib.MainLoop()
nm_client = NM.Client.new(None)
arg_mode = None
arg_block_autoconnect = NM.SettingsAddConnection2Flags.NONE
arg_id = None
arg_uuid = None
cons = []
argv = list(sys.argv[1:])
while argv:
if argv[0] == "--clone":
match_type = None
if len(argv) < 2:
die("missing argument for --clone option")
if argv[0] in ["id", "uuid"]:
match_type = argv[0]
if len(argv) < 3:
die('missing argument for "--clone %s" option' % (match_type))
argv = argv[1:]
if cons:
die("cannot specify --clone argument more than once")
cons.extend(find_connections(nm_client, match_type, argv[1]))
if len(cons) == 0:
die(
'could not find connection for "--clone %s%s"'
% ((match_type or ""), argv[1])
)
if len(cons) != 1:
die(
'could not find unique connection for "--clone %s%s"'
% ((match_type or ""), argv[1])
)
argv = argv[2:]
continue
if argv[0] in ["--block-autoconnect"]:
arg_block_autoconnect = NM.SettingsAddConnection2Flags.BLOCK_AUTOCONNECT
argv = argv[1:]
continue
if argv[0] in ["--to-disk", "--in-memory"]:
if argv[0] == "--to-disk":
v = NM.SettingsAddConnection2Flags.TO_DISK
elif argv[0] == "--in-memory":
v = NM.SettingsAddConnection2Flags.IN_MEMORY
else:
assert False
if arg_mode is not None:
die('duplicate storage modes ("%s")' % (argv[0]))
arg_mode = v
argv = argv[1:]
continue
if argv[0] in ["--id"]:
if len(argv) < 2:
die("missing argument for --id option")
arg_id = argv[1]
argv = argv[2:]
continue
if argv[0] in ["--uuid"]:
if len(argv) < 2:
die("missing argument for --uuid option")
arg_uuid = argv[1]
argv = argv[2:]
continue
die('unknown argument "%s"' % (argv[0]))
if len(cons) != 1:
die("missing --clone argument", True)
con = cons[0]
con2 = NM.SimpleConnection.new_clone(con)
s_con = con2.get_setting_connection()
if arg_id:
s_con.set_property(NM.SETTING_CONNECTION_ID, arg_id)
s_con.set_property(NM.SETTING_CONNECTION_UUID, arg_uuid or NM.utils_uuid_generate())
result = {}
def _add_connection2_cb(cl, async_result, user_data):
try:
c, r = nm_client.add_connection2_finish(async_result)
except Exception as e:
result["error"] = e
else:
result["result"] = r
result["connection"] = c
main_loop.quit()
nm_client.add_connection2(
con2.to_dbus(NM.ConnectionSerializationFlags.ALL),
(arg_mode if arg_mode is not None else NM.SettingsAddConnection2Flags.TO_DISK)
| arg_block_autoconnect,
None,
False,
None,
_add_connection2_cb,
None,
)
main_loop.run()
if "error" in result:
die(
"update connection %s failed [%s]: %s"
% (con_to_str(con2), " ".join(sys.argv), result["error"])
)
print(
"update connection %s succeeded [%s]: %s, %s"
% (
con_to_str(con2),
" ".join(sys.argv),
result["connection"].get_path(),
result["result"],
)
)
if __name__ == "__main__":
main()
|