#!/usr/bin/bash

set -ex

extract_initrd_into_initoverlayfs() {
  DIR_TO_DUMP_INITRAMFS="/var/tmp/initoverlayfs"
  mkdir -p "$DIR_TO_DUMP_INITRAMFS"

  file_type=$(file /boot/initramfs-$kver.img)
  decompressor="lz4cat"
  decompressor_dracut="--lz4"
  if [[ "$file_type" == *"ASCII cpio archive (SVR4 with no CRC)"* ]]; then
    decompressor_dracut=""
    decompressor="zcat"
  elif [[ "$file_type" == *"regular file, no read permission"* ]] || \
       [[ "$file_type" == *"gzip"* ]]; then
    decompressor_dracut=""
    decompressor="zcat"
  fi

  if command -v mkfs.erofs; then
    fstype="erofs"
    cd "$DIR_TO_DUMP_INITRAMFS"
    /usr/lib/dracut/skipcpio /boot/initramfs-$kver.img | $decompressor | cpio -ivd
    cd -
    rm -f /boot/initoverlayfs-$kver.img
    mkfs.erofs /boot/initoverlayfs-$kver.img "$DIR_TO_DUMP_INITRAMFS"
  else
    echo "Please install mkfs.erofs"
    exit 0

    fstype="ext4"
    dd if=/dev/zero of=/boot/initoverlayfs-$kver.img bs=64M count=1
    dev=$(losetup -fP --show /boot/initoverlayfs-$kver.img)
    mkfs.$fstype $dev
    mount $dev "$DIR_TO_DUMP_INITRAMFS"
    cd "$DIR_TO_DUMP_INITRAMFS"
    /usr/lib/dracut/skipcpio /boot/initramfs-$kver.img | zstd -d --stdout | cpio -ivd
    sync
    cd -
    while ! umount "$DIR_TO_DUMP_INITRAMFS"; do
      sleep 1
    done

    losetup -d $dev
  fi
}

while [[ $# -gt 0 ]]; do
  case $1 in
    --kver)
      kver="$2"
      shift 2
      ;;
    -*|--*)
      echo "Unknown option $1"
      exit 1
      ;;
    *)
      break;
      ;;
  esac
done

if [ -z "$kver" ]; then
  kver="$(uname -r)"
fi

initoverlayfs_conf="/etc/initoverlayfs.conf"
if ! [ -e "$initoverlayfs_conf" ]; then
  boot_partition=$(cat /etc/fstab | grep "/boot.*ext4" | awk '{print $1}')
  echo -e "bootfs $boot_partition\nbootfstype ext4\ninitoverlayfs_builder dracut -N -f -v -M --reproducible -o \"initoverlayfs\"\ninitrd_builder dracut -N -f -v -M --reproducible -m \"kernel-modules udev-rules initoverlayfs\" -o \"bash systemd systemd-initrd i18n kernel-modules-extra rootfs-block dracut-systemd usrmount base fs-lib microcode_ctl-fw_dir_override shutdown nss-softok\"\nudev_trigger udevadm trigger --type=devices --action=add --subsystem-match=module --subsystem-match=block --subsystem-match=virtio --subsystem-match=pci --subsystem-match=nvme\n" > $initoverlayfs_conf
fi

no_kern=""
if ! compgen -G /boot/vmlinu* > /dev/null; then
  no_kern="--no-kernel"
fi

initoverlayfs_builder=$(sed -ne "s/^initoverlayfs_builder\s//pg" "$initoverlayfs_conf")
/bin/bash -c "$initoverlayfs_builder"

extract_initrd_into_initoverlayfs

initrd_builder=$(sed -ne "s/^initrd_builder\s//pg" "$initoverlayfs_conf")
/bin/bash -c "$initrd_builder"

