#!/bin/sh
set -e

# Automatically added by dh_dkms/3.0.10-8+deb12u1
# The original file can be found in template-dkms-mkdeb/debian/postinst
# in the DKMS tarball, check it for copyright notices.

DKMS_NAME=loonggpu
DKMS_PACKAGE_NAME=$DKMS_NAME-dkms
DKMS_VERSION=1.0.1
kernel_version="$(uname -r)"
arch="$(uname -m)"

postinst_found=0
KERNEL_HEADERS="linux-headers-$(uname -r)"

print_at_chars() {
	n=$1
	i=0
	while [ $i -lt $n ]; do
		echo -n "@"
		i=$((i+1))
	done
	echo
}

if ! dpkg-query -s "$KERNEL_HEADERS" > /dev/null 2>&1; then
	length=${#KERNEL_HEADERS}
	length=$(expr $length + 61)

	print_at_chars $length
	echo "@  Kernel header for the current kernel $KERNEL_HEADERS are not installed  @"
	echo "@  Please install them using: sudo apt-get install $KERNEL_HEADERS         @"
	print_at_chars $length
	exit 1
fi

# Ensure required commands are present
if ! command -v lspci >/dev/null 2>&1; then
    echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
    echo "@  ERROR: please install command 'lspci' using: sudo apt-get install pciutils  @"
    echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
    exit 1
fi

# Detect specific hardware
lspci_output=$(lspci -nn)
is_7a2000=false
if echo "$lspci_output" | grep -qE "0014:7a25|0014:7a36"; then
    is_7a2000=true
fi

# Create /usr/lib/modprobe.d only if modprobe exists
if $is_7a2000; then
    if command -v modprobe >/dev/null 2>&1 && [ ! -d "/usr/lib/modprobe.d" ]; then
        mkdir -p "/usr/lib/modprobe.d"
    fi
    echo "blacklist loongson" > /usr/lib/modprobe.d/loongson-blacklist.conf
fi

# Detect initrd tools and create necessary directories
if command -v update-initramfs >/dev/null 2>&1 || command -v mkinitramfs >/dev/null 2>&1; then
    # Create directory for initramfs-tools modules
    if [ ! -d "/usr/share/initramfs-tools/modules.d" ]; then
        mkdir -p "/usr/share/initramfs-tools/modules.d"
    fi
    echo "loonggpu" > /usr/share/initramfs-tools/modules.d/loonggpu_mod
fi

if command -v dracut >/dev/null 2>&1 || command -v mkinitrd >/dev/null 2>&1; then
    # Create directory for dracut configuration
    if [ ! -d "/usr/lib/dracut/dracut.conf.d" ]; then
        mkdir -p "/usr/lib/dracut/dracut.conf.d"
    fi
    echo "add_drivers+=\" loonggpu \"" > /usr/lib/dracut/dracut.conf.d/10-loonggpu.conf
fi

# Run a command that we may or may not want to be detailed about.
invoke_command() {
    # $1 = command to be executed using eval.
    # $2 = Description of command to run
    local exitval=0
    echo -e "$1" || echo -en "$2..."
    eval "$1"; exitval=$?
    [ $exitval -gt 0 ] && echo -en "(bad exit status: $exitval)"
    echo "\n"
    return $exitval
}

make_loonggpu_initrd() {
    # $1 = kernel version
    # $2 = arch
    # $3 = 'backup', if backup of old initrd is wanted (using .old-dkms filename suffix)
    [ $no_initrd ] && return
    local mkinitrd 
    local kernel_file 
    local initrd_dir="/boot"
    for mkinitrd in dracut update-initramfs mkinitrd mkinitramfs ''; do
        [ $mkinitrd ] && which "$mkinitrd" >/dev/null 2>&1 && break
    done

    # No mkinitrd? Just return.
    [ $mkinitrd ] || return 0

    # Back up our current initrd
    echo ""
    # Find out what the proper filename will be
    for initrd in "initrd-$1.img" "initramfs-$1.img" "initrd.img-$1" "initrd-$1" ''; do
        [ $initrd ] && [ -f $initrd_dir/$initrd ] && break
    done
    if ! [ $initrd ]; then
        # Return if we cannot find an initrd.
        echo "Unable to find an initial ram disk that I know how to handle." \
            "Will not try to make an initrd."
        return 0
    fi
    if [ $3 = backup ]; then 
        echo "Backing up $initrd to $initrd_dir/$initrd.old-dkms"
        cp -f "$initrd_dir/$initrd" "$initrd_dir/$initrd.old-dkms"
        echo "Making new $initrd"
        echo "(If next boot fails, revert to $initrd.old-dkms image)"
    fi

    if [ $mkinitrd = dracut ]; then
        invoke_command "$mkinitrd -f $initrd_dir/$initrd $1" "$mkinitrd"
    elif [ $mkinitrd = update-initramfs ]; then
        invoke_command "$mkinitrd -u -k $1" "$mkinitrd"
    elif [ $mkinitrd = mkinitramfs ]; then
        invoke_command "$mkinitrd -o $initrd_dir/$initrd $1" "$mkinitrd"
    elif $mkinitrd --version >/dev/null 2>&1; then
        invoke_command "$mkinitrd -f $initrd_dir/$initrd $1" "$mkinitrd"
    elif [ -e /etc/SuSE-release ] || [ -d /etc/SuSEconfig ]; then
        for kernel_file in vmlinuz vmlinux ''; do
            [ $kernel_file ] && [ -f $initrd_dir/$kernel_file ] && break
        done
        if [ ! $kernel_file ]; then
            echo "Unable to find valid kernel file under " \
            "$initrd_dir for kernel version $1"
            return 1;
        fi
        invoke_command "$mkinitrd -k $kernel_file-$1 -i $initrd" "$mkinitrd"
    elif [ -e /etc/debian_version ]; then
        invoke_command "$mkinitrd -o $initrd_dir/$initrd $1" "$mkinitrd"
    else
        echo ""
        echo "Calling $mkinitrd (bad exit status 9 may occur)"
        invoke_command "$mkinitrd" "$mkinitrd"
    fi
    return
}

case "$1" in
    configure)
        for DKMS_POSTINST in /usr/lib/dkms/common.postinst /usr/share/$DKMS_PACKAGE_NAME/postinst; do
            if [ -f $DKMS_POSTINST ]; then
                $DKMS_POSTINST $DKMS_NAME $DKMS_VERSION /usr/share/$DKMS_PACKAGE_NAME "" $2
                make_loonggpu_initrd "$kernel_version" "$arch" backup
                postinst_found=1
            fi
            break
        done
        if [ "$postinst_found" -eq 0 ]; then
            echo "ERROR: DKMS version is too old and $DKMS_PACKAGE_NAME was not"
            echo "built with legacy DKMS support."
            echo "You must either rebuild $DKMS_PACKAGE_NAME with legacy postinst"
            echo "support or upgrade DKMS to a more current version."
            exit 1
        fi
    ;;
esac
# End automatically added section

