#!/bin/sh -e

. /usr/share/initramfs-tools/hook-functions
update=0
create=0
version=""
delete=0

usage() {
	cat << EOF

Usage: update-miniramfs {-c|-d|-u} [-k version]

Options:
 -k version	Specify kernel version
 -c		Create a new initramfs
 -u		Update all existing initramfs
 -d		Remove an existing initramfs

EOF
}

OPTIONS=$(getopt -o "k:udc" -n "$0" -- "$@") || usage

eval set -- "$OPTIONS"

while true; do
    case "$1" in
        -u )
            shift
            update=1
            ;;
        -c )
            shift
            create=1
            ;;
        -d )
            shift
            delete=1
            ;;
        -k )
            version="$2"
            shift 2
            ;;
        --)
            shift
            break
            ;;
        * )
            usage
            exit 0
            ;;

    esac
done

build_kernel() {
    export version="$1"
    export DESTDIR=$(mktemp -d /tmp/miniramfs.XXXXXXXX)
    export verbose=n
    # Required by hook-functions for manual_add_modules
    __MODULES_TO_ADD="$(mktemp "${TMPDIR:-/var/tmp}/modules_XXXXXX")" || exit 1
    export __MODULES_TO_ADD


    echo "update-miniramfs: Generating /boot/miniramfs-${version}"

    for dir in bin lib sbin; do
        mkdir -p "${DESTDIR}/usr/${dir}"
        ln -s "usr/${dir}" "${DESTDIR}/${dir}"
    done

    /usr/share/initramfs-tools/hooks/udev
    /usr/share/initramfs-tools/hooks/zz-busybox

    moddir="/lib/modules/${version}"
    mkdir -p "${DESTDIR}${moddir}"
    cp ${moddir}/modules.* ${DESTDIR}${moddir}

    manual_add_modules ext2 ext3 ext4 phy_rockchip_emmc
    apply_add_modules
    depmod -a -b ${DESTDIR} ${version}

    install -m 0755 /usr/share/miniramfs/init "${DESTDIR}/init"

    # Required for finding /boot without kernel parameter
    copy_file "config" /etc/fstab

    # Required for zstd compressed initrd
    if command -v zstd > /dev/null; then
        copy_exec $(command -v zstd)
    fi

    cd ${DESTDIR}
    find . -print0 | cpio --quiet --null --create --format=newc | gzip --best > /boot/miniramfs-${version}
    rm -r "${DESTDIR}" "${__MODULES_TO_ADD}"
}


if [ ${delete} -eq 1 ]; then
    if [ -z ${version} ]; then
        echo "Delete requires a kernel version"
        echo "please use \`$0 -k <version> -d\`"
        exit 1
    fi
    rm /boot/miniramfs-${version}
    exit $?
fi

if [ ${create} -eq 1 ]; then
    if [ -z ${version} ]; then
        echo "Create requires a kernel version"
        echo "please use \`$0 -k <version> -c\`"
        exit 1
    fi
    build_kernel ${version}
    exit $?
fi

if [ ${update} -eq 1 ]; then
    linux-version list | while read -r version; do
        build_kernel ${version}
    done
fi
