#!/bin/bash
# Filename:      ${GRML_FAI_CONFIG}/config/scripts/GRMLBASE/45-efi
# Purpose:       create grub image for use in ISO for EFI boot
# Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
# Bug-Reports:   see http://grml.org/bugs/
# License:       This file is licensed under the GPL v2 or any later version.
################################################################################

set -e
set -u


BOOTX64="${target}/boot/bootx64.efi"
BOOTX32="${target}/boot/bootia32.efi"
EFI_IMG="${target}/boot/efi.img"
TMP_CONFIG="${target}/tmp/grub_config_efi"

rm -f "$BOOTX64" "$EFI_IMG" "$TMP_CONFIG"

cat > "$TMP_CONFIG" <<EOF
search.file /conf/bootid.txt root
set prefix=(\$root)/boot/grub
insmod normal
normal
echo "E: Could not find root device!"
EOF

BOOTX64="${BOOTX64##${target}}"
BOOTX32="${BOOTX32##${target}}"
EFI_IMG="${EFI_IMG##${target}}"
TMP_CONFIG="${TMP_CONFIG##${target}}"

ARCHS=(i386-pc)

declare -A ADDITIONAL_MODULES
ADDITIONAL_MODULES[i386-pc]="biosdisk"

if ifclass AMD64 ; then
  if [ -r "${target}"/usr/lib/grub/x86_64-efi/moddep.lst ] ; then
    ARCHS+=(x86_64-efi)
    ADDITIONAL_MODULES[x86_64-efi]="efi_gop efi_uga"
  else
    echo "/usr/lib/grub/x86_64-efi/moddep.lst could not be found, skipping."
    echo "NOTE: grub-efi-amd64-bin not installed?"
  fi
elif ifclass I386 ; then
  if [ -r "${target}"/usr/lib/grub/i386-efi/moddep.lst ] ; then
    ARCHS+=(i386-efi)
    ADDITIONAL_MODULES[i386-efi]="efi_gop efi_uga"
  else
    echo "/usr/lib/grub/i386-efi/moddep.lst could not be found, skipping."
    echo "NOTE: grub-efi-ia32 not installed?"
  fi
fi

for arch in ${ARCHS[@]} ; do
  $ROOTCMD grub-mkimage -O $arch -o /boot/$arch.img --prefix=/boot/grub/ --config="$TMP_CONFIG" \
    echo iso9660 part_msdos search_fs_file test \
    fat ext2 reiserfs xfs btrfs squash4 part_gpt lvm \
    ${ADDITIONAL_MODULES[$arch]}
done

if [ -f "${target}/boot/i386-pc.img" ] ; then
  mv "${target}/boot/i386-pc.img" "${target}/boot/grub/grub.img"
fi

if [ -f "${target}/boot/x86_64-efi.img" ] ; then
  mv "${target}/boot/x86_64-efi.img" "${target}/${BOOTX64}"
fi

if [ -f "${target}/boot/i386-efi.img" ] ; then
  mv "${target}/boot/i386-efi.img" "${target}/${BOOTX32}"
fi

if ifclass AMD64 ; then
  if ! [ -r "${target}/${BOOTX64}" ] ; then
    echo "Can not access grub efi image ${BOOTX64}." >&2
    exit 1
  fi

  dd if=/dev/zero of="${target}/${EFI_IMG}" bs=4M count=1 2>/dev/null
  $ROOTCMD mkfs.vfat -n GRML "$EFI_IMG" >/dev/null
  $ROOTCMD mmd -i "$EFI_IMG" ::EFI
  $ROOTCMD mmd -i "$EFI_IMG" ::EFI/BOOT
  $ROOTCMD mcopy -i "$EFI_IMG" "$BOOTX64" ::EFI/BOOT/bootx64.efi >/dev/null
  echo "Generated 64-bit EFI image $BOOTX64"
elif ifclass I386 ; then
  if ! [ -r "${target}/${BOOTX32}" ] ; then
    echo "Can not access grub efi image ${BOOTX32}." >&2
    exit 1
  fi

  dd if=/dev/zero of="${target}/${EFI_IMG}" bs=4M count=1 2>/dev/null
  $ROOTCMD mkfs.vfat -n GRML "$EFI_IMG" >/dev/null
  $ROOTCMD mmd -i "$EFI_IMG" ::EFI
  $ROOTCMD mmd -i "$EFI_IMG" ::EFI/BOOT
  $ROOTCMD mcopy -i "$EFI_IMG" "$BOOTX32" ::EFI/BOOT/bootia32.efi >/dev/null
  echo "Generated 32-bit EFI image $BOOTX32"
fi

echo "Generated EFI image $EFI_IMG"

rm -f "${target}/${TMP_CONFIG}"
echo "Generated Grub images"

## END OF FILE #################################################################
# vim:ft=sh expandtab ai tw=80 tabstop=4 shiftwidth=2
