]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev-varlink: allow to enable/disable trace logging through varlink
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 11 Jan 2025 16:43:12 +0000 (01:43 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 20 Jan 2025 19:12:18 +0000 (04:12 +0900)
This introduces io.systemd.Udev.SetTrace varlink method. With the
method, trace logging by udev worker can be dynamically controlled.

src/shared/varlink-io.systemd.Udev.c
src/udev/udev-config.c
src/udev/udev-config.h
src/udev/udev-varlink.c

index fb34036b426080d1ff0497e807705e96d67ae117..09c1ca70ce1dac1ab9c01e4077925b09bebbd5ba 100644 (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."),
index 19d57526db040991e4122eff4f4ed62d396e501e..6f02d25f455c96aeae120d66a39f7cc9027e2046 100644 (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);
 
index 9e8a48dae2aaf162dc368c9925d1897c0f19b8cf..fd31979f6d7e9875ebc08ee6805aad3d000fa2d9 100644 (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[]);
index 5d1a27219f57a4c3972c4d88669e2591cb7decbb..41f7fe08f936e51d809b091d2bcea4e219ead7bd 100644 (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,