+
+# helper function to get relevant /dev/disk/by-id/* entries,
+# based on GRUB's postinst script
+available_ids() {
+ local path ids
+
+ [ -d /dev/disk/by-id ] || return
+ ids="$(
+ for path in /dev/disk/by-id/*; do
+ [ -e "${path}" ] || continue
+ printf '%s %s\n' "${path}" "$(readlink -f "${path}")"
+ done | sort -k2 -s -u | cut -d' ' -f1
+ )"
+ echo "${ids}"
+}
+
+# helper function to report corresponding /dev/disk/by-id/ for a given device name,
+# based on GRUB's postinst script
+device_to_id() {
+ local id
+
+ for id in $(available_ids); do
+ if [ "$(readlink -f "${id}")" = "$(readlink -f "$1")" ]; then
+ echo "${id}"
+ return 0
+ fi
+ done
+
+ # Fall back to the plain device name if there's no by-id link for it.
+ if [ -e "$1" ]; then
+ echo "$1"
+ return 0
+ fi
+ return 1
+}
+
+grub_install() {
+
+ if [ -z "$GRUB" ] ; then
+ echo "Notice: \$GRUB not defined, will not install grub inside chroot at this stage."
+ return 0
+ fi
+
+ efi_setup || return 1
+
+ if [ -n "$EFI" ] ; then
+ GRUB_PACKAGE=grub-efi-amd64
+ else
+ GRUB_PACKAGE=grub-pc
+ fi
+
+ # make sure this is pre-defined so we have sane settings for automated
+ # upgrades, see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=711019
+ local grub_device
+ grub_device=$(device_to_id "${GRUB}")
+ if [ -z "${grub_device:-}" ] ; then
+ echo "Warning: Could not identify /dev/disk/by-id/... for '${GRUB}', falling back to '${GRUB}'"
+ grub_device="${GRUB}"
+ fi
+
+ echo "Setting ${GRUB_PACKAGE} debconf configuration for install device to $GRUB"
+ echo "${GRUB_PACKAGE} ${GRUB_PACKAGE}/install_devices multiselect ${grub_device}" | debconf-set-selections
+
+ if ! dpkg --list ${GRUB_PACKAGE} 2>/dev/null | grep -q '^ii' ; then
+ echo "Notice: grub option set but no ${GRUB_PACKAGE} package, installing it therefore."
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL ${GRUB_PACKAGE}
+ fi
+
+ if ! [ -x "$(command -v grub-install)" ] ; then
+ echo "Error: grub-install not available. (Error while installing grub package?)" >&2
+ return 1
+ fi
+ if ! [ -x "$(command -v update-grub)" ] ; then
+ echo "Error: update-grub not available. (Error while installing grub package?)" >&2
+ return 1
+ fi
+
+ if [ -n "$SELECTED_PARTITIONS" ] ; then # using sw-raid
+ for device in $SELECTED_PARTITIONS ; do
+ GRUB="${device%%[0-9]}"
+ echo "Installing grub on ${GRUB}:"
+ if ! grub-install --no-floppy "$GRUB" ; then
+ echo "Error: failed to execute 'grub-install --no-floppy $GRUB'." >&2
+ exit 1
+ fi
+
+ done
+ rm -f /boot/grub/device.map