chiark / gitweb /
manager: print warning on console before reboot
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 28 Oct 2014 03:14:23 +0000 (23:14 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 28 Oct 2014 03:17:49 +0000 (23:17 -0400)
It will be printed even if a prompt is blocking other messages.

src/core/failure-action.c
src/core/manager.c
src/core/manager.h

index 9417474..ce522a4 100644 (file)
 #include "special.h"
 #include "failure-action.h"
 
+static void log_and_status(Manager *m, const char *message) {
+        log_warning("%s", message);
+        manager_status_printf(m, STATUS_TYPE_EMERGENCY,
+                              ANSI_HIGHLIGHT_RED_ON " !!  " ANSI_HIGHLIGHT_OFF,
+                              "%s", message);
+}
+
 int failure_action(
                 Manager *m,
                 FailureAction action,
@@ -57,7 +64,7 @@ int failure_action(
         case FAILURE_ACTION_REBOOT: {
                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
 
-                log_warning("Rebooting as result of failure.");
+                log_and_status(m, "Rebooting as result of failure.");
 
                 update_reboot_param_file(reboot_arg);
                 r = manager_add_job_by_name(m, JOB_START, SPECIAL_REBOOT_TARGET, JOB_REPLACE, true, &error, NULL);
@@ -68,13 +75,14 @@ int failure_action(
         }
 
         case FAILURE_ACTION_REBOOT_FORCE:
-                log_warning("Forcibly rebooting as result of failure.");
+                log_and_status(m, "Forcibly rebooting as result of failure.");
+
                 update_reboot_param_file(reboot_arg);
                 m->exit_code = MANAGER_REBOOT;
                 break;
 
         case FAILURE_ACTION_REBOOT_IMMEDIATE:
-                log_warning("Rebooting immediately as result of failure.");
+                log_and_status(m, "Rebooting immediately as result of failure.");
 
                 sync();
 
@@ -90,7 +98,7 @@ int failure_action(
         case FAILURE_ACTION_POWEROFF: {
                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
 
-                log_warning("Powering off as result of failure.");
+                log_and_status(m, "Powering off as result of failure.");
 
                 r = manager_add_job_by_name(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE, true, &error, NULL);
                 if (r < 0)
@@ -100,12 +108,12 @@ int failure_action(
         }
 
         case FAILURE_ACTION_POWEROFF_FORCE:
-                log_warning("Forcibly powering off as result of failure.");
+                log_and_status(m, "Forcibly powering off as result of failure.");
                 m->exit_code = MANAGER_POWEROFF;
                 break;
 
         case FAILURE_ACTION_POWEROFF_IMMEDIATE:
-                log_warning("Powering off immediately as result of failure.");
+                log_and_status(m, "Powering off immediately as result of failure.");
 
                 sync();
 
index 859631d..d427d88 100644 (file)
@@ -2944,7 +2944,7 @@ static bool manager_get_show_status(Manager *m, StatusType type) {
                 return false;
 
         /* If we cannot find out the status properly, just proceed. */
-        if (manager_check_ask_password(m) > 0)
+        if (type != STATUS_TYPE_EMERGENCY && manager_check_ask_password(m) > 0)
                 return false;
 
         if (m->show_status > 0)
index d0c0f58..ab72548 100644 (file)
@@ -63,6 +63,7 @@ typedef enum ManagerExitCode {
 typedef enum StatusType {
         STATUS_TYPE_EPHEMERAL,
         STATUS_TYPE_NORMAL,
+        STATUS_TYPE_EMERGENCY,
 } StatusType;
 
 #include "unit.h"