From 4ffe0aedf9332955228ee9257debd6cc3dea1882 Mon Sep 17 00:00:00 2001 From: David Tardon Date: Mon, 30 Oct 2023 10:35:45 +0100 Subject: [PATCH 1/3] varlink: define interface io.systemd.service --- src/shared/meson.build | 1 + src/shared/varlink-io.systemd.service.c | 18 ++++++++++++++++++ src/shared/varlink-io.systemd.service.h | 6 ++++++ src/test/test-varlink-idl.c | 3 +++ 4 files changed, 28 insertions(+) create mode 100644 src/shared/varlink-io.systemd.service.c create mode 100644 src/shared/varlink-io.systemd.service.h diff --git a/src/shared/meson.build b/src/shared/meson.build index 5b20155b24..0ef34d4bc8 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -176,6 +176,7 @@ shared_sources = files( 'varlink-io.systemd.Resolve.c', 'varlink-io.systemd.UserDatabase.c', 'varlink-io.systemd.oom.c', + 'varlink-io.systemd.service.c', 'varlink-io.systemd.sysext.c', 'varlink-org.varlink.service.c', 'verb-log-control.c', diff --git a/src/shared/varlink-io.systemd.service.c b/src/shared/varlink-io.systemd.service.c new file mode 100644 index 0000000000..5831581445 --- /dev/null +++ b/src/shared/varlink-io.systemd.service.c @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "varlink-io.systemd.service.h" + +static VARLINK_DEFINE_METHOD(Ping); + +static VARLINK_DEFINE_METHOD(Reload); + +static VARLINK_DEFINE_METHOD( + SetLogLevel, + VARLINK_DEFINE_INPUT(level, VARLINK_INT, 0)); + +VARLINK_DEFINE_INTERFACE( + io_systemd_service, + "io.systemd.service", + &vl_method_Ping, + &vl_method_Reload, + &vl_method_SetLogLevel); diff --git a/src/shared/varlink-io.systemd.service.h b/src/shared/varlink-io.systemd.service.h new file mode 100644 index 0000000000..1f599d2cb4 --- /dev/null +++ b/src/shared/varlink-io.systemd.service.h @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#pragma once + +#include "varlink-idl.h" + +extern const VarlinkInterface vl_interface_io_systemd_service; diff --git a/src/test/test-varlink-idl.c b/src/test/test-varlink-idl.c index 670fc0515d..167e8eaff6 100644 --- a/src/test/test-varlink-idl.c +++ b/src/test/test-varlink-idl.c @@ -15,6 +15,7 @@ #include "varlink-io.systemd.Resolve.h" #include "varlink-io.systemd.UserDatabase.h" #include "varlink-io.systemd.oom.h" +#include "varlink-io.systemd.service.h" #include "varlink-io.systemd.sysext.h" #include "varlink-org.varlink.service.h" @@ -138,6 +139,8 @@ TEST(parse_format) { print_separator(); test_parse_format_one(&vl_interface_io_systemd_PCRExtend); print_separator(); + test_parse_format_one(&vl_interface_io_systemd_service); + print_separator(); test_parse_format_one(&vl_interface_io_systemd_sysext); print_separator(); test_parse_format_one(&vl_interface_xyz_test); From ca46756cd80d34fac3f8ce9b3b126e537b09112f Mon Sep 17 00:00:00 2001 From: David Tardon Date: Mon, 30 Oct 2023 10:42:17 +0100 Subject: [PATCH 2/3] varlink: add generic impl. of io.systemd.varlink.Ping() --- src/shared/varlink-io.systemd.service.c | 11 +++++++++++ src/shared/varlink-io.systemd.service.h | 3 +++ 2 files changed, 14 insertions(+) diff --git a/src/shared/varlink-io.systemd.service.c b/src/shared/varlink-io.systemd.service.c index 5831581445..4b3240da7c 100644 --- a/src/shared/varlink-io.systemd.service.c +++ b/src/shared/varlink-io.systemd.service.c @@ -16,3 +16,14 @@ VARLINK_DEFINE_INTERFACE( &vl_method_Ping, &vl_method_Reload, &vl_method_SetLogLevel); + +int varlink_method_ping(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata) { + assert(link); + + if (json_variant_elements(parameters) > 0) + return varlink_error_invalid_parameter(link, parameters); + + log_debug("Received io.systemd.service.Ping"); + + return varlink_reply(link, NULL); +} diff --git a/src/shared/varlink-io.systemd.service.h b/src/shared/varlink-io.systemd.service.h index 1f599d2cb4..6433fd12fb 100644 --- a/src/shared/varlink-io.systemd.service.h +++ b/src/shared/varlink-io.systemd.service.h @@ -1,6 +1,9 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once +#include "varlink.h" #include "varlink-idl.h" extern const VarlinkInterface vl_interface_io_systemd_service; + +int varlink_method_ping(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata); From 126305512159400ec294d151e8d59052c80d42bd Mon Sep 17 00:00:00 2001 From: David Tardon Date: Tue, 31 Oct 2023 09:30:25 +0100 Subject: [PATCH 3/3] varlink: add generic impl. of io.systemd.service.SetLogLevel() --- src/shared/varlink-io.systemd.service.c | 41 +++++++++++++++++++++++++ src/shared/varlink-io.systemd.service.h | 1 + 2 files changed, 42 insertions(+) diff --git a/src/shared/varlink-io.systemd.service.c b/src/shared/varlink-io.systemd.service.c index 4b3240da7c..675f949929 100644 --- a/src/shared/varlink-io.systemd.service.c +++ b/src/shared/varlink-io.systemd.service.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ +#include + #include "varlink-io.systemd.service.h" static VARLINK_DEFINE_METHOD(Ping); @@ -27,3 +29,42 @@ int varlink_method_ping(Varlink *link, JsonVariant *parameters, VarlinkMethodFla return varlink_reply(link, NULL); } + +int varlink_method_set_log_level(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata) { + static const JsonDispatch dispatch_table[] = { + {"level", JSON_VARIANT_INTEGER, json_dispatch_int64, 0, JSON_MANDATORY}, + {} + }; + + int64_t level; + uid_t uid; + int r; + + assert(link); + assert(parameters); + + /* NOTE: The method does have 1 parameter, but we must compare to 2 here, because + * json_variant_elements() breaks abstraction and exposes internal structure of JsonObject. */ + if (json_variant_elements(parameters) != 2) + return varlink_error_invalid_parameter(link, parameters); + + r = json_dispatch(parameters, dispatch_table, NULL, 0, &level); + if (r < 0) + return r; + + if (LOG_PRI(level) != level) + return varlink_error_invalid_parameter(link, parameters); + + r = varlink_get_peer_uid(link, &uid); + if (r < 0) + return r; + + if (uid != getuid() && uid != 0) + return varlink_error(link, VARLINK_ERROR_PERMISSION_DENIED, parameters); + + log_debug("Received io.systemd.service.SetLogLevel(%" PRIi64 ")", level); + + log_set_max_level(level); + + return varlink_reply(link, NULL); +} diff --git a/src/shared/varlink-io.systemd.service.h b/src/shared/varlink-io.systemd.service.h index 6433fd12fb..bc90ff0986 100644 --- a/src/shared/varlink-io.systemd.service.h +++ b/src/shared/varlink-io.systemd.service.h @@ -7,3 +7,4 @@ extern const VarlinkInterface vl_interface_io_systemd_service; int varlink_method_ping(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata); +int varlink_method_set_log_level(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata);