b8c242
From c8e9877d14c8742cc3732d305af2422f8a16f47d Mon Sep 17 00:00:00 2001
b8c242
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
b8c242
Date: Wed, 17 Oct 2018 17:27:20 +0200
b8c242
Subject: [PATCH] core: do not "warn" about mundane emergency actions
b8c242
b8c242
For example in a container we'd log:
b8c242
Oct 17 17:01:10 rawhide systemd[1]: Started Power-Off.
b8c242
Oct 17 17:01:10 rawhide systemd[1]: Forcibly powering off: unit succeeded
b8c242
Oct 17 17:01:10 rawhide systemd[1]: Reached target Power-Off.
b8c242
Oct 17 17:01:10 rawhide systemd[1]: Shutting down.
b8c242
and on the console we'd write (in red)
b8c242
[  !!  ] Forcibly powering off: unit succeeded
b8c242
b8c242
This is not useful in any way, and the fact that we're calling an "emergency action"
b8c242
is an internal implementation detail. Let's log about c-a-d and the watchdog actions
b8c242
only.
b8c242
b8c242
(cherry picked from commit c7adcb1af9946d0672c16bb4bb7eedf39b3d1fcb)
b8c242
b8c242
Related: #1860899
b8c242
---
b8c242
 src/core/emergency-action.c | 29 ++++++++++++++++-------------
b8c242
 src/core/emergency-action.h |  1 +
b8c242
 src/core/job.c              |  3 ++-
b8c242
 src/core/manager.c          |  2 +-
b8c242
 src/core/unit.c             |  3 ++-
b8c242
 5 files changed, 22 insertions(+), 16 deletions(-)
b8c242
b8c242
diff --git a/src/core/emergency-action.c b/src/core/emergency-action.c
b8c242
index 44b92ae6f8..fea1cb83db 100644
b8c242
--- a/src/core/emergency-action.c
b8c242
+++ b/src/core/emergency-action.c
b8c242
@@ -15,11 +15,12 @@
b8c242
 #include "terminal-util.h"
b8c242
 #include "virt.h"
b8c242
 
