#!/bin/sh
# vim:ts=2:sw=2:et
# see also:
# https://kernel-team.pages.debian.net/kernel-handbook/ch-update-hooks.html#s-kernel-hooks

set -e

# Play nice when run under debconf.
exec </dev/null >&2

eval set -- "$DEB_MAINT_PARAMS"

# Only run on configure and remove to avoid unnecessary work.
case "$1" in
  configure|remove)
    ;;
  *)
    exit 0
    ;;
esac

firmware_dst="/boot/firmware"

if ischroot ; then
  true # chroot detected - skip mount point check
elif [ -e /usr/bin/systemd-detect-virt ] && systemd-detect-virt -q ; then
  true # virtualization detected - skip mount point check
elif ! mountpoint -q "${firmware_dst}" ; then
  echo "raspi-firmware: missing ${firmware_dst}, did you forget to mount it?" >&2
  exit 1
fi

# Ensure the target directory exists. See https://bugs.debian.org/887062
mkdir -p "${firmware_dst}/overlays"
if ! [ -e /boot/overlays ]; then
  ln -s firmware/overlays /boot/overlays
elif ! [ -L /boot/overlays ]; then
  echo "WARNING: raspi-firmware: /boot/overlays exists, but is not a symlink to ${firmware_dst}/overlays" >&2
fi

# Default configurations, overridable at /etc/default/raspi-firmware
KERNEL="auto"
INITRAMFS="auto"
FLAVOURS="v6 v7 v7l v8 2712"

# Load user configuration
if [ -r /etc/default/raspi-firmware ] ; then
  . /etc/default/raspi-firmware
fi

# TODO:
# Handle removed files on upgrade
# Handle removal
# Handle custom kernel?
# Handle upstream kernel
# Handle wrong partition

for flavour in $FLAVOURS; do
  # Copy kernel files to /boot/firmware
  if [ "$KERNEL" = "auto" ] ; then
    latest_kernel=$(ls -1 /boot/vmlinuz-*-rpi-"$flavour" 2> /dev/null | grep -E -v '\.(dpkg-bak|old-dkms)$' | sort -V -r | head -1)
    latest_initrd=$(ls -1 /boot/initrd.img-*-rpi-"$flavour" 2> /dev/null | grep -E -v '\.(dpkg-bak|old-dkms)$' | sort -V -r | head -1)
  fi

  kernel_dst="$firmware_dst/kernel$(echo "$flavour" | sed 's/^v//;s/^6//;s/2712/_2712/;').img"
  initrd_dst="$firmware_dst/initramfs$(echo "$flavour" | sed 's/^v//;s/^6//;s/2712/_2712/;')"
  case $flavour in
    v8|2712)
      dtb_path="/usr/lib/linux-image-${latest_kernel#/boot/vmlinuz-}/broadcom"
      ;;
    *)
      dtb_path="/usr/lib/linux-image-${latest_kernel#/boot/vmlinuz-}"
      ;;
  esac
  overlay_path="/usr/lib/linux-image-${latest_kernel#/boot/vmlinuz-}/overlays"
  if [ "$1" != "remove" ]; then
    if [ "$KERNEL" = "auto" ] ; then
      [ -e "$latest_kernel" ] && [ -e "$latest_initrd" ] || continue
      for dtb in "${dtb_path}"/bcm27*.dtb; do
        [ -e "${dtb}" ] || continue
        cp "${dtb}" /boot/firmware/
      done
      for dtbo in "${overlay_path}"/*.dtb* "${overlay_path}"/README; do
        [ -e "${dtbo}" ] || continue
        cp "${dtbo}" "${firmware_dst}/overlays"
      done
      if [ -e "${firmware_dst}/.firmware_revision" ]; then
        echo "WARNING: raspi-firmware: replacing rpi-update kernels" >&2
        rm -f "${firmware_dst}/.firmware_revision"
      fi
      cp "$latest_kernel" "$kernel_dst"
      cp "$latest_initrd" "$initrd_dst"
    fi
  fi
done
