1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-22 06:50:18 +03:00

udev-varlink: allow to enable/disable trace logging through varlink

This introduces io.systemd.Udev.SetTrace varlink method. With the
method, trace logging by udev worker can be dynamically controlled.
This commit is contained in:
Yu Watanabe 2025-01-12 01:43:12 +09:00
parent 695c592a03
commit 993b481ad1
4 changed files with 44 additions and 0 deletions

View File

@ -2,6 +2,11 @@
#include "varlink-io.systemd.Udev.h"
static SD_VARLINK_DEFINE_METHOD(
SetTrace,
SD_VARLINK_FIELD_COMMENT("Enable/disable."),
SD_VARLINK_DEFINE_INPUT(enable, SD_VARLINK_BOOL, 0));
static SD_VARLINK_DEFINE_METHOD(
SetChildrenMax,
SD_VARLINK_FIELD_COMMENT("The maximum number of child processes. When 0 is specified, the maximum is determined based on the system resources."),
@ -22,6 +27,8 @@ SD_VARLINK_DEFINE_INTERFACE(
io_systemd_Udev,
"io.systemd.Udev",
SD_VARLINK_INTERFACE_COMMENT("An interface for controlling systemd-udevd."),
SD_VARLINK_SYMBOL_COMMENT("Enable/disable trace logging."),
&vl_method_SetTrace,
SD_VARLINK_SYMBOL_COMMENT("Sets the maximum number of child processes."),
&vl_method_SetChildrenMax,
SD_VARLINK_SYMBOL_COMMENT("Sets the global udev properties."),

View File

@ -345,6 +345,21 @@ void manager_set_log_level(Manager *manager, int log_level) {
manager_kill_workers(manager, /* force = */ false);
}
void manager_set_trace(Manager *manager, bool enable) {
assert(manager);
bool old = manager->config.trace;
manager->config_by_control.trace = enable;
manager_merge_config_log_level(manager);
if (manager->config.trace == old)
return;
log_set_max_level(manager->config.log_level);
manager_kill_workers(manager, /* force = */ false);
}
static void manager_adjust_config(UdevConfig *config) {
assert(config);

View File

@ -29,6 +29,7 @@ typedef struct UdevConfig {
void manager_set_children_max(Manager *manager, unsigned n);
void manager_set_log_level(Manager *manager, int log_level);
void manager_set_trace(Manager *manager, bool enable);
void manager_set_environment(Manager *manager, char * const *v);
int manager_load(Manager *manager, int argc, char *argv[]);

View File

@ -43,6 +43,26 @@ static int vl_method_set_log_level(sd_varlink *link, sd_json_variant *parameters
return sd_varlink_reply(link, NULL);
}
static int vl_method_set_trace(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
bool enable;
int r;
static const sd_json_dispatch_field dispatch_table[] = {
{ "enable", SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, 0, SD_JSON_MANDATORY },
{}
};
assert(link);
r = sd_varlink_dispatch(link, parameters, dispatch_table, &enable);
if (r != 0)
return r;
log_debug("Received io.systemd.service.SetTrace(%s)", yes_no(enable));
manager_set_trace(userdata, enable);
return sd_varlink_reply(link, NULL);
}
static int vl_method_set_children_max(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
unsigned n;
int r;
@ -160,6 +180,7 @@ int manager_start_varlink_server(Manager *manager) {
"io.systemd.service.Reload", vl_method_reload,
"io.systemd.service.SetLogLevel", vl_method_set_log_level,
"io.systemd.service.GetEnvironment", varlink_method_get_environment,
"io.systemd.Udev.SetTrace", vl_method_set_trace,
"io.systemd.Udev.SetChildrenMax", vl_method_set_children_max,
"io.systemd.Udev.SetEnvironment", vl_method_set_environment,
"io.systemd.Udev.StartExecQueue", vl_method_start_stop_exec_queue,