|
|
#!/usr/bin/env bash
|
|
|
|
|
|
ENABLED=yes
|
|
|
[ "$ENABLED" != "yes" ] && exit 0
|
|
|
DEBUGMODE=no
|
|
|
|
|
|
unset ROOTFS; [[ -d /usr/lib/ublinux ]] || ROOTFS=.
|
|
|
SOURCE=${ROOTFS}/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
|
|
|
SOURCE=${ROOTFS}/usr/lib/ublinux/os-config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
|
|
|
debug_mode "$0" "$@"
|
|
|
|
|
|
SYSCONF="${ROOTFS}/${SYSCONF}"
|
|
|
SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
|
|
|
SOURCE=${SYSCONF}/boot; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null
|
|
|
|
|
|
SELF_NAME="20-grub"
|
|
|
NAME_GRUB_CFG="grub.cfg"
|
|
|
|
|
|
get_path_grub2(){
|
|
|
PATH_GRUB=$(find ${ROOTFS}/memory/data/from/*/boot/grub/ -maxdepth 1 -type f -name "${NAME_GRUB_CFG}" | head -1)
|
|
|
[[ -n ${PATH_GRUB} ]] || PATH_GRUB="$(find ${ROOTFS}/memory/data/from/*/ -maxdepth 3 -type f -name "${NAME_GRUB_CFG}" | head -1)"
|
|
|
[[ -n ${PATH_GRUB} ]] || return 1
|
|
|
[[ -w ${PATH_GRUB} ]] && PATH_GRUB="${PATH_GRUB%/*}" || return 1
|
|
|
}
|
|
|
control_grub_var_cfg(){
|
|
|
if [[ -n ${STR_SET_VALUE} ]]; then
|
|
|
grep -q "${STR_EXPORT}" ${FILE_GRUB_VAR_USER} 2>/dev/null || echo -e "${STR_EXPORT}" >> ${FILE_GRUB_VAR_USER}
|
|
|
if ! grep -q "^\s*${STR_SET}${STR_SET_VALUE}\s*$" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
local QUOTA
|
|
|
[[ ${STR_SET_VALUE} =~ " " ]] && QUOTA="\""
|
|
|
if grep -q "${STR_SET}" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
sed -E "s/^\s*(${STR_SET}).*/\1${QUOTA}${STR_SET_VALUE}${QUOTA}/" -i ${FILE_GRUB_VAR_USER}
|
|
|
else
|
|
|
sed "/${STR_EXPORT}/i${STR_SET}${QUOTA}${STR_SET_VALUE}${QUOTA}" -i ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
fi
|
|
|
elif grep -q "${STR_SET}" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
sed "/^\s*${STR_SET}.*/d; /^\s*${STR_EXPORT}\s*$/d" -i ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
}
|
|
|
exec_grub_timeout(){
|
|
|
[[ -n $@ ]] && STR_SET_VALUE="$@" || STR_SET_VALUE="${GRUB_TIMEOUT}"
|
|
|
STR_SET="set timeout="
|
|
|
STR_EXPORT="export timeout"
|
|
|
control_grub_var_cfg
|
|
|
}
|
|
|
exec_grub_default(){
|
|
|
[[ -n $@ ]] && GRUB_DEFAULT="$@"
|
|
|
if [[ -n ${GRUB_DEFAULT} ]]; then
|
|
|
FILE_GRUBENV="${PATH_GRUB}/grubenv"
|
|
|
DATA_GRUBENV=$(cat <<EOF
|
|
|
# GRUB Environment Block
|
|
|
saved_entry=${GRUB_DEFAULT}
|
|
|
EOF
|
|
|
)
|
|
|
LC_ALL=C
|
|
|
# echo -e "${DATA_GRUBENV}$(yes "" | head -n $((1024-"${#DATA_GRUBENV}")) | tr \\n '#')" > "${PATH_GRUB}/grubenv"
|
|
|
echo -ne "${DATA_GRUBENV}\n$(printf -- '#'%.s $(seq -s ' ' $((1023-"${#DATA_GRUBENV}"))))" > "${PATH_GRUB}/grubenv"
|
|
|
fi
|
|
|
}
|
|
|
exec_grub_superusers(){
|
|
|
[[ -n $@ ]] && STR_SET_VALUE="$@" || STR_SET_VALUE="${GRUB_SUPERUSERS}"
|
|
|
STR_SET="set superusers="
|
|
|
STR_EXPORT="export superusers"
|
|
|
control_grub_var_cfg
|
|
|
}
|
|
|
exec_grub_password(){
|
|
|
[[ -n $@ ]] && GRUB_PASSWORD="$@"
|
|
|
if [[ -n ${GRUB_PASSWORD[0]} ]]; then
|
|
|
[[ -n ${GRUB_SUPERUSERS} ]] || return 1
|
|
|
FIRST_SUPERUSER=${GRUB_SUPERUSERS//\"/}; FIRST_SUPERUSER=${FIRST_SUPERUSER%%,*}; FIRST_SUPERUSER=${FIRST_SUPERUSER%% *}
|
|
|
local -A GRUB_PASSWORD=( [${FIRST_SUPERUSER}]="${GRUB_PASSWORD}" )
|
|
|
fi
|
|
|
if [[ -n ${GRUB_PASSWORD[@]} ]]; then
|
|
|
for NAME_USER in "${!GRUB_PASSWORD[@]}"; do
|
|
|
STR_SET="password_pbkdf2 ${NAME_USER} "
|
|
|
STR_SET_VALUE=${GRUB_PASSWORD[${NAME_USER}]}
|
|
|
if [[ ! ${STR_SET_VALUE} =~ ^grub.pbkdf2 ]]; then
|
|
|
STR_SET_VALUE=$(echo -e "${STR_SET_VALUE}\n${STR_SET_VALUE}" | grub-mkpasswd-pbkdf2 | awk '/grub.pbkdf/{print$NF}')
|
|
|
ubconfig --noexecute set boot GRUB_PASSWORD[${NAME_USER}]=${STR_SET_VALUE}
|
|
|
fi
|
|
|
if ! grep -q "^\s*${STR_SET}${STR_SET_VALUE}$" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
if grep -q "${STR_SET}" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
sed -E "s/^\s*(${STR_SET}).*/\1${STR_SET_VALUE}/" -i ${FILE_GRUB_VAR_USER}
|
|
|
else
|
|
|
echo "${STR_SET}${STR_SET_VALUE}" >> ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
fi
|
|
|
done
|
|
|
# Проверка по файлу ${FILE_GRUB_VAR_USER}, если пароль на пользователя присутствует, но его нет в конфигурации, то удалить из ${FILE_GRUB_VAR_USER}
|
|
|
while read -r NAME_USER; do
|
|
|
[[ -n ${GRUB_PASSWORD[${NAME_USER}]} ]] || sed "/^\s*password_pbkdf2 ${NAME_USER}.*/d" -i ${FILE_GRUB_VAR_USER}
|
|
|
done < <(sed -En "s/^\s*password_pbkdf2 (.*) .*/\1/p" ${FILE_GRUB_VAR_USER})
|
|
|
elif grep -q "^\s*password_pbkdf2" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
sed "/^\s*password_pbkdf2.*/d" -i ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
}
|
|
|
exec_grub_boot_silent(){
|
|
|
[[ -n $@ ]] && STR_SET_VALUE="$@" || STR_SET_VALUE="${GRUB_BOOT_SILENT}"
|
|
|
STR_SET="set BOOT_SILENT="
|
|
|
STR_EXPORT="export BOOT_SILENT"
|
|
|
control_grub_var_cfg
|
|
|
}
|
|
|
exec_grub_terminal_input(){
|
|
|
[[ -n $@ ]] && STR_SET_VALUE="$@" || STR_SET_VALUE="${GRUB_TERMINAL_INPUT}"
|
|
|
STR_SET="terminal_input "
|
|
|
if [[ -n ${STR_SET_VALUE} ]]; then
|
|
|
if ! grep -q "^\s*${STR_SET}${STR_SET_VALUE}\s*$" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
if grep -q "${STR_SET}" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
sed -E "s/^\s*(${STR_SET}).*/\1${STR_SET_VALUE}/" -i ${FILE_GRUB_VAR_USER}
|
|
|
else
|
|
|
echo "${STR_SET}${STR_SET_VALUE}" >> ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
if [[ ${STR_SET_VALUE} =~ "serial" ]]; then
|
|
|
grep -q "^\s*serial\s*$" ${FILE_GRUB_VAR_USER} 2>/dev/null || sed "/${STR_SET}/iserial" -i ${FILE_GRUB_VAR_USER}
|
|
|
else
|
|
|
grep -q "^\s*serial\s*$" ${FILE_GRUB_VAR_USER} 2>/dev/null && sed "/^serial$/d" -i ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
fi
|
|
|
elif grep -q "${STR_SET}" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
sed "/^\s*${STR_SET}.*/d; /^\s*serial\s*$/d" -i ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
}
|
|
|
exec_grub_terminal_output(){
|
|
|
[[ -n $@ ]] && STR_SET_VALUE="$@" || STR_SET_VALUE="${GRUB_TERMINAL_OUTPUT}"
|
|
|
STR_SET="terminal_output "
|
|
|
if [[ -n ${STR_SET_VALUE} ]]; then
|
|
|
if ! grep -q "^\s*${STR_SET}${STR_SET_VALUE}\s*$" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
if grep -q "${STR_SET}" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
sed -E "s/^\s*(${STR_SET}).*/\1${STR_SET_VALUE}/" -i ${FILE_GRUB_VAR_USER}
|
|
|
else
|
|
|
echo "${STR_SET}${STR_SET_VALUE}" >> ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
fi
|
|
|
elif grep -q "${STR_SET}" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
sed "/^\s*${STR_SET}.*/d" -i ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
}
|
|
|
exec_grub_play(){
|
|
|
[[ -n $@ ]] && STR_SET_VALUE="$@" || STR_SET_VALUE="${GRUB_PLAY}"
|
|
|
STR_SET="play "
|
|
|
if [[ -n ${STR_SET_VALUE} ]]; then
|
|
|
if ! grep -q "^\s*${STR_SET}${STR_SET_VALUE}\s*$" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
if grep -q "${STR_SET}" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
sed -E "s/^\s*(${STR_SET}).*/\1${STR_SET_VALUE}/" -i ${FILE_GRUB_VAR_USER}
|
|
|
else
|
|
|
echo "${STR_SET}${STR_SET_VALUE}" >> ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
fi
|
|
|
elif grep -q "${STR_SET}" ${FILE_GRUB_VAR_USER} 2>/dev/null; then
|
|
|
sed "/^\s*${STR_SET}.*/d" -i ${FILE_GRUB_VAR_USER}
|
|
|
fi
|
|
|
}
|
|
|
exec_grub_cmdline_linux(){
|
|
|
[[ -n $@ ]] && STR_SET_VALUE="$@" || STR_SET_VALUE="${GRUB_CMDLINE_LINUX}"
|
|
|
STR_SET="set CMDLINE_LINUX="
|
|
|
STR_EXPORT="export CMDLINE_LINUX"
|
|
|
control_grub_var_cfg
|
|
|
}
|
|
|
|
|
|
|
|
|
################
|
|
|
##### MAIN #####
|
|
|
################
|
|
|
|
|
|
# Возможность подключить как source из любого скрипта и вызов встроенных функций
|
|
|
get_path_grub2 || exit 1
|
|
|
#PATH_GRUB="/mnt/livemedia/ublinux-data/work/rc.halt.pre"
|
|
|
FILE_GRUB_VAR_USER="${PATH_GRUB}/ublinux/grub_var_user.cfg"
|
|
|
[[ -f ${FILE_GRUB_VAR_USER} ]] || touch ${FILE_GRUB_VAR_USER}
|
|
|
|
|
|
if [[ ${0##*/} == ${SELF_NAME} && -z $@ ]]; then
|
|
|
while read -r FUNCTION; do
|
|
|
$"${FUNCTION##* }"
|
|
|
done < <(declare -F | grep "declare -f exec_")
|
|
|
elif [[ ${0##*/} == ${SELF_NAME} ]]; then
|
|
|
while [[ $# -gt 0 ]]; do
|
|
|
declare -f ${1} &>/dev/null && FUNCTION+="; ${1}" && shift || { FUNCTION+=" ${1}" && shift; }
|
|
|
done
|
|
|
eval ${FUNCTION#*; }
|
|
|
else
|
|
|
true
|
|
|
fi
|