#!/usr/bin/env bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#

ENABLED=yes
[[ ${ENABLED} == "yes" ]] || exit 0

unset ROOTFS; [[ -d /usr/lib/ublinux ]] || ROOTFS=.
SOURCE=${ROOTFS}/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0

SYSCONF="${ROOTFS}${SYSCONF}"
SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/save; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null


exec_sysrq_reboot(){
    #Активизировать магические клавиши SysRq
    echo 1 > /proc/sys/kernel/sysrq
    [[ ${SYSTEMBOOT_STATEMODE} == "module" ]] && return 0
    [[ -n ${SAVE_ALL_CACHE} ]] && return 0
    [[ -n ${SAVE_ROOTCOPY_INCLUDE} || -n ${SAVE_ROOTCOPY_CHANGES} || -n ${SAVE_ROOTCOPY_EXCLUDE} ]] && return 0
    [[ -n ${SAVE_MODULE_CHANGES} || -n ${SAVE_MODULE_INCLUDE} || -n ${SAVE_MODULE_EXCLUDE} ]] && return 0
    echo
    echo "The system will restart/shutdown after a maximum of 60 seconds"
    echo
    sleep 60 && echo b > /proc/sysrq-trigger &
}

## Возможности магических клавиш SysRq
## <r> Переключает клавиатуру в режим XLATE. Это может пригодиться
##    в случаях, когда приложения, использующие raw-моду (например X-сервер)
##    заканчивают свою работу аварийно. С помощью команды <r> можно вернуть
##    клавиатуру в рабочее состояние.
## <k> Клавиша безопасного доступа (SAK -- Secure Access Key). Ядро
##    убивает все процессы на текущей консоли. Вы можете использовать эту
##    клавишу, что бы быть уверенным, что пароль не будет украден программой
##    троянским конём. Если оригинальный login был подменён злоумышленником
##    на троянского коня, то по команде <k> эта вредная программа будет
##    убита и init запустит подлинный login.
## <b> Немедленно перезапускает систему, не предпринимая попыток
##    синхронизации и демонтирования файловых систем. Эта команда может быть
##    использована, если Вы не можете перезапустить систему иным путём. Но
##    перед тем, как использовать команду <b> всё-таки рекомендуется подать
##    команды <s> (синхронизация файловых систем) и <u> (перемонтирование
##    файловых систем в режим "только для чтения").
## <o> Останавливает систему, если такая возможность предусмотрена в ядре.
## <s> Ядро производит попытку синхронизации файловых систем (т.е.
##    записи на диске приводятся в соответствие с записями в кэше).
## <u> Ядро производит попытку перемонтирования файловых систем в
##    режим "только для чтения" (ro).
## <p> Ядро выдаёт dump текущего состояния регистров CPU на текущую консоль.
## <t> Ядро выдаёт список текущих заданий и информацию о них на текущую консоль.
## <e> Всем процессам, кроме init, посылается сигнал SIGTERM.
## <i> Всем процессам, кроме init, посылается сигнал SIGKILL.
## <l> Всем процессам, включая и init, посылается сигнал SIGKILL.
##    После этого система становится неработоспособна.
## <0>..<9> Устанавливает loglevel консоли. Т.е. регламентирует вывод
##    диагностических сообщений на консоль. Однако, не зависимо от того,
##    какой loglevel Вы установите для консоли, диагностические сообщения
##    по-прежнему будут регистрироваться демонами syslogd/klogd.
## <h> На консоль выдаётся подсказка по магическим клавишам. На
##    самом деле, любая клавиша, не нагруженная определённой функцией,
##    выдаёт подсказку, но "h" легче запомнить.

################
##### MAIN #####
################

    # Если файл подключен как ресурс с функциями, то выйти
    return 0 2>/dev/null && return 0

    exec_sysrq_reboot $@
