#!/bin/bash
#Used only by sysclone

# SI post-install script to configure the efi boot mgr or grub after SI has installed the OS
# SI post-install scripts run in a chroot environment of the final OS image

arch=`uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/`
if [ "$arch" =  "x86_64" ]; then
	if [ -d /sys/firmware/efi ]; then
		echo "Setting Boot Manager for the next boot."
		echo "delete all sysclone boot list"
		str_bootnums=`efibootmgr | grep 'syscloneLinux' | awk '{print $1}' | sed 's/boot//i' | sed 's/*//'`
		for str_num in $str_bootnums
		do
			efibootmgr -b $str_num -B -q
		done

		if [ -f "/boot/efi/EFI/redhat/grub.efi" ];then
			efibootmgr -c -l \\EFI\\redhat\\grub.efi -L syscloneLinux
                #support for redhat 7.0
                elif [ -f "/boot/efi/EFI/redhat/grubx64.efi" ];then
                        efibootmgr -c -l \\EFI\\redhat\\grubx64.efi -L syscloneLinux
                        
                        boot_root=`mount | grep -E ' on\s+/ type ' | awk '{print $1}'`
                        sed -i 's| root=\S*| root='$boot_root' net.ifnames=0|' /boot/efi/EFI/redhat/grub.cfg 
      
                        blkid -c /dev/null |grep UUID|while read str_line
                        do
                                partition=`echo "$str_line"|grep UUID|awk '{print $1}'|sed -e 's|/dev/\(.*\):|\1|g'`
                                #echo "partition=$partition"
  
                                if echo "$partition"|grep /; then
                                    continue
                                fi
 
                                newuuid=`blkid -c /dev/null|grep "$partition"|sed -e 's|.*UUID="\(.*\)" T.*|\1|g'`    
                                #echo "newuuid=$newuuid"
                                sed -i '/'$partition'/s|UUID=\S*|UUID='$newuuid'|' /etc/fstab
                        done
		elif [ -f "/boot/efi/efi/SuSE/elilo.efi" ];then
			efibootmgr -c -l \\efi\\SuSE\\elilo.efi -L syscloneLinux
		else
			echo "Can not find the boot loader."
			exit 1
		fi
	else
		echo "run grub-install to configure the MBR."
		if [ -e /etc/mtab ];then
			mv /etc/mtab /etc/mtab.bak
		fi
		grep -v rootfs /proc/mounts > /etc/mtab
		boot_device=''
		if [ -f "/etc/systemconfig/systemconfig.conf" ];then
			#boot_root=`cat /etc/systemconfig/systemconfig.conf | grep ROOTDEV | awk '{print $3}'`
			boot_root=`mount | grep -E ' on\s+/ type ' | awk '{print $1}'`
			boot_device=`cat /etc/systemconfig/systemconfig.conf | grep BOOTDEV | awk '{print $3}'`
		else
			boot_root=`mount | grep -E ' on\s+/ type ' | awk '{print $1}'`
			boot_device=`echo $boot_root | sed -e 's/[0-9]*$//'`

			#str_temp=`mount | awk '{print $1","$3}'`
			#for line in $str_temp
			#do
			#    mp=`echo $line | awk -F, '{print $2}'`
			#    if [ "$mp" = "/" ];then
			#        boot_device=`echo $line | awk -F, '{print $1}' | sed -e 's/[0-9]*$//'`
			#        break
			#    fi
			#done
		fi

		if [ -n "$boot_device" ];then
			echo "The boot device is $boot_device"
			echo "The boot root device is $boot_root"
		else
			echo "Can not find the boot device, return error"
			exit 1
		fi
		
		# set grub to use this boot device
		if grep -qe '^VERSION\s*=\s*11' /etc/SuSE-release; then
			#sles11, run grub-install.unsupported directly
			echo "grub-install.unsupported --no-floppy --recheck $boot_device"
			grub-install.unsupported --no-floppy --recheck $boot_device
			# note: the error about grub-set-default not existing is harmless, because we want the default to be 0 anyway
		else
			#for sles10, should run grub-install with parameters
			if [ -x /usr/sbin/grub2-install ]; then
				echo "grub2-install -s --recheck $boot_device"
				grub2-install -s --recheck $boot_device
			else
				echo "grub-install --no-floppy --recheck $boot_device"
				grub-install --no-floppy --recheck $boot_device
			fi
		fi

		# change the entries in the grub conf file to use the correct boot root device
		# (not the one leftover from the golden image)
		if [ -f "/boot/grub/grub.conf" ];then
			conffile="/boot/grub/grub.conf"
		else
			conffile="/boot/grub/menu.lst"
		fi
		sed -i 's| root=\S*| root='$boot_root'|' $conffile
		sed -i 's| resume=\S*| noresume|' $conffile

		if [ -e /etc/mtab.bak ];then
			mv -f /etc/mtab.bak /etc/mtab
		else
			rm -f /etc/mtab
		fi
	fi
elif [ "$arch" = "ppc64" ]; then
    echo "Choose suitale boot loader to configure the MBR."
    if [ -f "/usr/lib/yaboot/yaboot" ]; then
       # set bootloader
       echo "Using /usr/lib/yaboot/yaboot"
       echo "dd if=/usr/lib/yaboot/yaboot of=/dev/sda1 bs=4096"
       dd if=/usr/lib/yaboot/yaboot of=/dev/sda1 bs=4096
      
       # Set 0x41 as the partition type of the first partition
       # echo A | dd of=/dev/sda bs=1 count=1 seek=450
    elif [ -f "/lib/lilo/pmac/yaboot" ]; then
        # set bootloader
        echo "using /lib/lilo/pmac/yaboot"
        echo "dd if=/lib/lilo/pmac/yaboot of=/dev/sda1 bs=4096"
        dd if=/lib/lilo/pmac/yaboot of=/dev/sda1 bs=4096

       # Set 0x41 as the partition type of the first partition
       # echo A | dd of=/dev/sda bs=1 count=1 seek=450
    elif [ -f "/boot/grub2/grub" ];then
       echo "using /boot/grub2/grub"
       echo "dd if=/boot/grub2/grub of=/dev/sda1 bs=4096"
       dd if=/boot/grub2/grub of=/dev/sda1 bs=4096

       boot_root=`mount | grep -E ' on\s+/ type ' | awk '{print $1}'`
       sed -i 's| root=UUID=\S*| root='$boot_root' net.ifnames=0|' /boot/grub2/grub.cfg

       blkid -c /dev/null |grep UUID|while read str_line
       do
           partition=`echo "$str_line"|grep UUID|awk '{print $1}'|sed -e 's|/dev/\(.*\):|\1|g'`
           #echo "partition=$partition"

           if echo "$partition"|grep /; then
               continue
           fi

           newuuid=`blkid -c /dev/null|grep "$partition"|sed -e 's|.*UUID="\(.*\)" T.*|\1|g'`
           #echo "newuuid=$newuuid"
           sed -i '/'$partition'/s|UUID=\S*|UUID='$newuuid'|' /etc/fstab
       done
    else
       echo "Can not find boot loader"
    fi     
else
    echo "[ERROR]: unsupport arch....."
fi	
	
