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

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

PATH_BOOT="/memory/layer-base/0"
PATH_KERNEL="/usr/lib/modules"

copy_newkernel_to_boot(){
# Найти все файлы ядра и initramfs. Еслии новее по дате модификации в системе, то заменить загрузочные
    mountpoint --quiet "${PATH_BOOT}" || return 0
    find ${PATH_KERNEL} -maxdepth 2 -name "vmlinuz-*.*.*-*" -print | while read FIND_FILE; do
	local DTIME_FIND_FILE=$(stat -c'%Y' $(readlink -e ${FIND_FILE} 2>/dev/null))
        [[ -e ${PATH_BOOT}/${FIND_FILE##*/} ]] && local DTIME_BOOT_FILE=$(stat -c'%Y' ${PATH_BOOT}/${FIND_FILE##*/} 2>/dev/null) || local DTIME_BOOT_FILE=
        [[ ${DTIME_FIND_FILE} =~ ^[0-9]+$ && ${DTIME_BOOT_FILE} =~ ^[0-9]+$ ]] && [[ ${DTIME_FIND_FILE} -gt ${DTIME_BOOT_FILE} ]] \
        && install -CDm400 -o root -g root $(readlink -e ${FIND_FILE}) ${PATH_BOOT}/${FIND_FILE##*/}
    done
    find ${PATH_KERNEL} -maxdepth 2 -name "ublinux-*.*.*-*" -print | while read FIND_FILE; do
	local DTIME_FIND_FILE=$(stat -c'%Y' $(readlink -e ${FIND_FILE} 2>/dev/null))
        [[ -e ${PATH_BOOT}/${FIND_FILE##*/} ]] && local DTIME_BOOT_FILE=$(stat -c'%Y' ${PATH_BOOT}/${FIND_FILE##*/} 2>/dev/null) || local DTIME_BOOT_FILE=
        [[ ${DTIME_FIND_FILE} =~ ^[0-9]+$ && ${DTIME_BOOT_FILE} =~ ^[0-9]+$ ]] && [[ ${DTIME_FIND_FILE} -gt ${DTIME_BOOT_FILE} ]] \
        && install -CDm400 -o root -g root $(readlink -e ${FIND_FILE}) ${PATH_BOOT}/${FIND_FILE##*/}
    done
    find ${PATH_KERNEL} -maxdepth 2 -name "addon-*.*.*-*" -print | while read FIND_FILE; do
	local DTIME_FIND_FILE=$(stat -c'%Y' $(readlink -e ${FIND_FILE} 2>/dev/null))
        [[ -e ${PATH_BOOT}/${FIND_FILE##*/} ]] && local DTIME_BOOT_FILE=$(stat -c'%Y' ${PATH_BOOT}/${FIND_FILE##*/} 2>/dev/null) || local DTIME_BOOT_FILE=
        [[ ${DTIME_FIND_FILE} =~ ^[0-9]+$ && ${DTIME_BOOT_FILE} =~ ^[0-9]+$ ]] && [[ ${DTIME_FIND_FILE} -gt ${DTIME_BOOT_FILE} ]] \
        && install -CDm400 -o root -g root $(readlink -e ${FIND_FILE}) ${PATH_BOOT}/${FIND_FILE##*/}
    done
}

remove_oldkernel_from_boot(){
# Найти все файлы ядра "vmlinuz-*.*.*-*" и initramfs "ublinux-*.*.*-*" в ${PATH_BOOT}/boot и которые отсутствуют в /usr/modules/*/ удалить
    mountpoint --quiet "${PATH_BOOT}" || return 0
    find ${PATH_BOOT} -maxdepth 1 -name "vmlinuz-*.*.*-*" -exec bash -c "find ${PATH_KERNEL} -maxdepth 2 -name \${1##*/} -exec false \{\} + && rm -f \$1" bash {} \;
    find ${PATH_BOOT} -maxdepth 1 -name "ublinux-*.*.*-*" -exec bash -c "find ${PATH_KERNEL} -maxdepth 2 -name \${1##*/} -exec false \{\} + && rm -f \$1" bash {} \;
}

exec_prepare_menu_kernel(){
# Сформировать меню выбора версии ядра
    mountpoint --quiet "${PATH_BOOT}" || return 0
    FILE_LANG=${LANG%_*}
    FILE_BOOTMENU_KERNEL="/memory/data/from/0/boot/grub/ublinux/grub_${FILE_LANG}_settings_kernel.cfg"
    TXT_RETURN="Return"; TXT_SELECTKERNEL="Select kernel version"
    TXT_RU_RETURN="Возврат"; TXT_RU_SELECTKERNEL="Выбрать версию ядра"
    [[ ${FILE_LANG} == "ru" ]] && TXT_RETURN=${TXT_RU_RETURN} && TXT_SELECTKERNEL=${TXT_RU_SELECTKERNEL}
    [[ -f ${FILE_BOOTMENU_KERNEL} ]] && rm -f ${FILE_BOOTMENU_KERNEL}
    for VMLINUZ_FILES in ${PATH_BOOT}/vmlinuz-*; do
        [[ -f "${VMLINUZ_FILES}" ]] || continue
        [[ ${VMLINUZ_FILES} =~ .*\/vmlinuz\-([0-9]+\.[0-9]+\.[a-z0-9_]+\-[0-9]+)$ ]]
        VMLINUZ_VER=${BASH_REMATCH[1]}
        if [[ -n ${VMLINUZ_VER} && -f ${PATH_BOOT}/ublinux-${VMLINUZ_VER} ]]; then
            VMLINUZ_FILE="vmlinuz-\${VMLINUZ_VER}"
            UBLINUX_FILE="ublinux-\${VMLINUZ_VER}"
            [[ -f ${PATH_BOOT}/addon-${VMLINUZ_VER} ]] && ADDON_FILE="addon-\${VMLINUZ_VER}" || ADDON_FILE=""
            cat << EOF >> "${FILE_BOOTMENU_KERNEL}"
    menuentry "${TXT_SELECTKERNEL}: ${VMLINUZ_VER}" --unrestricted {
        VMLINUZ_VER="${VMLINUZ_VER}"
        VMLINUZ_FILE="${VMLINUZ_FILE}"
        UBLINUX_FILE="${UBLINUX_FILE}"
        ADDON_FILE="${ADDON_FILE}"
        export VMLINUZ_VER
        export VMLINUZ_FILE
        export UBLINUX_FILE
        export ADDON_FILE
        configfile \${prefix}/ublinux/grub_${FILE_LANG}.cfg
    }
EOF
        fi
    done
    cat << EOF >> "${FILE_BOOTMENU_KERNEL}"
    if [ -f \${prefix}/ublinux/grub_${FILE_LANG}.cfg ]; then
        menuentry "${TXT_RETURN}" --unrestricted {
            configfile \${prefix}/ublinux/grub_${FILE_LANG}.cfg
        }
    fi
EOF
}

    copy_newkernel_to_boot
    remove_oldkernel_from_boot
    exec_prepare_menu_kernel
