#!/bin/bash

if [ ${DEBUG_TRACE:-1} -gt 0 ]; then
    set -x
fi
set -eu
set -o pipefail
set -x
GRUB_CFG=

function install_grub2_x86 ()
{
    # make boot.img/core.img and setup, to support legacy boot mode
    GRUBNAME=$(which grub2-install)
    echo "Installing GRUB2..."
    GRUB_OPTS=${GRUB_OPTS:-"--force"}
    GRUB_OPTS="$GRUB_OPTS --target=i386-pc"

    $GRUBNAME --modules="biosdisk part_msdos" $GRUB_OPTS $DEVICE

    # make efi file, and save in FAT16 partition, to support UEFI boot mode
    cp -r /usr/lib/grub/x86_64-efi boot/efi/EFI/openEuler
    eval "grub2-mkimage -d /usr/lib/grub/x86_64-efi -O x86_64-efi --output=/boot/efi/EFI/openEuler/grubx64.efi '--prefix=(,msdos1)/efi/EFI/openEuler' fat part_gpt part_msdos linux"

    mkdir -p /boot/EFI/BOOT/
    cp -f /boot/efi/EFI/openEuler/grubx64.efi /boot/EFI/BOOT/BOOTX64.EFI

    echo 'GRUB_TIMEOUT=5' >> /etc/default/grub
    echo 'GRUB_DEFAULT=saved' >> /etc/default/grub
    echo 'GRUB_DISABLE_SUBMENU=true' >> /etc/default/grub
    echo 'GRUB_TERMINAL_OUTPUT="console"' >> /etc/default/grub
    echo 'GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0 rootfstype=ext4  quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3"' >> /etc/default/grub
    echo 'GRUB_DISABLE_RECOVERY="true"' >>/etc/default/grub
    echo 'GRUB_DISABLE_OS_PROBER="true"' >> /etc/default/grub
    echo "cat <<EOF" >> /etc/grub.d/00_header
    echo "set superusers=\"root\"" >> /etc/grub.d/00_header

    echo "password_pbkdf2 root grub.pbkdf2.sha512.10000.5A45748D892672FDA02DD3B6F7AE390AC6E6D532A600D4AC477D25C7D087644697D8A0894DFED9D86DC2A27F4E01D925C46417A225FC099C12DBD3D7D49A7425.2BD2F5BF4907DCC389CC5D165DB85CC3E2C94C8F9A30B01DACAA9CD552B731BA1DD3B7CC2C765704D55B8CD962D2AEF19A753CBE9B8464E2B1EB39A3BB4EAB08" >> /etc/grub.d/00_header
    echo "EOF" >> /etc/grub.d/00_header

    UEFI_GRUB_CFG=/boot/efi/EFI/openEuler/grub.cfg
    LEGACY_GRUB_CFG=/boot/grub2/grub.cfg
    grub2-mkconfig -o $UEFI_GRUB_CFG
    grub2-mkconfig -o $LEGACY_GRUB_CFG
    sed_str="root=UUID=${ROOT_FS_UUID} "
    sed -i "s#root=.*.img #${sed_str}#g" $UEFI_GRUB_CFG
    sed -i "s#root=.*.img #${sed_str}#g" $LEGACY_GRUB_CFG
}

function install_grub2_efi ()
{
    cp -r /usr/lib/grub/arm64-efi /boot/efi/EFI/openEuler/
    eval "grub2-mkimage -d /usr/lib/grub/arm64-efi -O arm64-efi --output=/boot/efi/EFI/openEuler/grubaa64.efi '--prefix=(,msdos1)/efi/EFI/openEuler' fat part_gpt part_msdos linux"

    mkdir -p /boot/EFI/BOOT/
    cp -f /boot/efi/EFI/openEuler/grubaa64.efi /boot/EFI/BOOT/BOOTAA64.EFI

    echo 'GRUB_TIMEOUT=5' >> /etc/default/grub
    echo 'GRUB_DEFAULT=saved' >> /etc/default/grub
    echo 'GRUB_DISABLE_SUBMENU=true' >> /etc/default/grub
    echo 'GRUB_TERMINAL_OUTPUT="console"' >> /etc/default/grub
    echo 'GRUB_CMDLINE_LINUX="rootfstype=ext4  quiet oops=panic softlockup_panic=1 net.ifnames=0 biosdevname=0 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M reserve_kbox_mem=16M crash_kexec_post_notifiers panic=3 no-steal-time use-sched-idle-time"' >> /etc/default/grub
    echo 'GRUB_DISABLE_RECOVERY="true"' >>/etc/default/grub

    echo "cat <<EOF" >> /etc/grub.d/00_header
    echo "set superusers=\"root\"" >> /etc/grub.d/00_header
    echo "password_pbkdf2 root grub.pbkdf2.sha512.10000.D0649C25C42DA547B79AD683974DE105D0F0899C1EFA4AD34BE49E87C5A41C89F9C1E29A88BBDC05584706C89F3FEB5A284A8A85738058A15F21A862A0464E34.CC0D536DF0418B75C34351B635BF209E05B02503B2440C7FE290843287925E0221860080318EC5A8C8D796B29A2C73C6623B6EAAE04FF8840EE6FCEDA3C29C46" >> /etc/grub.d/00_header

    echo "EOF" >> /etc/grub.d/00_header
    GRUB_CFG=/boot/efi/EFI/openEuler/grub.cfg
    grub2-mkconfig -o $GRUB_CFG
    sed_str="root=UUID=${ROOT_FS_UUID} "
    sed -i "s#root=.*.img #${sed_str}#g" $GRUB_CFG
}

