From 6ab863190dee5ab631795ef547fcc7314ddccd40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 15 Nov 2019 10:14:57 +0100 Subject: [PATCH] systemctl: add service-watchdogs command The rationale is the same as for log-level/log-target: this controls the behaviour of the manager, and belongs in systemctl. --- man/systemctl.xml | 11 ++++++++ src/analyze/analyze.c | 37 +++++++++++++-------------- src/systemctl/systemctl.c | 53 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 20 deletions(-) diff --git a/man/systemctl.xml b/man/systemctl.xml index 0c0eee5552..fb0ca46620 100644 --- a/man/systemctl.xml +++ b/man/systemctl.xml @@ -1088,6 +1088,17 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err systemd1). + + + service-watchdogs [yes|no] + + If no argument is given, print the current state of service runtime watchdogs of + the manager. If an optional boolean argument is provided, then globally enables or disables the + service runtime watchdogs () and emergency actions (e.g. + or ); see + systemd.service5. + The hardware watchdog is not affected by this setting. + diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index e725878b03..b242f70b37 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -2166,8 +2166,8 @@ static int service_watchdogs(int argc, char *argv[], void *userdata) { if (r < 0) return log_error_errno(r, "Failed to create bus connection: %m"); - /* get ServiceWatchdogs */ if (argc == 1) { + /* get ServiceWatchdogs */ r = sd_bus_get_property_trivial( bus, "org.freedesktop.systemd1", @@ -2182,28 +2182,25 @@ static int service_watchdogs(int argc, char *argv[], void *userdata) { printf("%s\n", yes_no(!!b)); - return 0; - } + } else { + /* set ServiceWatchdogs */ + b = parse_boolean(argv[1]); + if (b < 0) + return log_error_errno(b, "Failed to parse service-watchdogs argument: %m"); - /* set ServiceWatchdogs */ - b = parse_boolean(argv[1]); - if (b < 0) { - log_error("Failed to parse service-watchdogs argument."); - return -EINVAL; + r = sd_bus_set_property( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "ServiceWatchdogs", + &error, + "b", + b); + if (r < 0) + return log_error_errno(r, "Failed to set service-watchdog state: %s", bus_error_message(&error, r)); } - r = sd_bus_set_property( - bus, - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "ServiceWatchdogs", - &error, - "b", - b); - if (r < 0) - return log_error_errno(r, "Failed to set service-watchdog state: %s", bus_error_message(&error, r)); - return 0; } diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 96de89e307..a771c75f5f 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -6431,6 +6431,57 @@ static int log_target(int argc, char *argv[], void *userdata) { return 0; } +static int service_watchdogs(int argc, char *argv[], void *userdata) { + sd_bus *bus; + _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; + int b, r; + + assert(argv); + + r = acquire_bus(BUS_MANAGER, &bus); + if (r < 0) + return r; + + if (argc == 1) { + /* get ServiceWatchdogs */ + r = sd_bus_get_property_trivial( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "ServiceWatchdogs", + &error, + 'b', + &b); + if (r < 0) + return log_error_errno(r, "Failed to get service-watchdog state: %s", bus_error_message(&error, r)); + + printf("%s\n", yes_no(!!b)); + + } else { + /* set ServiceWatchdogs */ + assert(argc == 2); + + b = parse_boolean(argv[1]); + if (b < 0) + return log_error_errno(b, "Failed to parse service-watchdogs argument: %m"); + + r = sd_bus_set_property( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "ServiceWatchdogs", + &error, + "b", + b); + if (r < 0) + return log_error_errno(r, "Failed to set service-watchdog state: %s", bus_error_message(&error, r)); + } + + return 0; +} + static int set_environment(int argc, char *argv[], void *userdata) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; @@ -7854,6 +7905,7 @@ static int systemctl_help(void) { " daemon-reexec Reexecute systemd manager\n" " log-level [LEVEL] Get/set logging threshold for manager\n" " log-target [TARGET] Get/set logging target for manager\n" + " service-watchdogs [BOOL] Get/set service watchdog state\n" "\n%3$sSystem Commands:%4$s\n" " is-system-running Check whether system is fully running\n" " default Enter system default mode\n" @@ -9078,6 +9130,7 @@ static int systemctl_main(int argc, char *argv[]) { { "daemon-reexec", VERB_ANY, 1, VERB_ONLINE_ONLY, daemon_reload }, { "log-level", VERB_ANY, 2, 0, log_level }, { "log-target", VERB_ANY, 2, 0, log_target }, + { "service-watchdogs", VERB_ANY, 2, 0, service_watchdogs }, { "show-environment", VERB_ANY, 1, VERB_ONLINE_ONLY, show_environment }, { "set-environment", 2, VERB_ANY, VERB_ONLINE_ONLY, set_environment }, { "unset-environment", 2, VERB_ANY, VERB_ONLINE_ONLY, set_environment },