b8c242
-static void log_and_status(Manager *m, const char *message, const char *reason) {
b8c242
-        log_warning("%s: %s", message, reason);
b8c242
-        manager_status_printf(m, STATUS_TYPE_EMERGENCY,
b8c242
-                              ANSI_HIGHLIGHT_RED "  !!  " ANSI_NORMAL,
b8c242
-                              "%s: %s", message, reason);
b8c242
+static void log_and_status(Manager *m, bool warn, const char *message, const char *reason) {
b8c242
+        log_full(warn ? LOG_WARNING : LOG_DEBUG, "%s: %s", message, reason);
b8c242
+        if (warn)
b8c242
+                manager_status_printf(m, STATUS_TYPE_EMERGENCY,
b8c242
+                                      ANSI_HIGHLIGHT_RED "  !!  " ANSI_NORMAL,
b8c242
+                                      "%s: %s", message, reason);
b8c242
 }
b8c242
 
b8c242
 int emergency_action(
b8c242
@@ -41,17 +42,19 @@ int emergency_action(
b8c242
                 return -ECANCELED;
b8c242
         }
b8c242
 
b8c242
+        bool warn = FLAGS_SET(options, EMERGENCY_ACTION_WARN);
b8c242
+
b8c242
         switch (action) {
b8c242
 
b8c242
         case EMERGENCY_ACTION_REBOOT:
b8c242
-                log_and_status(m, "Rebooting", reason);
b8c242
+                log_and_status(m, warn, "Rebooting", reason);
b8c242
 
b8c242
                 (void) update_reboot_parameter_and_warn(reboot_arg);
b8c242
                 (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_REBOOT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL, NULL);
b8c242
                 break;
b8c242
 
b8c242
         case EMERGENCY_ACTION_REBOOT_FORCE:
b8c242
-                log_and_status(m, "Forcibly rebooting", reason);
b8c242
+                log_and_status(m, warn, "Forcibly rebooting", reason);
b8c242
 
b8c242
                 (void) update_reboot_parameter_and_warn(reboot_arg);
b8c242
                 m->exit_code = MANAGER_REBOOT;
b8c242
@@ -59,7 +62,7 @@ int emergency_action(
b8c242
                 break;
b8c242
 
b8c242
         case EMERGENCY_ACTION_REBOOT_IMMEDIATE:
b8c242
-                log_and_status(m, "Rebooting immediately", reason);
b8c242
+                log_and_status(m, warn, "Rebooting immediately", reason);
b8c242
 
b8c242
                 sync();
b8c242
 
b8c242
@@ -75,7 +78,7 @@ int emergency_action(
b8c242
 
b8c242
         case EMERGENCY_ACTION_EXIT:
b8c242
                 if (MANAGER_IS_USER(m) || detect_container() > 0) {
b8c242
-                        log_and_status(m, "Exiting", reason);
b8c242
+                        log_and_status(m, warn, "Exiting", reason);
b8c242
                         (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_EXIT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL, NULL);
b8c242
                         break;
b8c242
                 }
b8c242
@@ -84,13 +87,13 @@ int emergency_action(
b8c242
                 _fallthrough_;
b8c242
 
b8c242
         case EMERGENCY_ACTION_POWEROFF:
b8c242
-                log_and_status(m, "Powering off", reason);
b8c242
+                log_and_status(m, warn, "Powering off", reason);
b8c242
                 (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL, NULL);
b8c242
                 break;
b8c242
 
b8c242
         case EMERGENCY_ACTION_EXIT_FORCE:
b8c242
                 if (MANAGER_IS_USER(m) || detect_container() > 0) {
b8c242
-                        log_and_status(m, "Exiting immediately", reason);
b8c242
+                        log_and_status(m, warn, "Exiting immediately", reason);
b8c242
                         m->exit_code = MANAGER_EXIT;
b8c242
                         break;
b8c242
                 }
b8c242
@@ -99,12 +102,12 @@ int emergency_action(
b8c242
                 _fallthrough_;
b8c242
 
b8c242
         case EMERGENCY_ACTION_POWEROFF_FORCE:
b8c242
-                log_and_status(m, "Forcibly powering off", reason);
b8c242
+                log_and_status(m, warn, "Forcibly powering off", reason);
b8c242
                 m->exit_code = MANAGER_POWEROFF;
b8c242
                 break;
b8c242
 
b8c242
         case EMERGENCY_ACTION_POWEROFF_IMMEDIATE:
b8c242
-                log_and_status(m, "Powering off immediately", reason);
b8c242
+                log_and_status(m, warn, "Powering off immediately", reason);
b8c242
 
b8c242
                 sync();
b8c242
 
b8c242
diff --git a/src/core/emergency-action.h b/src/core/emergency-action.h
b8c242
index efbfaf6c6a..2aa1497118 100644
b8c242
--- a/src/core/emergency-action.h
b8c242
+++ b/src/core/emergency-action.h
b8c242
@@ -22,6 +22,7 @@ typedef enum EmergencyAction {
b8c242
 
b8c242
 typedef enum EmergencyActionFlags {
b8c242
         EMERGENCY_ACTION_IS_WATCHDOG = 1 << 0,
b8c242
+        EMERGENCY_ACTION_WARN        = 1 << 1,
b8c242
 } EmergencyActionFlags;
b8c242
 
b8c242
 #include "macro.h"
b8c242
diff --git a/src/core/job.c b/src/core/job.c
b8c242
index d647aac42d..43ab55ed18 100644
b8c242
--- a/src/core/job.c
b8c242
+++ b/src/core/job.c
b8c242
@@ -1076,7 +1076,8 @@ static int job_dispatch_timer(sd_event_source *s, uint64_t monotonic, void *user
b8c242
         u = j->unit;
b8c242
         job_finish_and_invalidate(j, JOB_TIMEOUT, true, false);
b8c242
 
b8c242
-        emergency_action(u->manager, u->job_timeout_action, EMERGENCY_ACTION_IS_WATCHDOG,
b8c242
+        emergency_action(u->manager, u->job_timeout_action,
b8c242
+                         EMERGENCY_ACTION_IS_WATCHDOG|EMERGENCY_ACTION_WARN,
b8c242
                          u->job_timeout_reboot_arg, "job timed out");
b8c242
 
b8c242
         return 0;
b8c242
diff --git a/src/core/manager.c b/src/core/manager.c
b8c242
index ac1b198b21..ee976f70b3 100644
b8c242
--- a/src/core/manager.c
b8c242
+++ b/src/core/manager.c
b8c242
@@ -2528,7 +2528,7 @@ static void manager_handle_ctrl_alt_del(Manager *m) {
b8c242
         if (ratelimit_below(&m->ctrl_alt_del_ratelimit) || m->cad_burst_action == EMERGENCY_ACTION_NONE)
b8c242
                 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
b8c242
         else
b8c242
-                emergency_action(m, m->cad_burst_action, 0, NULL, 
b8c242
+                emergency_action(m, m->cad_burst_action, EMERGENCY_ACTION_WARN, NULL,
b8c242
                                 "Ctrl-Alt-Del was pressed more than 7 times within 2s");
b8c242
 }
b8c242
 
b8c242
diff --git a/src/core/unit.c b/src/core/unit.c
b8c242
index dc5c89c195..23afa24c77 100644
b8c242
--- a/src/core/unit.c
b8c242
+++ b/src/core/unit.c
b8c242
@@ -1669,7 +1669,8 @@ int unit_start_limit_test(Unit *u) {
b8c242
         log_unit_warning(u, "Start request repeated too quickly.");
b8c242
         u->start_limit_hit = true;
b8c242
 
b8c242
-        return emergency_action(u->manager, u->start_limit_action, EMERGENCY_ACTION_IS_WATCHDOG,
b8c242
+        return emergency_action(u->manager, u->start_limit_action,
b8c242
+                                EMERGENCY_ACTION_IS_WATCHDOG|EMERGENCY_ACTION_WARN,
b8c242
                                 u->reboot_arg, "unit failed");
b8c242
 }
b8c242