]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/failure-action.c
Move all unit states to basic/ and extend systemctl --state=help
[thirdparty/systemd.git] / src / core / failure-action.c
CommitLineData
2928b0a8
LP
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3/***
4 This file is part of systemd.
5
6 Copyright 2014 Lennart Poettering
7 Copyright 2012 Michael Olbrich
8
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
13
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
18
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21***/
22
23#include <sys/reboot.h>
24#include <linux/reboot.h>
2928b0a8
LP
25
26#include "bus-util.h"
27#include "bus-error.h"
28#include "special.h"
29#include "failure-action.h"
288a74cc 30#include "terminal-util.h"
2928b0a8 31
ebc5788e
ZJS
32static void log_and_status(Manager *m, const char *message) {
33 log_warning("%s", message);
34 manager_status_printf(m, STATUS_TYPE_EMERGENCY,
1fc464f6 35 ANSI_HIGHLIGHT_RED " !! " ANSI_NORMAL,
ebc5788e
ZJS
36 "%s", message);
37}
38
2928b0a8
LP
39int failure_action(
40 Manager *m,
41 FailureAction action,
42 const char *reboot_arg) {
43
44 int r;
45
46 assert(m);
47 assert(action >= 0);
48 assert(action < _FAILURE_ACTION_MAX);
49
f07756bf
LP
50 if (action == FAILURE_ACTION_NONE)
51 return -ECANCELED;
2928b0a8 52
b2c23da8 53 if (m->running_as == MANAGER_USER) {
f07756bf
LP
54 /* Downgrade all options to simply exiting if we run
55 * in user mode */
56
57 log_warning("Exiting as result of failure.");
58 m->exit_code = MANAGER_EXIT;
59 return -ECANCELED;
60 }
61
62 switch (action) {
2928b0a8
LP
63
64 case FAILURE_ACTION_REBOOT: {
65 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
66
ebc5788e 67 log_and_status(m, "Rebooting as result of failure.");
2928b0a8
LP
68
69 update_reboot_param_file(reboot_arg);
70 r = manager_add_job_by_name(m, JOB_START, SPECIAL_REBOOT_TARGET, JOB_REPLACE, true, &error, NULL);
71 if (r < 0)
72 log_error("Failed to reboot: %s.", bus_error_message(&error, r));
73
74 break;
75 }
76
77 case FAILURE_ACTION_REBOOT_FORCE:
ebc5788e
ZJS
78 log_and_status(m, "Forcibly rebooting as result of failure.");
79
2928b0a8
LP
80 update_reboot_param_file(reboot_arg);
81 m->exit_code = MANAGER_REBOOT;
82 break;
83
84 case FAILURE_ACTION_REBOOT_IMMEDIATE:
ebc5788e 85 log_and_status(m, "Rebooting immediately as result of failure.");
2928b0a8
LP
86
87 sync();
88
89 if (reboot_arg) {
90 log_info("Rebooting with argument '%s'.", reboot_arg);
91 syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, reboot_arg);
92 }
93
94 log_info("Rebooting.");
95 reboot(RB_AUTOBOOT);
96 break;
97
f07756bf
LP
98 case FAILURE_ACTION_POWEROFF: {
99 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
100
ebc5788e 101 log_and_status(m, "Powering off as result of failure.");
f07756bf
LP
102
103 r = manager_add_job_by_name(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE, true, &error, NULL);
104 if (r < 0)
105 log_error("Failed to poweroff: %s.", bus_error_message(&error, r));
106
107 break;
108 }
109
110 case FAILURE_ACTION_POWEROFF_FORCE:
ebc5788e 111 log_and_status(m, "Forcibly powering off as result of failure.");
f07756bf
LP
112 m->exit_code = MANAGER_POWEROFF;
113 break;
114
115 case FAILURE_ACTION_POWEROFF_IMMEDIATE:
ebc5788e 116 log_and_status(m, "Powering off immediately as result of failure.");
f07756bf
LP
117
118 sync();
119
120 log_info("Powering off.");
121 reboot(RB_POWER_OFF);
122 break;
123
2928b0a8
LP
124 default:
125 assert_not_reached("Unknown failure action");
126 }
127
128 return -ECANCELED;
129}
130
131static const char* const failure_action_table[_FAILURE_ACTION_MAX] = {
132 [FAILURE_ACTION_NONE] = "none",
133 [FAILURE_ACTION_REBOOT] = "reboot",
134 [FAILURE_ACTION_REBOOT_FORCE] = "reboot-force",
f07756bf
LP
135 [FAILURE_ACTION_REBOOT_IMMEDIATE] = "reboot-immediate",
136 [FAILURE_ACTION_POWEROFF] = "poweroff",
137 [FAILURE_ACTION_POWEROFF_FORCE] = "poweroff-force",
138 [FAILURE_ACTION_POWEROFF_IMMEDIATE] = "poweroff-immediate"
2928b0a8
LP
139};
140DEFINE_STRING_TABLE_LOOKUP(failure_action, FailureAction);