#!/bin/sh

alterator_api_version=1

. alterator-sh-functions
. shell-config
. grub-raid-boot
. grub-disk
. grub-bootable
. grub-md-list

read_device()
{
    list_bootloader_places
    write_enum_item "none" "$(_ "Skip bootloader install")"
}

write_device()
{
    if [ "x$1" = "xnone" ]; then
     return 0
    fi

    # hack /dev/mapper/* once again (see installer for prev. hack)
    if [ -n "${DURING_INSTALL:-}" ]; then
        find /dev/mapper -name 'lvm*|*|*' | xargs rm -f
        for dev in $(find /dev/mapper -name 'lvm*_*_*'); do
                mv $dev $(echo $dev | sed -e 's/\(.*\)\(lvm.*\)_\(.*\)_\(.*\)/\1\3-\4/')
        done
        if [ -d /dev/evms/md ] && [ ! -d /dev/md ] ; then
    		ln -s /dev/evms/md /dev/md
        fi
    fi

    gruboutput=`mktemp` || (write_error "$(_ "Can't create tempfile ")$gruboutput!"; return 1) 
    if [ -z "$gruboutput" ]||[ ! -e "$gruboutput" ]; then
     write_error "$(_ "Can't create tempfile ")$gruboutput!"
     return 1
    fi
    bootdev="`readlink -e $1`"
    if [ -z "$bootdev" ]; then
     write_error "$(_ "No device for install given!")"
     return 1
    fi
    raid_members=$(grub_md_list "${bootdev#/dev/}" 2>/dev/null)
    [ -z "$raid_members" ] || bootdev=$raid_members
    tout=`mktemp`
    GRUB_FORCE="no"
    GRUB_DEV=
    for dev in $bootdev; do
     GRUB_DEV="$dev $GRUB_DEV"
     grub-install "$dev" >> $gruboutput 2>&1
     if [ $? -ne 0 ]; then
       if grep "using blocklists" $gruboutput; then
        GRUB_FORCE="yes"
        grub-install "$dev" --force >> $gruboutput 2>&1
        if [ $? -ne 0 ]; then
          write_error "$(_ "Can't install grub on ")$dev$(_ " even using blocklists :")`cat $gruboutput`"
          return 1
        fi
        GRUB_DEV_EVMS=`echo "$dev" | sed 's,^/dev/,/dev/evms/,'`
        if [ -b "$GRUB_DEV_EVMS" ]; then
         dd if=/dev/zero of="$GRUB_DEV_EVMS" bs=512 count=1 > /dev/null 2>&1
         dd if=/dev/zero of="$dev" bs=512 count=1 > /dev/null 2>&1
         while :; do
          grub-install "$dev" --force >> $gruboutput 2>&1
          dd if="$dev" of="$GRUB_DEV_EVMS" bs=512 count=1 > /dev/null 2>&1
          if [ x`detectloader.sh "$GRUB_DEV_EVMS"`="xgrub" ]; then
           break
          fi
         done
        fi
       else
        write_error "$(_ "Can't install grub on ")$dev :`cat $gruboutput`"
        return 1
       fi
     fi
     set_bootable_flag "$dev"
    done
    if ! grep "^GRUB_AUTOUPDATE_DEVICE=" /etc/sysconfig/grub2 > /dev/null 2>&1; then
     echo "GRUB_AUTOUPDATE_DEVICE='$GRUB_DEV'" >> /etc/sysconfig/grub2
    else
     sed -i "s|GRUB_AUTOUPDATE_DEVICE=.*|GRUB_AUTOUPDATE_DEVICE='$GRUB_DEV'|" /etc/sysconfig/grub2
    fi
    if ! grep "^GRUB_AUTOUPDATE_FORCE=" /etc/sysconfig/grub2 > /dev/null 2>&1; then
     echo "GRUB_AUTOUPDATE_FORCE='$GRUB_FORCE'" >> /etc/sysconfig/grub2
    else
     sed -i "s|GRUB_AUTOUPDATE_FORCE=.*|GRUB_AUTOUPDATE_FORCE='$GRUB_FORCE'|" /etc/sysconfig/grub2
    fi
    grub-mkconfig -o /boot/grub/grub.cfg > $gruboutput 2>&1
    if [ $? -ne 0 ]; then
      write_error "Can't create grub menu :`cat $gruboutput`"
      return 1
    fi
    return 0
}

on_message() {
  case "$in_action" in
    read)
	read_device
	;;
    write)
	write_device "$in_device" "$in_runhooks"
	;;
  esac
}

message_loop
