#!/bin/sh
# Stage one exact JD2 kernel/initramfs pair for a one-shot tryboot trial.

set -eu

usage() {
    echo "Usage: jd2-tryboot-stage <kernel-version> [vmlinuz-path] [initrd-path]" >&2
    exit 2
}

[ "$#" -ge 1 ] && [ "$#" -le 3 ] || usage

KVER="$1"
VMLINUX="${2:-/boot/vmlinuz-${KVER}}"
INITRD="${3:-/boot/initrd.img-${KVER}}"
FIRMWARE_DIR="${JD2_FIRMWARE_DIR:-/boot/firmware}"
CONFIG_TXT="${FIRMWARE_DIR}/config.txt"
CANDIDATE_KERNEL="${FIRMWARE_DIR}/kernel_2712_jd2-candidate.img"
CANDIDATE_INITRAMFS="${FIRMWARE_DIR}/initramfs_2712_jd2-candidate"
TRYBOOT_TXT="${FIRMWARE_DIR}/tryboot.txt"
CANDIDATE_KVER="${FIRMWARE_DIR}/jd2-candidate-kver"

case "${KVER}" in
    *-jd2|*-jd2.*) ;;
    *) echo "jd2-tryboot-stage: refusing non-JD2 kernel version ${KVER}" >&2; exit 1 ;;
esac

[ -r "${VMLINUX}" ] || { echo "jd2-tryboot-stage: kernel not readable at ${VMLINUX}" >&2; exit 1; }
[ -r "${INITRD}" ] || { echo "jd2-tryboot-stage: initramfs not readable at ${INITRD}" >&2; exit 1; }
[ -r "${CONFIG_TXT}" ] || { echo "jd2-tryboot-stage: config not readable at ${CONFIG_TXT}" >&2; exit 1; }

TMP_KERNEL="${CANDIDATE_KERNEL}.tmp.$$"
TMP_INITRAMFS="${CANDIDATE_INITRAMFS}.tmp.$$"
TMP_TRYBOOT="${TRYBOOT_TXT}.tmp.$$"
TMP_KVER="${CANDIDATE_KVER}.tmp.$$"
cleanup() {
    rm -f "${TMP_KERNEL}" "${TMP_INITRAMFS}" "${TMP_TRYBOOT}" "${TMP_KVER}"
}
trap cleanup EXIT HUP INT TERM

install -D -m 0644 "${VMLINUX}" "${TMP_KERNEL}"
install -D -m 0644 "${INITRD}" "${TMP_INITRAMFS}"
sed 's#^kernel=/kernel_2712_jd2\.img$#kernel=/kernel_2712_jd2-candidate.img#' \
    "${CONFIG_TXT}" > "${TMP_TRYBOOT}"
grep -q '^kernel=/kernel_2712_jd2-candidate\.img$' "${TMP_TRYBOOT}" || {
    echo "jd2-tryboot-stage: ${CONFIG_TXT} does not select /kernel_2712_jd2.img" >&2
    exit 1
}
printf '%s\n' "${KVER}" > "${TMP_KVER}"

# All inputs and temporary outputs are complete before any candidate name is
# replaced. Invalidate any prior candidate marker and persist that removal
# first, so an interrupted restage cannot make new artifacts appear valid
# under an old KVER. The new marker moves last as the validity indicator.
rm -f "${CANDIDATE_KVER}"
sync "${FIRMWARE_DIR}" 2>/dev/null || sync
mv -f "${TMP_KERNEL}" "${CANDIDATE_KERNEL}"
mv -f "${TMP_INITRAMFS}" "${CANDIDATE_INITRAMFS}"
mv -f "${TMP_TRYBOOT}" "${TRYBOOT_TXT}"
mv -f "${TMP_KVER}" "${CANDIDATE_KVER}"

sync "${FIRMWARE_DIR}" 2>/dev/null || sync
trap - EXIT HUP INT TERM
exit 0
