#!/bin/bash

COMMAND="$1"
KERNEL_VERSION="$2"
BOOT_DIR_ABS="$3"
KERNEL_IMAGE="$4"

# Read the optional config file for automation
[[ -f /etc/kernel-install-for-dracut.conf ]] && source /etc/kernel-install-for-dracut.conf

# Do nothing if the user has elected to omit the fallback initrd
[[ ${NO_DRACUT_FALLBACK} == "true" ]] && exit 0

# If KERNEL_INSTALL_MACHINE_ID is defined but empty, BOOT_DIR_ABS is a fake directory.
# So, let's skip to create initrd.
if ! [[ ${KERNEL_INSTALL_MACHINE_ID-x} ]]; then
    exit 0
fi

if [[ -d "$BOOT_DIR_ABS" ]]; then
    INITRD="initrd-fallback"
else
    BOOT_DIR_ABS="/boot"
    INITRD="initramfs-${KERNEL_VERSION}.img"
fi

ret=0
case "$COMMAND" in
    add)
        INITRD_IMAGE_PREGENERATED=${KERNEL_IMAGE%/*}/initrd-fallback
        if [[ -f ${INITRD_IMAGE_PREGENERATED} ]]; then
            # we found an initrd at the same place as the kernel
            # use this and don't generate a new one
            cp --reflink=auto "$INITRD_IMAGE_PREGENERATED" "$BOOT_DIR_ABS/$INITRD" \
                && chown root:root "$BOOT_DIR_ABS/$INITRD" \
                && chmod 0600 "$BOOT_DIR_ABS/$INITRD" \
                && exit 0
        fi

        if [[ -f /etc/kernel/cmdline ]]; then
            read -r -d '' -a BOOT_OPTIONS < /etc/kernel/cmdline
        elif [[ -f /usr/lib/kernel/cmdline ]]; then
            read -r -d '' -a BOOT_OPTIONS < /usr/lib/kernel/cmdline
        else
            declare -a BOOT_OPTIONS

            read -r -d '' -a line < /proc/cmdline
            for i in "${line[@]}"; do
                [[ "${i#initrd=*}" != "$i" ]] && continue
                BOOT_OPTIONS+=("$i")
            done
        fi

        unset noimageifnotneeded

        for ((i=0; i < "${#BOOT_OPTIONS[@]}"; i++)); do
            # shellcheck disable=SC1001
            if [[ ${BOOT_OPTIONS[$i]} == root\=PARTUUID\=* ]]; then
                noimageifnotneeded="yes"
                break
            fi
        done
        [[ ${DRACUT_QUIET} == "true" ]] && DRACUT_EXTRA_PARAMS=" --quiet"
        dracut --no-hostonly --force${DRACUT_EXTRA_PARAMS} ${noimageifnotneeded:+--noimageifnotneeded} "$BOOT_DIR_ABS/$INITRD" "$KERNEL_VERSION"
        ret=$?
	;;
    remove)
        rm -f -- "$BOOT_DIR_ABS/$INITRD"
        ret=$?
	;;
esac
exit $ret