function install_grub2_loongarch64 ()
{
    cp -r /usr/lib/grub/loongarch64-efi /boot/efi/EFI/openEuler/
    eval "grub2-mkimage -d /usr/lib/grub/loongarch64-efi -O loongarch64-efi --output=/boot/efi/EFI/openEuler/grubloongarch64.efi '--prefix=(,msdos1)/efi/EFI/openEuler' fat part_gpt part_msdos linux"

    mkdir -p /boot/EFI/BOOT/
    cp -f /boot/efi/EFI/openEuler/grubloongarch64.efi /boot/EFI/BOOT/BOOTLOONGARCH64.EFI
    cp -f /boot/efi/EFI/openEuler/grubloongarch64.efi /boot/EFI/BOOT/BOOTLOONGARCH.EFI

    echo 'GRUB_TIMEOUT=5' >> /etc/default/grub
    echo 'GRUB_DEFAULT=saved' >> /etc/default/grub
    echo 'GRUB_DISABLE_SUBMENU=true' >> /etc/default/grub
    echo 'GRUB_TERMINAL_OUTPUT="console"' >> /etc/default/grub
    echo 'GRUB_CMDLINE_LINUX="rootfstype=ext4  quiet oops=panic softlockup_panic=1 net.ifnames=0 biosdevname=0 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M reserve_kbox_mem=16M crash_kexec_post_notifiers panic=3 no-steal-time use-sched-idle-time"' >> /etc/default/grub
    echo 'GRUB_DISABLE_RECOVERY="true"' >>/etc/default/grub

    echo "cat <<EOF" >> /etc/grub.d/00_header
    echo "set superusers=\"root\"" >> /etc/grub.d/00_header
    echo "password_pbkdf2 root grub.pbkdf2.sha512.10000.5A45748D892672FDA02DD3B6F7AE390AC6E6D532A600D4AC477D25C7D087644697D8A0894DFED9D86DC2A27F4E01D925C46417A225FC099C12DBD3D7D49A7425.2BD2F5BF4907DCC389CC5D165DB85CC3E2C94C8F9A30B01DACAA9CD552B731BA1DD3B7CC2C765704D55B8CD962D2AEF19A753CBE9B8464E2B1EB39A3BB4EAB08" >> /etc/grub.d/00_header

    echo "EOF" >> /etc/grub.d/00_header
    GRUB_CFG=/boot/efi/EFI/openEuler/grub.cfg
    grub2-mkconfig -o $GRUB_CFG
    sed_str="root=UUID=${ROOT_FS_UUID} "
    sed -i "s#root=.*.img #${sed_str}#g" $GRUB_CFG
}

function install_grub2_riscv64 ()
{
    cp -r /usr/lib/grub/riscv64-efi /boot/efi/EFI/openEuler/
    eval "grub2-mkimage -d /usr/lib/grub/riscv64-efi -O riscv64-efi --output=/boot/efi/EFI/openEuler/grubriscv64.efi '--prefix=(,msdos1)/efi/EFI/openEuler' fat part_gpt part_msdos linux"

    mkdir -p /boot/EFI/BOOT/
    cp -f /boot/efi/EFI/openEuler/grubriscv64.efi /boot/EFI/BOOT/BOOTRISCV64.EFI

    echo 'GRUB_TIMEOUT=5' >> /etc/default/grub
    echo 'GRUB_DEFAULT=saved' >> /etc/default/grub
    echo 'GRUB_DISABLE_SUBMENU=true' >> /etc/default/grub
    echo 'GRUB_TERMINAL_OUTPUT="console"' >> /etc/default/grub
    echo 'GRUB_CMDLINE_LINUX="console=ttyS0 highres=off earlycon systemd.default_timeout_start_sec=600 rootfstype=ext4  net.ifnames=0 biosdevname=0 nmi_watchdog=1 rd.shell=0 crashkernel=256M reserve_kbox_mem=16M crash_kexec_post_notifiers panic=3 no-steal-time use-sched-idle-time initcall_blacklist=efi_rtc_driver_init"' >> /etc/default/grub
    echo 'GRUB_DISABLE_RECOVERY="true"' >>/etc/default/grub

    echo "cat <<EOF" >> /etc/grub.d/00_header
    echo "set superusers=\"root\"" >> /etc/grub.d/00_header
    echo "password_pbkdf2 root grub.pbkdf2.sha512.10000.5A45748D892672FDA02DD3B6F7AE390AC6E6D532A600D4AC477D25C7D087644697D8A0894DFED9D86DC2A27F4E01D925C46417A225FC099C12DBD3D7D49A7425.2BD2F5BF4907DCC389CC5D165DB85CC3E2C94C8F9A30B01DACAA9CD552B731BA1DD3B7CC2C765704D55B8CD962D2AEF19A753CBE9B8464E2B1EB39A3BB4EAB08" >> /etc/grub.d/00_header

    echo "EOF" >> /etc/grub.d/00_header
    GRUB_CFG=/boot/efi/EFI/openEuler/grub.cfg
    grub2-mkconfig -o $GRUB_CFG
    sed_str="root=UUID=${ROOT_FS_UUID} "
    sed -i "s#root=.*.img #${sed_str}#g" $GRUB_CFG
}

if [ -f /boot/grub2/device.map ]; then
cat << EOF | tee /boot/grub2/device.map > /dev/null
(hd0)   /dev/xvda
EOF
fi

if [ $ARCH == "x86_64" ]; then
    install_grub2_x86
fi


if [ $ARCH == "aarch64" ]; then
    install_grub2_efi
fi

if [ $ARCH == "loongarch64" ]; then
    install_grub2_loongarch64
fi

if [ $ARCH == "riscv64" ]; then
    install_grub2_riscv64
fi
