#!/bin/sh
set -eu

MKINITRAMFS=${MKINITRAMFS:-mkinitramfs}
DEPMOD=${DEPMOD:-depmod}
BOOT_DIR=${BOOT_DIR:-/boot}

if ! command -v "$MKINITRAMFS" >/dev/null 2>&1; then
    echo "error: $MKINITRAMFS not found in PATH" >&2
    exit 1
fi

if ! command -v "$DEPMOD" >/dev/null 2>&1; then
    echo "error: $DEPMOD not found in PATH" >&2
    exit 1
fi

if [ ! -d "$BOOT_DIR" ]; then
    echo "error: boot directory not found: $BOOT_DIR" >&2
    exit 1
fi

versions=""

add_version() {
    v=$1
    case "
$versions
" in
*"
$v
"*) ;;
*)
    if [ -z "$versions" ]; then
        versions=$v
    else
        versions=$versions"
"$v
    fi
    ;;
esac
}

for moddir in /lib/modules/*/; do
    [ -d "$moddir" ] || continue
    kver=${moddir%/}
    kver=${kver##*/}
    [ -n "$kver" ] || continue

    vmlinuz_link="$moddir/vmlinuz"
    [ -e "$vmlinuz_link" ] || continue

    kernel_image=$(readlink -f "$vmlinuz_link" 2>/dev/null) || continue
    [ -f "$kernel_image" ] || continue

    add_version "$kver"
done

if [ -z "$versions" ]; then
    echo "no versioned kernels found via /lib/modules/*/vmlinuz" >&2
    exit 0
fi

(
    cd "$BOOT_DIR" || exit 1
    printf '%s\n' "$versions" | while IFS= read -r kver; do
        [ -n "$kver" ] || continue

        vmlinuz_link="/lib/modules/$kver/vmlinuz"
        kernel_image=$(readlink -f "$vmlinuz_link" 2>/dev/null) || {
            echo "skipping $kver: cannot resolve /lib/modules/$kver/vmlinuz" >&2
            continue
        }
        [ -f "$kernel_image" ] || {
            echo "skipping $kver: kernel image not found at $kernel_image" >&2
            continue
        }

        echo "running depmod for $kver" >&2
        "$DEPMOD" -a "$kver" || {
            echo "error: depmod failed for $kver, skipping initramfs" >&2
            continue
        }

        echo "updating initramfs for $kver (kernel: $kernel_image)" >&2
        "$MKINITRAMFS" "$kver"
    done
)
