#!/bin/sh
# grub-sysconfig-migrate -- migrate legacy variables in /etc/sysconfig/grub2
#
# This script is called from %post on grub-common package upgrade.
# It uses GRUB_SYSCONFIG_VERSION to track which migrations have
# already been applied and only runs newer ones.
#
# To add a new migration:
#   1. Increment CURRENT_VERSION
#   2. Add a new "if [ "$version" -lt N ]" block
#   3. Update GRUB_SYSCONFIG_VERSION in altlinux/grub2-sysconfig

set -efu

CURRENT_VERSION=1
SYSCONFIG="${GRUB_SYSCONFIG_MIGRATE_CONF:-/etc/sysconfig/grub2}"

if [ ! -f "$SYSCONFIG" ]; then
    exit 0
fi

if [ ! -w "$SYSCONFIG" ]; then
    echo "grub-sysconfig-migrate: $SYSCONFIG is not writable" >&2
    exit 1
fi

# Read current version (0 if absent)
version=$(sed -n 's/^GRUB_SYSCONFIG_VERSION=//p' "$SYSCONFIG" | head -n1)
version="${version:-0}"

# Ensure version is numeric; treat garbage as 0
case "$version" in
    *[!0-9]*) version=0 ;;
esac

if [ "$version" -ge "$CURRENT_VERSION" ]; then
    exit 0
fi

tmpfile="$(mktemp "$SYSCONFIG.XXXXXX")"
trap 'rm -f "$tmpfile"' EXIT

cp -a "$SYSCONFIG" "$tmpfile"

# === Version 1 migrations ===
if [ "$version" -lt 1 ]; then

    # -- Transformation 1: GRUB_CMDLINE_LINUX -> GRUB_CMDLINE_LINUX_RECOVERY --
    # Move GRUB_CMDLINE_LINUX value to GRUB_CMDLINE_LINUX_RECOVERY,
    # then clear GRUB_CMDLINE_LINUX.
    if grep -q '^GRUB_CMDLINE_LINUX=' "$tmpfile" && \
       ! grep -q '^GRUB_CMDLINE_LINUX_RECOVERY=' "$tmpfile"; then
        cmdline_val=$(sed -n 's/^GRUB_CMDLINE_LINUX=//p' "$tmpfile" | head -n1)
        sed -i "s/^GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX=''/" "$tmpfile"
        escaped_val=$(printf '%s' "$cmdline_val" | sed 's/[\/&\\]/\\&/g')
        sed -i "/^GRUB_CMDLINE_LINUX=''/a\\
GRUB_CMDLINE_LINUX_RECOVERY=$escaped_val" "$tmpfile"
    fi

    # -- Transformation 2: GRUB_VMLINUZ_FAILSAFE -> GRUB_DISABLE_RECOVERY --
    if grep -q '^GRUB_VMLINUZ_FAILSAFE=' "$tmpfile"; then
        failsafe_val=$(sed -n "s/^GRUB_VMLINUZ_FAILSAFE=//p" "$tmpfile" | head -n1)
        # Strip quotes
        failsafe_val=$(printf '%s\n' "$failsafe_val" | sed "s/^['\"]//;s/['\"]$//")

        case "$failsafe_val" in
            no|false) disable_recovery=true ;;
            *)        disable_recovery=false ;;
        esac

        if grep -q '^GRUB_DISABLE_RECOVERY=' "$tmpfile"; then
            # GRUB_DISABLE_RECOVERY already set, just remove the old variable
            sed -i '/^GRUB_VMLINUZ_FAILSAFE=/d' "$tmpfile"
        else
            # Replace GRUB_VMLINUZ_FAILSAFE with GRUB_DISABLE_RECOVERY
            sed -i "s/^GRUB_VMLINUZ_FAILSAFE=.*/GRUB_DISABLE_RECOVERY=$disable_recovery/" "$tmpfile"
        fi

        # Remove old comment block for GRUB_VMLINUZ_FAILSAFE
        sed -i '/^# Whether to add failsafe entries:/,/^# default: default$/d' "$tmpfile"
    fi

    # -- Transformation 3: Ensure required variables --
    grep -q '^GRUB_DISTRIBUTOR=' "$tmpfile" ||
        echo 'GRUB_DISTRIBUTOR="ALT Linux"' >> "$tmpfile"

    grep -q '^GRUB_BOOTLOADER_ID=' "$tmpfile" ||
        echo 'GRUB_BOOTLOADER_ID="altlinux"' >> "$tmpfile"

fi
# === End version 1 migrations ===

# Update version marker
if grep -q '^GRUB_SYSCONFIG_VERSION=' "$tmpfile"; then
    sed -i "s/^GRUB_SYSCONFIG_VERSION=.*/GRUB_SYSCONFIG_VERSION=$CURRENT_VERSION/" "$tmpfile"
else
    sed -i "1i\\
# Sysconfig migration version, do not edit\\
GRUB_SYSCONFIG_VERSION=$CURRENT_VERSION\\
" "$tmpfile"
fi

mv -b -S ".pre-migrate" "$tmpfile" "$SYSCONFIG"
trap - EXIT
