diff options
-rw-r--r-- | src/core/emergency-action.c | 29 | ||||
-rw-r--r-- | src/core/emergency-action.h | 1 | ||||
-rw-r--r-- | src/core/job.c | 3 | ||||
-rw-r--r-- | src/core/manager.c | 2 | ||||
-rw-r--r-- | src/core/unit.c | 3 |
5 files changed, 22 insertions, 16 deletions
diff --git a/src/core/emergency-action.c b/src/core/emergency-action.c index e12ff81601..c91d2bf5ff 100644 --- a/src/core/emergency-action.c +++ b/src/core/emergency-action.c @@ -12,11 +12,12 @@ #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(); diff --git a/src/core/emergency-action.h b/src/core/emergency-action.h index 453de0dbd2..1fc4a11e30 100644 --- a/src/core/emergency-action.h +++ b/src/core/emergency-action.h @@ -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" diff --git a/src/core/job.c b/src/core/job.c index 23717d5e47..5a88f52f48 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -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; diff --git a/src/core/manager.c b/src/core/manager.c index 0c3109b34b..94e38be1ea 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -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"); } diff --git a/src/core/unit.c b/src/core/unit.c index 0806a50cce..0ce9318556 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -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"); } |