コード例 #1
0
int failure_action(
    Manager *m,
    FailureAction action,
    const char *reboot_arg) {

    assert(m);
    assert(action >= 0);
    assert(action < _FAILURE_ACTION_MAX);

    if (action == FAILURE_ACTION_NONE)
        return -ECANCELED;

    if (!MANAGER_IS_SYSTEM(m)) {
        /* Downgrade all options to simply exiting if we run
         * in user mode */

        log_warning("Exiting as result of failure.");
        m->exit_code = MANAGER_EXIT;
        return -ECANCELED;
    }

    switch (action) {

    case FAILURE_ACTION_REBOOT:
        log_and_status(m, "Rebooting as result of failure.");

        (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);

        break;

    case FAILURE_ACTION_REBOOT_FORCE:
        log_and_status(m, "Forcibly rebooting as result of failure.");

        (void) update_reboot_parameter_and_warn(reboot_arg);
        m->exit_code = MANAGER_REBOOT;

        break;

    case FAILURE_ACTION_REBOOT_IMMEDIATE:
        log_and_status(m, "Rebooting immediately as result of failure.");

        sync();

        if (!isempty(reboot_arg)) {
            log_info("Rebooting with argument '%s'.", reboot_arg);
            syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, reboot_arg);
            log_warning_errno(errno, "Failed to reboot with parameter, retrying without: %m");
        }

        log_info("Rebooting.");
        reboot(RB_AUTOBOOT);
        break;

    case FAILURE_ACTION_POWEROFF:
        log_and_status(m, "Powering off as result of failure.");
        (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL);
        break;

    case FAILURE_ACTION_POWEROFF_FORCE:
        log_and_status(m, "Forcibly powering off as result of failure.");
        m->exit_code = MANAGER_POWEROFF;
        break;

    case FAILURE_ACTION_POWEROFF_IMMEDIATE:
        log_and_status(m, "Powering off immediately as result of failure.");

        sync();

        log_info("Powering off.");
        reboot(RB_POWER_OFF);
        break;

    default:
        assert_not_reached("Unknown failure action");
    }

    return -ECANCELED;
}
コード例 #2
0
ファイル: emergency-action.c プロジェクト: Keruspe/systemd
int emergency_action(
                Manager *m,
                EmergencyAction action,
                EmergencyActionFlags options,
                const char *reboot_arg,
                int exit_status,
                const char *reason) {

        assert(m);
        assert(action >= 0);
        assert(action < _EMERGENCY_ACTION_MAX);

        if (action == EMERGENCY_ACTION_NONE)
                return -ECANCELED;

        if (FLAGS_SET(options, EMERGENCY_ACTION_IS_WATCHDOG) && !m->service_watchdogs) {
                log_warning("Watchdog disabled! Not acting on: %s", reason);
                return -ECANCELED;
        }

        bool warn = FLAGS_SET(options, EMERGENCY_ACTION_WARN);

        switch (action) {

        case EMERGENCY_ACTION_REBOOT:
                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);

                break;

        case EMERGENCY_ACTION_REBOOT_FORCE:
                log_and_status(m, warn, "Forcibly rebooting", reason);

                (void) update_reboot_parameter_and_warn(reboot_arg);
                m->objective = MANAGER_REBOOT;

                break;

        case EMERGENCY_ACTION_REBOOT_IMMEDIATE:
                log_and_status(m, warn, "Rebooting immediately", reason);

                sync();

                if (!isempty(reboot_arg)) {
                        log_info("Rebooting with argument '%s'.", reboot_arg);
                        (void) raw_reboot(LINUX_REBOOT_CMD_RESTART2, reboot_arg);
                        log_warning_errno(errno, "Failed to reboot with parameter, retrying without: %m");
                }

                log_info("Rebooting.");
                (void) reboot(RB_AUTOBOOT);
                break;

        case EMERGENCY_ACTION_EXIT:

                if (exit_status >= 0)
                        m->return_value = exit_status;

                if (MANAGER_IS_USER(m) || detect_container() > 0) {
                        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;
                }

                log_notice("Doing \"poweroff\" action instead of an \"exit\" emergency action.");
                _fallthrough_;

        case EMERGENCY_ACTION_POWEROFF:
                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 (exit_status >= 0)
                        m->return_value = exit_status;

                if (MANAGER_IS_USER(m) || detect_container() > 0) {
                        log_and_status(m, warn, "Exiting immediately", reason);
                        m->objective = MANAGER_EXIT;
                        break;
                }

                log_notice("Doing \"poweroff-force\" action instead of an \"exit-force\" emergency action.");
                _fallthrough_;

        case EMERGENCY_ACTION_POWEROFF_FORCE:
                log_and_status(m, warn, "Forcibly powering off", reason);
                m->objective = MANAGER_POWEROFF;
                break;

        case EMERGENCY_ACTION_POWEROFF_IMMEDIATE:
                log_and_status(m, warn, "Powering off immediately", reason);

                sync();

                log_info("Powering off.");
                (void) reboot(RB_POWER_OFF);
                break;

        default:
                assert_not_reached("Unknown emergency action");
        }

        return -ECANCELED;
}
コード例 #3
0
ファイル: emergency-action.c プロジェクト: dankor/systemd
int emergency_action(
                Manager *m,
                EmergencyAction action,
                const char *reboot_arg,
                const char *reason) {

        assert(m);
        assert(action >= 0);
        assert(action < _EMERGENCY_ACTION_MAX);

        if (action == EMERGENCY_ACTION_NONE)
                return -ECANCELED;

        if (!m->service_watchdogs) {
                log_warning("Watchdog disabled! Not acting on: %s", reason);
                return -ECANCELED;
        }

        if (!MANAGER_IS_SYSTEM(m)) {
                /* Downgrade all options to simply exiting if we run
                 * in user mode */

                log_warning("Exiting: %s", reason);
                m->exit_code = MANAGER_EXIT;
                return -ECANCELED;
        }

        switch (action) {

        case EMERGENCY_ACTION_REBOOT:
                log_and_status(m, "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);

                break;

        case EMERGENCY_ACTION_REBOOT_FORCE:
                log_and_status(m, "Forcibly rebooting", reason);

                (void) update_reboot_parameter_and_warn(reboot_arg);
                m->exit_code = MANAGER_REBOOT;

                break;

        case EMERGENCY_ACTION_REBOOT_IMMEDIATE:
                log_and_status(m, "Rebooting immediately", reason);

                sync();

                if (!isempty(reboot_arg)) {
                        log_info("Rebooting with argument '%s'.", reboot_arg);
                        (void) raw_reboot(LINUX_REBOOT_CMD_RESTART2, reboot_arg);
                        log_warning_errno(errno, "Failed to reboot with parameter, retrying without: %m");
                }

                log_info("Rebooting.");
                (void) reboot(RB_AUTOBOOT);
                break;

        case EMERGENCY_ACTION_POWEROFF:
                log_and_status(m, "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_POWEROFF_FORCE:
                log_and_status(m, "Forcibly powering off", reason);
                m->exit_code = MANAGER_POWEROFF;
                break;

        case EMERGENCY_ACTION_POWEROFF_IMMEDIATE:
                log_and_status(m, "Powering off immediately", reason);

                sync();

                log_info("Powering off.");
                (void) reboot(RB_POWER_OFF);
                break;

        default:
                assert_not_reached("Unknown emergency action");
        }

        return -ECANCELED;
}