#!/usr/bin/bash

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

# If KERNEL_INSTALL_MACHINE_ID is defined but empty, BOOT_DIR_ABS is a fake directory.
# In this case, do not create the initrd.
if ! [[ ${KERNEL_INSTALL_MACHINE_ID-x} ]]; then
    exit 0
fi

# Skip this plugin if we're using a different generator. If nothing is specified,
# assume we're wanted since we're installed.
if [ "${KERNEL_INSTALL_INITRD_GENERATOR:-dracut}" != "dracut" ]; then
    exit 0
fi

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

ret=0
case "$COMMAND" in
    add)
        # If the initrd was provided on the kernel command line, we shouldn't generate our own.
        [ "$#" -gt "$INITRD_OPTIONS_SHIFT" ] && exit 0

        INITRD_IMAGE_PREGENERATED=${KERNEL_IMAGE%/*}/initrd
        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 -f \
            ${noimageifnotneeded:+--noimageifnotneeded} \
            $([[ "$KERNEL_INSTALL_VERBOSE" == 1 ]] && echo --verbose) \
            "$BOOT_DIR_ABS/$INITRD" \
            "$KERNEL_VERSION"
        ret=$?
	;;
    remove)
        rm -f -- "$BOOT_DIR_ABS/$INITRD"
        ret=$?
	;;
esac
exit $ret
