|
Packit Service |
b23acc |
#!/usr/bin/env python
|
|
Packit Service |
b23acc |
# SPDX-License-Identifier: GPL-2.0+
|
|
Packit Service |
b23acc |
#
|
|
Packit Service |
b23acc |
# Copyright (C) 2017 Red Hat, Inc.
|
|
Packit Service |
b23acc |
#
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#
|
|
Packit Service |
b23acc |
# set and show user-data for a connection:
|
|
Packit Service |
b23acc |
#
|
|
Packit Service |
b23acc |
# - Show all user data for all connections:
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py
|
|
Packit Service |
b23acc |
# - Filter to show only connections with matching id or uuid
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py id my-connection
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py uuid 123e4567-e89b-12d3-a456-426655440000
|
|
Packit Service |
b23acc |
# - id and uuid can be repeated to select multiple connections
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py id my-connection1 id my-other-connection
|
|
Packit Service |
b23acc |
#
|
|
Packit Service |
b23acc |
# - Specify the user-data keys you want to see
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py id my-connection my.user.field.1
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py id my-connection my.user.field.1 my.other.userfield
|
|
Packit Service |
b23acc |
# - Prefix the field name with ~ to use a regex
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py '~^my\.user\.'
|
|
Packit Service |
b23acc |
#
|
|
Packit Service |
b23acc |
# - set the fields, you need to select exactly one connection
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py set id "$NAME" my.field.1 my-value1
|
|
Packit Service |
b23acc |
# - delete a user-setting
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py set id "$NAME" -d my.field.1
|
|
Packit Service |
b23acc |
# - set/delete multiple user data values at once
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py set id "$NAME" my.field.1 my-value1 -d my.other.field
|
|
Packit Service |
b23acc |
#
|
|
Packit Service |
b23acc |
# - libnm already client side rejects invalid values, like
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py set id "$NAME" invalid_name 'has-no-dot'
|
|
Packit Service |
b23acc |
# - to allow client side to specify invalid values and send them to the
|
|
Packit Service |
b23acc |
# server, pass --set-gobject
|
|
Packit Service |
b23acc |
# $ ./examples/python/gi/setting-user-data.py set id "$NAME" invalid_name 'has-no-dot' --set-gobject
|
|
Packit Service |
b23acc |
#
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
import sys
|
|
Packit Service |
b23acc |
import re
|
|
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 NM
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def pr(v):
|
|
Packit Service |
b23acc |
import pprint
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
pprint.pprint(v, indent=4, depth=5, width=60)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def parse_args():
|
|
Packit Service |
b23acc |
args = {"set": False, "set-gobject": False, "filter": [], "data": []}
|
|
Packit Service |
b23acc |
i = 1
|
|
Packit Service |
b23acc |
while i < len(sys.argv):
|
|
Packit Service |
b23acc |
a = sys.argv[i]
|
|
Packit Service |
b23acc |
if i == 1:
|
|
Packit Service |
b23acc |
if a in ["s", "set"]:
|
|
Packit Service |
b23acc |
args["set"] = True
|
|
Packit Service |
b23acc |
i += 1
|
|
Packit Service |
b23acc |
continue
|
|
Packit Service |
b23acc |
elif a in ["g", "get"]:
|
|
Packit Service |
b23acc |
args["set"] = False
|
|
Packit Service |
b23acc |
i += 1
|
|
Packit Service |
b23acc |
continue
|
|
Packit Service |
b23acc |
if a in ["id", "uuid"]:
|
|
Packit Service |
b23acc |
args["filter"].append((a, sys.argv[i + 1]))
|
|
Packit Service |
b23acc |
i += 2
|
|
Packit Service |
b23acc |
continue
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if a in ["--set-gobject"]:
|
|
Packit Service |
b23acc |
args["set-gobject"] = True
|
|
Packit Service |
b23acc |
i += 1
|
|
Packit Service |
b23acc |
continue
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if a == "data":
|
|
Packit Service |
b23acc |
i += 1
|
|
Packit Service |
b23acc |
a = sys.argv[i]
|
|
Packit Service |
b23acc |
if args["set"]:
|
|
Packit Service |
b23acc |
if a == "-d":
|
|
Packit Service |
b23acc |
args["data"].append((sys.argv[i + 1], None))
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
args["data"].append((a, sys.argv[i + 1]))
|
|
Packit Service |
b23acc |
i += 2
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
args["data"].append(a)
|
|
Packit Service |
b23acc |
i += 1
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return args
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def connection_to_str(connection):
|
|
Packit Service |
b23acc |
return "%s (%s)" % (connection.get_id(), connection.get_uuid())
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def connections_filter(connections, filter_data):
|
|
Packit Service |
b23acc |
connections = list(sorted(connections, key=connection_to_str))
|
|
Packit Service |
b23acc |
if not filter_data:
|
|
Packit Service |
b23acc |
return connections
|
|
Packit Service |
b23acc |
# we preserve the order of the selected connections. And
|
|
Packit Service |
b23acc |
# if connections are selected multiple times, we return
|
|
Packit Service |
b23acc |
# them multiple times.
|
|
Packit Service |
b23acc |
l = []
|
|
Packit Service |
b23acc |
for f in filter_data:
|
|
Packit Service |
b23acc |
if f[0] == "id":
|
|
Packit Service |
b23acc |
for c in connections:
|
|
Packit Service |
b23acc |
if f[1] == c.get_id():
|
|
Packit Service |
b23acc |
l.append(c)
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
assert f[0] == "uuid"
|
|
Packit Service |
b23acc |
for c in connections:
|
|
Packit Service |
b23acc |
if f[1] == c.get_uuid():
|
|
Packit Service |
b23acc |
l.append(c)
|
|
Packit Service |
b23acc |
return l
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def print_user_data(connection, data_allow_regex, data, prefix=""):
|
|
Packit Service |
b23acc |
s_u = connection.get_setting(NM.SettingUser)
|
|
Packit Service |
b23acc |
n = "none"
|
|
Packit Service |
b23acc |
keys_len = 0
|
|
Packit Service |
b23acc |
keys = []
|
|
Packit Service |
b23acc |
if s_u is not None:
|
|
Packit Service |
b23acc |
all_keys = s_u.get_keys()
|
|
Packit Service |
b23acc |
keys_len = len(all_keys)
|
|
Packit Service |
b23acc |
if data:
|
|
Packit Service |
b23acc |
for d in data:
|
|
Packit Service |
b23acc |
if data_allow_regex and len(d) > 0 and d[0] == "~":
|
|
Packit Service |
b23acc |
r = re.compile(d[1:])
|
|
Packit Service |
b23acc |
keys.extend([k for k in all_keys if r.match(k)])
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
keys.append(d)
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
keys.extend(all_keys)
|
|
Packit Service |
b23acc |
n = "%s" % (keys_len)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
print("%s%s [%s]" % (prefix, connection_to_str(connection), n))
|
|
Packit Service |
b23acc |
dd = {}
|
|
Packit Service |
b23acc |
if s_u is not None:
|
|
Packit Service |
b23acc |
dd = s_u.get_property(NM.SETTING_USER_DATA)
|
|
Packit Service |
b23acc |
for k in keys:
|
|
Packit Service |
b23acc |
if s_u is not None:
|
|
Packit Service |
b23acc |
v = s_u.get_data(k)
|
|
Packit Service |
b23acc |
if v is None:
|
|
Packit Service |
b23acc |
if k in dd:
|
|
Packit Service |
b23acc |
print('%s INVALID: "%s" = "%s"' % (prefix, k, dd[k]))
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
print('%s MISSING: "%s"' % (prefix, k))
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
assert v == dd.get(k, None)
|
|
Packit Service |
b23acc |
print('%s SET: "%s" = "%s"' % (prefix, k, v))
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
print('%s MISSING: "%s"' % (prefix, k))
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def do_get(connections, data):
|
|
Packit Service |
b23acc |
first_line = True
|
|
Packit Service |
b23acc |
connections = list(connections)
|
|
Packit Service |
b23acc |
if not connections:
|
|
Packit Service |
b23acc |
print("no matching connections (use id|uuid argument)")
|
|
Packit Service |
b23acc |
sys.exit(1)
|
|
Packit Service |
b23acc |
for c in connections:
|
|
Packit Service |
b23acc |
if first_line:
|
|
Packit Service |
b23acc |
first_line = False
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
print("")
|
|
Packit Service |
b23acc |
print_user_data(c, True, data)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
def do_set(connection, data, set_gobject):
|
|
Packit Service |
b23acc |
print_user_data(connection, False, [d[0] for d in data], prefix="BEFORE: ")
|
|
Packit Service |
b23acc |
print("")
|
|
Packit Service |
b23acc |
s_u = connection.get_setting(NM.SettingUser)
|
|
Packit Service |
b23acc |
if s_u is None:
|
|
Packit Service |
b23acc |
connection.add_setting(NM.SettingUser())
|
|
Packit Service |
b23acc |
s_u = connection.get_setting(NM.SettingUser)
|
|
Packit Service |
b23acc |
for d in data:
|
|
Packit Service |
b23acc |
key = d[0]
|
|
Packit Service |
b23acc |
val = d[1]
|
|
Packit Service |
b23acc |
if val is None:
|
|
Packit Service |
b23acc |
print(' DEL: "%s"' % (key))
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
print(' SET: "%s" = "%s"' % (key, val))
|
|
Packit Service |
b23acc |
if set_gobject:
|
|
Packit Service |
b23acc |
d = s_u.get_property(NM.SETTING_USER_DATA)
|
|
Packit Service |
b23acc |
if val is None:
|
|
Packit Service |
b23acc |
d.pop(key, None)
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
d[key] = val
|
|
Packit Service |
b23acc |
s_u.set_property(NM.SETTING_USER_DATA, d)
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
try:
|
|
Packit Service |
b23acc |
s_u.set_data(key, val)
|
|
Packit Service |
b23acc |
except Exception as e:
|
|
Packit Service |
b23acc |
if val is None:
|
|
Packit Service |
b23acc |
print('error deleting key "%s": %s' % (key, e))
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
print('error setting key "%s" = "%s": %s' % (key, val, e))
|
|
Packit Service |
b23acc |
sys.exit(1)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
try:
|
|
Packit Service |
b23acc |
connection.commit_changes(True, None)
|
|
Packit Service |
b23acc |
except Exception as e:
|
|
Packit Service |
b23acc |
print("failure to commit connection: %s" % (e))
|
|
Packit Service |
b23acc |
sys.exit(1)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
print("")
|
|
Packit Service |
b23acc |
print_user_data(connection, False, [d[0] for d in data], prefix="AFTER: ")
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
###############################################################################
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if __name__ == "__main__":
|
|
Packit Service |
b23acc |
args = parse_args()
|
|
Packit Service |
b23acc |
nm_client = NM.Client.new(None)
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
connections = connections_filter(nm_client.get_connections(), args["filter"])
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if args["set"]:
|
|
Packit Service |
b23acc |
if not args["data"]:
|
|
Packit Service |
b23acc |
print("Requires one or more arguments to set or delete")
|
|
Packit Service |
b23acc |
sys.exit(1)
|
|
Packit Service |
b23acc |
if len(connections) != 1:
|
|
Packit Service |
b23acc |
print(
|
|
Packit Service |
b23acc |
"To set the user-data of a connection, exactly one connection must be selected via id|uuid. Instead, %s connection matched ([%s])"
|
|
Packit Service |
b23acc |
% (
|
|
Packit Service |
b23acc |
len(connections),
|
|
Packit Service |
b23acc |
", ".join([connection_to_str(c) for c in connections]),
|
|
Packit Service |
b23acc |
)
|
|
Packit Service |
b23acc |
)
|
|
Packit Service |
b23acc |
sys.exit(1)
|
|
Packit Service |
b23acc |
do_set(connections[0], args["data"], args["set-gobject"])
|
|
Packit Service |
b23acc |
else:
|
|
Packit Service |
b23acc |
do_get(connections, args["data"])
|