core: do not "warn" about mundane emergency actions
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 17 Oct 2018 15:27:20 +0000 (17:27 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 17 Oct 2018 17:32:09 +0000 (19:32 +0200)
For example in a container we'd log:
Oct 17 17:01:10 rawhide systemd[1]: Started Power-Off.
Oct 17 17:01:10 rawhide systemd[1]: Forcibly powering off: unit succeeded
Oct 17 17:01:10 rawhide systemd[1]: Reached target Power-Off.
Oct 17 17:01:10 rawhide systemd[1]: Shutting down.
and on the console we'd write (in red)
[  !!  ] Forcibly powering off: unit succeeded

This is not useful in any way, and the fact that we're calling an "emergency action"
is an internal implementation detail. Let's log about c-a-d and the watchdog actions
only.

src/core/emergency-action.c
src/core/emergency-action.h
src/core/job.c
src/core/manager.c
src/core/unit.c

index e12ff81..c91d2bf 100644 (file)
 #include "terminal-util.h"
 #include "virt.h"
 
-static void log_and_status(Manager *m, const char *message, const char *reason) {
-        log_warning("%s: %s", message, reason);
-        manager_status_printf(m, STATUS_TYPE_EMERGENCY,
-                              ANSI_HIGHLIGHT_RED "  !!  " ANSI_NORMAL,
-                              "%s: %s", message, reason);
+static void log_and_status(Manager *m, bool warn, const char *message, const char *reason) {
+        log_full(warn ? LOG_WARNING : LOG_DEBUG, "%s: %s", message, reason);
+        if (warn)
+                manager_status_printf(m, STATUS_TYPE_EMERGENCY,
+                                      ANSI_HIGHLIGHT_RED "  !!  " ANSI_NORMAL,
+                                      "%s: %s", message, reason);
 }
 
 int emergency_action(
@@ -38,10 +39,12 @@ int emergency_action(
                 return -ECANCELED;
         }
 
+        bool warn = FLAGS_SET(options, EMERGENCY_ACTION_WARN);
+
         switch (action) {
 
         case EMERGENCY_ACTION_REBOOT:
-                log_and_status(m, "Rebooting", reason);
+                log_and_status(m, warn, "Rebooting", reason);
 
                 (void) update_reboot_parameter_and_warn(reboot_arg);
                 (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_REBOOT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL);
@@ -49,7 +52,7 @@ int emergency_action(
                 break;
 
         case EMERGENCY_ACTION_REBOOT_FORCE:
-                log_and_status(m, "Forcibly rebooting", reason);
+                log_and_status(m, warn, "Forcibly rebooting", reason);
 
                 (void) update_reboot_parameter_and_warn(reboot_arg);
                 m->objective = MANAGER_REBOOT;
@@ -57,7 +60,7 @@ int emergency_action(
                 break;
 
         case EMERGENCY_ACTION_REBOOT_IMMEDIATE:
-                log_and_status(m, "Rebooting immediately", reason);
+                log_and_status(m, warn, "Rebooting immediately", reason);
 
                 sync();
 
@@ -73,7 +76,7 @@ int emergency_action(
 
         case EMERGENCY_ACTION_EXIT:
                 if (MANAGER_IS_USER(m) || detect_container() > 0) {
-                        log_and_status(m, "Exiting", reason);
+                        log_and_status(m, warn, "Exiting", reason);
                         (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_EXIT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL);
                         break;
                 }
@@ -82,13 +85,13 @@ int emergency_action(
                 _fallthrough_;
 
         case EMERGENCY_ACTION_POWEROFF:
-                log_and_status(m, "Powering off", reason);
+                log_and_status(m, warn, "Powering off", reason);
                 (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL);
                 break;
 
         case EMERGENCY_ACTION_EXIT_FORCE:
                 if (MANAGER_IS_USER(m) || detect_container() > 0) {
-                        log_and_status(m, "Exiting immediately", reason);
+                        log_and_status(m, warn, "Exiting immediately", reason);
                         m->objective = MANAGER_EXIT;
                         break;
                 }
@@ -97,12 +100,12 @@ int emergency_action(
                 _fallthrough_;
 
         case EMERGENCY_ACTION_POWEROFF_FORCE:
-                log_and_status(m, "Forcibly powering off", reason);
+                log_and_status(m, warn, "Forcibly powering off", reason);
                 m->objective = MANAGER_POWEROFF;
                 break;
 
         case EMERGENCY_ACTION_POWEROFF_IMMEDIATE:
-                log_and_status(m, "Powering off immediately", reason);
+                log_and_status(m, warn, "Powering off immediately", reason);
 
                 sync();
 
index 453de0d..1fc4a11 100644 (file)
@@ -18,6 +18,7 @@ typedef enum EmergencyAction {
 
 typedef enum EmergencyActionFlags {
         EMERGENCY_ACTION_IS_WATCHDOG = 1 << 0,
+        EMERGENCY_ACTION_WARN        = 1 << 1,
 } EmergencyActionFlags;
 
 #include "macro.h"
index 23717d5..5a88f52 100644 (file)
@@ -973,7 +973,8 @@ static int job_dispatch_timer(sd_event_source *s, uint64_t monotonic, void *user
         u = j->unit;
         job_finish_and_invalidate(j, JOB_TIMEOUT, true, false);
 
-        emergency_action(u->manager, u->job_timeout_action, EMERGENCY_ACTION_IS_WATCHDOG,
+        emergency_action(u->manager, u->job_timeout_action,
+                         EMERGENCY_ACTION_IS_WATCHDOG|EMERGENCY_ACTION_WARN,
                          u->job_timeout_reboot_arg, "job timed out");
 
         return 0;
index 0c3109b..94e38be 100644 (file)
@@ -2538,7 +2538,7 @@ static void manager_handle_ctrl_alt_del(Manager *m) {
         if (ratelimit_below(&m->ctrl_alt_del_ratelimit) || m->cad_burst_action == EMERGENCY_ACTION_NONE)
                 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
         else
-                emergency_action(m, m->cad_burst_action, 0, NULL, 
+                emergency_action(m, m->cad_burst_action, EMERGENCY_ACTION_WARN, NULL,
                                 "Ctrl-Alt-Del was pressed more than 7 times within 2s");
 }
 
index 0806a50..0ce9318 100644 (file)
@@ -1724,7 +1724,8 @@ int unit_start_limit_test(Unit *u) {
         log_unit_warning(u, "Start request repeated too quickly.");
         u->start_limit_hit = true;
 
-        return emergency_action(u->manager, u->start_limit_action, EMERGENCY_ACTION_IS_WATCHDOG,
+        return emergency_action(u->manager, u->start_limit_action,
+                                EMERGENCY_ACTION_IS_WATCHDOG|EMERGENCY_ACTION_WARN,
                                 u->reboot_arg, "unit failed");
 }