mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +03:00
core: limit service-watchdogs=no to actual "watchdog" commands
The setting is now only looked at when considering an action for a job timeout or unit start limit. It is ignored for ctrl-alt-del, SuccessAction, SuccessFailure. v2: turn the parameter into a flag field v3: rename Options to Flags
This commit is contained in:
parent
3f00d379fa
commit
1710d4beff
@ -21,6 +21,7 @@ static void log_and_status(Manager *m, const char *message, const char *reason)
|
|||||||
int emergency_action(
|
int emergency_action(
|
||||||
Manager *m,
|
Manager *m,
|
||||||
EmergencyAction action,
|
EmergencyAction action,
|
||||||
|
EmergencyActionFlags options,
|
||||||
const char *reboot_arg,
|
const char *reboot_arg,
|
||||||
const char *reason) {
|
const char *reason) {
|
||||||
|
|
||||||
@ -31,7 +32,7 @@ int emergency_action(
|
|||||||
if (action == EMERGENCY_ACTION_NONE)
|
if (action == EMERGENCY_ACTION_NONE)
|
||||||
return -ECANCELED;
|
return -ECANCELED;
|
||||||
|
|
||||||
if (!m->service_watchdogs) {
|
if (FLAGS_SET(options, EMERGENCY_ACTION_IS_WATCHDOG) && !m->service_watchdogs) {
|
||||||
log_warning("Watchdog disabled! Not acting on: %s", reason);
|
log_warning("Watchdog disabled! Not acting on: %s", reason);
|
||||||
return -ECANCELED;
|
return -ECANCELED;
|
||||||
}
|
}
|
||||||
|
@ -16,10 +16,16 @@ typedef enum EmergencyAction {
|
|||||||
_EMERGENCY_ACTION_INVALID = -1
|
_EMERGENCY_ACTION_INVALID = -1
|
||||||
} EmergencyAction;
|
} EmergencyAction;
|
||||||
|
|
||||||
|
typedef enum EmergencyActionFlags {
|
||||||
|
EMERGENCY_ACTION_IS_WATCHDOG = 1 << 0,
|
||||||
|
} EmergencyActionFlags;
|
||||||
|
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
#include "manager.h"
|
#include "manager.h"
|
||||||
|
|
||||||
int emergency_action(Manager *m, EmergencyAction action, const char *reboot_arg, const char *reason);
|
int emergency_action(Manager *m,
|
||||||
|
EmergencyAction action, EmergencyActionFlags options,
|
||||||
|
const char *reboot_arg, const char *reason);
|
||||||
|
|
||||||
const char* emergency_action_to_string(EmergencyAction i) _const_;
|
const char* emergency_action_to_string(EmergencyAction i) _const_;
|
||||||
EmergencyAction emergency_action_from_string(const char *s) _pure_;
|
EmergencyAction emergency_action_from_string(const char *s) _pure_;
|
||||||
|
@ -973,7 +973,8 @@ static int job_dispatch_timer(sd_event_source *s, uint64_t monotonic, void *user
|
|||||||
u = j->unit;
|
u = j->unit;
|
||||||
job_finish_and_invalidate(j, JOB_TIMEOUT, true, false);
|
job_finish_and_invalidate(j, JOB_TIMEOUT, true, false);
|
||||||
|
|
||||||
emergency_action(u->manager, u->job_timeout_action, u->job_timeout_reboot_arg, "job timed out");
|
emergency_action(u->manager, u->job_timeout_action, EMERGENCY_ACTION_IS_WATCHDOG,
|
||||||
|
u->job_timeout_reboot_arg, "job timed out");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
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);
|
manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
|
||||||
else
|
else
|
||||||
emergency_action(m, m->cad_burst_action, NULL,
|
emergency_action(m, m->cad_burst_action, 0, NULL,
|
||||||
"Ctrl-Alt-Del was pressed more than 7 times within 2s");
|
"Ctrl-Alt-Del was pressed more than 7 times within 2s");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1724,7 +1724,8 @@ int unit_start_limit_test(Unit *u) {
|
|||||||
log_unit_warning(u, "Start request repeated too quickly.");
|
log_unit_warning(u, "Start request repeated too quickly.");
|
||||||
u->start_limit_hit = true;
|
u->start_limit_hit = true;
|
||||||
|
|
||||||
return emergency_action(u->manager, u->start_limit_action, u->reboot_arg, "unit failed");
|
return emergency_action(u->manager, u->start_limit_action, EMERGENCY_ACTION_IS_WATCHDOG,
|
||||||
|
u->reboot_arg, "unit failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool unit_shall_confirm_spawn(Unit *u) {
|
bool unit_shall_confirm_spawn(Unit *u) {
|
||||||
@ -2498,9 +2499,11 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, UnitNotifyFlag
|
|||||||
unit_check_binds_to(u);
|
unit_check_binds_to(u);
|
||||||
|
|
||||||
if (os != UNIT_FAILED && ns == UNIT_FAILED)
|
if (os != UNIT_FAILED && ns == UNIT_FAILED)
|
||||||
(void) emergency_action(u->manager, u->failure_action, u->reboot_arg, "unit failed");
|
(void) emergency_action(u->manager, u->failure_action, 0,
|
||||||
|
u->reboot_arg, "unit failed");
|
||||||
else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && ns == UNIT_INACTIVE)
|
else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && ns == UNIT_INACTIVE)
|
||||||
(void) emergency_action(u->manager, u->success_action, u->reboot_arg, "unit succeeded");
|
(void) emergency_action(u->manager, u->success_action, 0,
|
||||||
|
u->reboot_arg, "unit succeeded");
|
||||||
}
|
}
|
||||||
|
|
||||||
unit_add_to_dbus_queue(u);
|
unit_add_to_dbus_queue(u);
|
||||||
|
Loading…
Reference in New Issue
Block a user