#!/bin/bash
# Abort on errors
set -e

host_os=`uname -s | tr '[A-Z]' '[a-z]'`

abort() {
	message=$@

	echo >&2
	echo -e "$message" >&2
	echo >&2
	exit 1
}

find_pmon_dir ()
{
	echo  -n "Searching for PMON installation directory ... " >&2

	for d in $pmon_dirs ; do
		if [ -d "$d" ] ; then
			pmon_dir="$d"
			break
		fi
	done
	
	if [ -z "$pmon_dir" ] ; then
		abort "No PMON directory found.\n To create a template run 'mkdir /boot/pmon' first.\n To install pmon, install it manually or try the 'pmon-install' command.\n ### Warning, pmon-install is used to change your MBR. ###"
	else
		echo "found: $pmon_dir" >&2
	fi

	echo $pmon_dir
}

find_device ()
{
	mount_point=$1

	# Autodetect current root device
	device=
	if [ -f /etc/fstab ] ; then
		while read DEV MNT FOO; do
			if `echo "$DEV" | grep -q "^#"`; then
				continue
			fi
			if [ "$MNT" = "$mount_point" ]; then
				device="$DEV";
			fi
		done < /etc/fstab
	fi

	if [ -n "$device" ] ; then
		case "$device" in
			LABEL=* | UUID=*)
				device=`readlink -f "$(findfs $device)"`
			;;
			*)
				device=`readlink -f "$device"`
			;;
		esac
	fi

	echo $device
}

find_root_device ()
{
	device=$(find_device "/")

	if [ -z "$device" ]; then
		echo "Cannot determine root device.  Assuming /dev/hda1" >&2
		echo "This error is probably caused by an invalid /etc/fstab" >&2
		device=/dev/hda1
	fi

	echo $device
}

# Usage: convert_raid1 os_device
# Checks if os_device is a software raid1.
# If so, converts to first physical device in array.
convert_raid1 ()
{
    case $1 in
        /dev/md[0-9])
            : ;; # Continue
        *)
            return 1 ;;
    esac

    [ -x /sbin/mdadm ] || return 1

    # Check that the raid device is raid1
    raidlevel=$(mdadm -D -b $1 | grep "^ARRAY" | \
            sed "s/^.*level=//" | cut -d" " -f1)
    [ "$raidlevel" = "raid1" ] || return 1
    
    # Take only the first device that makes up the raid
    raiddev=$(mdadm -D $1 | grep -A1 "Number" | grep "dev" \
                          | sed "s/^.*\(\/dev\/.*\)$/\1/")
    [ -n "$raiddev" ] || return 1

    echo $raiddev
    return 0
}

# Usage: convert os_device
# Convert an OS device to the corresponding PMON drive.
# This part is OS-specific.
convert () {
    # First, check if the device file exists.
    if test -e "$1"; then
		:
    else
		echo "$1: Not found or not a block device." 1>&2
		exit 1
    fi

	host_os=`uname -s | tr '[[:upper:]]' '[[:lower:]]'`

    # Break the device name into the disk part and the partition part.
    case "$host_os" in
    linux)
		tmp_disk=`echo "$1" | sed -e 's%\([sh]d[[:lower:]]\)[0-9]*$%\1%' \
				  -e 's%\(fd[0-9]*\)$%\1%' \
				  -e 's%/part[0-9]*$%/disc%' \
				  -e 's%\(c[0-7]d[0-9]*\).*$%\1%'`
		tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[[:lower:]]\([0-9]*\)$%\1%' \
				  -e 's%.*/fd[0-9]*$%%' \
				  -e 's%.*/floppy/[0-9]*$%%' \
				  -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \
				  -e 's%.*c[0-7]d[0-9]*p*%%'`
	;;
    gnu)
		tmp_disk=`echo "$1" | sed 's%\([sh]d[0-9]*\).*%\1%'`
		tmp_part=`echo "$1" | sed "s%$tmp_disk%%"` ;;
    freebsd|*/kfreebsd)
		tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%\1%' \
			    | sed 's%r\{0,1\}\(da[0-9]*\).*$%\1%'`
		tmp_part=`echo "$1" \
	    		| sed "s%.*/r\{0,1\}[saw]d[0-9]\(s[0-9]*[a-h]\)%\1%" \
       	    	| sed "s%.*/r\{0,1\}da[0-9]\(s[0-9]*[a-h]\)%\1%"`
	;;
    netbsd|*/knetbsd)
		tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([sw]d[0-9]*\).*$%r\1d%' \
	    		| sed 's%r\{0,1\}\(fd[0-9]*\).*$%r\1a%'`
		tmp_part=`echo "$1" \
	    		| sed "s%.*/r\{0,1\}[sw]d[0-9]\([abe-p]\)%\1%"`
	;;
    *)
		echo "update-pmon does not support your OS yet." 1>&2
		exit 1 ;;
    esac

    # Get the drive name.
    tmp_drive=`grep -v '^#' $device_map | grep "$tmp_disk *$" \
			| sed 's%.*\(([hf]d[0-9][a-z0-9,]*)\).*%\1%'`

    # If not found, print an error message and exit.
    if test "x$tmp_drive" = x; then
		echo "$1 does not have any corresponding BIOS drive." 1>&2
		exit 1
    fi

    if test "x$tmp_part" != x; then
		# If a partition is specified, we need to translate it into the
		# PMON's syntax.
		case "$host_os" in
		linux)
	    	  echo "$tmp_drive" | sed "s%)$%,`expr $tmp_part - 1`)%" ;;
		gnu)
	    	  if echo $tmp_part | grep "^s" >/dev/null; then
				tmp_pc_slice=`echo $tmp_part \
		    		| sed "s%s\([0-9]*\)[a-z]*$%\1%"`
				tmp_drive=`echo "$tmp_drive" \
		    		| sed "s%)%,\`expr "$tmp_pc_slice" - 1\`)%"`
	    	  fi
	    	  if echo $tmp_part | grep "[a-z]$" >/dev/null; then
				tmp_bsd_partition=`echo "$tmp_part" \
		    		| sed "s%[^a-z]*\([a-z]\)$%\1%"`
				tmp_drive=`echo "$tmp_drive" \
		    		| sed "s%)%,$tmp_bsd_partition)%"`
	    	  fi
	    	  echo "$tmp_drive" ;;
		freebsd|*/kfreebsd)
	    	  if echo $tmp_part | grep "^s" >/dev/null; then
				tmp_pc_slice=`echo $tmp_part \
		    		| sed "s%s\([0-9]*\)[a-h]*$%\1%"`
				tmp_drive=`echo "$tmp_drive" \
		    		| sed "s%)%,\`expr "$tmp_pc_slice" - 1\`)%"`
	    	  fi
	    	  if echo $tmp_part | grep "[a-h]$" >/dev/null; then
				tmp_bsd_partition=`echo "$tmp_part" \
		    		| sed "s%s\{0,1\}[0-9]*\([a-h]\)$%\1%"`
				tmp_drive=`echo "$tmp_drive" \
		    		| sed "s%)%,$tmp_bsd_partition)%"`
	    	  fi
	    	  echo "$tmp_drive" ;;
		netbsd|*/knetbsd)
	    	  if echo $tmp_part | grep "^[abe-p]$" >/dev/null; then
				tmp_bsd_partition=`echo "$tmp_part" \
		    		| sed "s%\([a-p]\)$%\1%"`
				tmp_drive=`echo "$tmp_drive" \
		    		| sed "s%)%,$tmp_bsd_partition)%"`
	    	  fi
	    	  echo "$tmp_drive" ;;
		esac
    else
		# If no partition is specified, just print the drive name.
		echo "$tmp_drive"
    fi
}

# Usage: convert_default os_device
# Convert an OS device to the corresponding PMON drive.
# Calls OS-specific convert, and returns a default of
# (hd0,0) if anything goes wrong
convert_default () {
	# Check if device is software raid1 array
	if tmp_dev=$(convert_raid1 $1 2>/dev/null) ; then
		: # Use device returned by convert_raid1
	else
		tmp_dev=$1
	fi

	if tmp=$(convert $tmp_dev 2>/dev/null) ; then
		echo $tmp
	else
		echo "(hd0,0)"
	fi
}

## Configuration Options
# directory's to look for the pmon installation and the menu file
pmon_dirs="/boot/pmon /boot/boot/pmon /boot"

# The pmon installation directory
pmon_dir=$(find_pmon_dir)

# Full path to the menu.lst
#menu_file_basename=menu.lst
menu_file_basename=boot.cfg
menu_file=$pmon_dir/$menu_file_basename

# Full path to the default file
default_file_basename=default
default_file=$pmon_dir/$default_file_basename

# the device for the / filesystem
root_device=$(find_root_device)

# the device for the /boot filesystem
boot_device=$(find_device "/boot")

# Full path to the device.map
device_map=$pmon_dir/device.map

# Default kernel options, overidden by the kopt statement in the menufile.
kopt="root=$root_device ro video=radeonfb:1024x768 vga=791 splash quiet"

# Title
title="Debian GNU/`uname -s | sed -e s,GNU/,,g`"

# should update-pmon remember the default entry
updatedefaultentry="false"

# Drive(in PMON terms) where the kernel is located. Overridden by the
# kopt statement in menufile.
# if we don't have a device.map then we can't use the convert function.
if test -f "$device_map" ; then
	if test -z "$boot_device" ; then
		pmon_root_device=$(convert_default "$root_device")
	else
		pmon_root_device=$(convert_default "$boot_device")
	fi
else
	pmon_root_device="(wd0,0)"
fi

# additional options to use with the default boot option, but not with the
# alternatives
	defoptions=""

# stores the command line arguments
	command_line_arguments=$1

# Default options to use in a new config file. This will only be used if $menu_file
# doesn't already exist. Only edit the lines between the two "EOF"s. The others are
# part of the script.
newtemplate=$(tempfile)
cat > "$newtemplate" <<EOF
default		0

## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout		5

EOF
## End Configuration Options

echo -n "Searching for default file ... " >&2
if [ -f "$default_file" ] ; then
  echo "found: $default_file" >&2
else
  echo "Generating $default_file file and setting the default boot entry to 0" >&2
  pmon-set-default 0
fi

# Make sure we use the standard sorting order
LC_COLLATE=C
# Magic markers we use
start="### BEGIN AUTOMAGIC KERNELS LIST"
end="### END AUTOMAGIC KERNELS LIST"

startopt="## ## Start Default Options ##"
endopt="## ## End Default Options ##"

# Extract options from config file
ExtractMenuOpt()
{
	opt=$1

	sed -ne "/^$start\$/,/^$end\$/ {
		/^$startopt\$/,/^$endopt\$/ {
			/^# $opt=/ {
				s/^# $opt=\(.*\)\$/\1/
				p
			}
		}
	}" $menu
}

GetMenuOpts()
{
	opt=$1

	sed -ne "/^$start\$/,/^$end\$/ {
		/^$startopt\$/,/^$endopt\$/ {
			/^# $opt=/ {
				p
			}
		}
	}" $menu
}

ExtractMenuOpts()
{
	opt=$1

	GetMenuOpts $opt | sed "s/^# $opt=\(.*\)\$/\1=\"\2\"/"
}

GetMenuOpt()
{
	opt=$1
	value=$2

	[ -z "$(GetMenuOpts "$opt")" ] || value=$(ExtractMenuOpt "$opt")

	echo $value
}

# Compares two version strings A and B
# Returns -1 if A<B
#          0 if A==B
#          1 if A>B
# This compares version numbers of the form
# 2.4.14.2 > 2.4.14
# 2.4.14random = 2.4.14-random > 2.4.14-ac10 > 2.4.14 > 2.4.14-pre2 > 
# 2.4.14-pre1 > 2.4.13-ac99
CompareVersions()
{  
    	#Changes the line something-x.y.z into somthing-x.y.z.q
	#This is to ensure that kernels with a .q is treated as higher than the ones without               
        #First a space is put after the version number
        v1=$(echo $1 | sed -e 's!^\(.*-\([0-9]\+\.\)\{2,3\}[0-9]\+\)\(.*\)!\1 \3!g')
	v2=$(echo $2 | sed -e 's!^\(.*-\([0-9]\+\.\)\{2,3\}[0-9]\+\)\(.*\)!\1 \3!g')
	#If the version number only has 3 digits then put in another .0
        v1=$(echo $v1 | sed -e 's!^\(.*-\([0-9]\+\.\)\{2\}[0-9]\+\)\( .*\|$\)!\1.0 \3!g')
        v2=$(echo $v2 | sed -e 's!^\(.*-\([0-9]\+\.\)\{2\}[0-9]\+\)\( .*\|$\)!\1.0 \3!g')
          
	# Then split the version number and remove any '.' 's or dashes
	v1=$(echo $v1 | sed -e 's![-\.]\+! !g' -e 's!\([0-9]\)\([[:alpha:]]\)!\1 \2!')
	v2=$(echo $v2 | sed -e 's![-\.]\+! !g' -e 's!\([0-9]\)\([[:alpha:]]\)!\1 \2!')

	# we weight different kernel suffixes here
	# ac   = 50
	# pre  = -50
	# rc   = -40
	# test = -60
	# others are given 99
	v1=$(echo $v1 | sed -e 's! k7! 786 !g' -e 's! ac! 50 !g' -e 's! rc! -40 !g' -e 's! pre! -50 !g' -e 's! test! -60 !g' -e 's![^-0-9 ]\+!99!g')

	v2=$(echo $v2 | sed -e 's! k7! 786 !g' -e 's! ac! 50 !g' -e 's! rc! -40 !g' -e 's! pre! -50 !g' -e 's! test! -60 !g' -e 's![^-0-9 ]\+!99!g')

	result=0; v1finished=0; v2finished=0;
	while [ $result -eq 0 ] && [ $v1finished -eq 0 ] && [ $v2finished -eq 0 ];
	do
		if [ "$v1" = "" ]; then
			v1comp=0; v1finished=1
		else
			set -- $v1; v1comp=$1; shift; v1=$*
		fi

		if [ "$v2" = "" ]; then
			v2comp=0; v2finished=1
		else
			set -- $v2; v2comp=$1; shift; v2=$*
		fi
		
		set +e
		result=`expr $v1comp - $v2comp` 
		result=`expr substr $result 1 2`
		set -e

		if   [ $result -gt 0 ]; then result=1
		elif [ $result -lt 0 ]; then result=-1	
		fi	
	done

	# finally return the result
	echo $result
}

# looks in the directory specified for an initrd image with the version specified
FindInitrdName()
{
	# strip trailing slashes
	directory=$(echo $1 | sed -e 's#/*$##')
	version=$2

	# initrd
	# initrd.img
	# initrd-lvm
	# .*.gz

	initrdName=""
	names="initrd initrd.img initrd-lvm"
	compressed="gz"

	for n in $names ; do
		# make sure we haven't already found it
		if [ -z "$initrdName" ] ; then
			if [ -f "$directory/$n$version" ] ; then
				initrdName="$n$version"
				break
			else
				for c in $compressed ; do
					if [ -f "$directory/$n$version.$c" ] ; then
						initrdName="$n$version.$c"
						break
					fi
				done
			fi
		else
			break
		fi
	done

	# return the result
	echo $initrdName
}

FindXenHypervisorVersions ()
{
	version=$1

	if [ -f "/var/lib/linux-image-$version/xen-versions" ]; then
		ret="$(cat /var/lib/linux-image-$version/xen-versions)"
	fi

	echo $ret
}

get_kernel_opt()
{
	kernel_version=$1

	version=$(echo $kernel_version | sed 's/^[^0-9]*//')
	version=$(echo $version | sed 's/[-\+\.]/_/g')
	if [ -n "$version" ] ; then
		while [ -n "$version" ] ; do
			currentOpt="$(eval "echo \${kopt_$version}")"
			if [ -n "$currentOpt" ] ; then
				break
			fi
			version=$(echo $version | sed 's/_\?[^_]*$//')
		done
	fi

	if [ -z "$currentOpt" ] ; then
			currentOpt=$kopt
	fi

	echo $currentOpt
}

write_kernel_entry()
{
#	echo 'write_kernel_entry ...'

	local kernel_image; kernel_image=$1; shift
	local kernel_opt; kernel_opt=$1; shift
	local kernel_initrd; kernel_initrd=$1; shift
	local kernel_boot; kernel_boot=$1; shift

	if [ "x$boot_device" != "x" ]; then
			kernel_image=${kernel_image/\/boot/}
	fi

	kernel_boot_num=${kernel_boot##*[^0-9]}
	kernel_boot_num_wd=$(($kernel_boot_num - 1))

	case "$kernel_boot" in
		/dev/hda*|/dev/sda*)
		disk_no=0
		;;
		/dev/hdab*|/dev/sdb*)
		disk_no=1
		;;
	esac

	echo -ne "title\t\t" >> $buffer
	echo -n "$title" >> $buffer
	if [ "${kernel_image#*-}" != "$kernel_image" ]; then
		echo -n " (${kernel_image#*-})" >> $buffer
	fi
	echo >> $buffer
	echo -ne " kernel\t\t" >> $buffer
	case "$kernel_image" in
		/*)
		echo -n "(wd$disk_no,$kernel_boot_num_wd)$kernel_image" >> $buffer
		;;
		*)
		echo -n "(wd$disk_no,$kernel_boot_num_wd)/$kernel_image" >> $buffer
		;;
	esac
	echo >> $buffer
	echo -ne " args\t\t" >> $buffer
	echo -n "console=tty $kernel_opt" >> $buffer
	echo >> $buffer
	if [ -n "$kernel_initrd" ]; then
		echo -ne " initrd\t\t" >> $buffer
		case "$kernel_initrd" in
			/*)
			echo -n "(wd$disk_no,$kernel_boot_num_wd)$kernel_initrd" >> $buffer
			;;
			*)
			echo -n "(wd$disk_no,$kernel_boot_num_wd)/$kernel_initrd" >> $buffer
			;;
		esac
		echo >> $buffer
	fi
	echo >> $buffer
}


echo -n "Testing for an existing PMON $menu_file_basename file ... " >&2

# Test if our menu file exists
if [ -f "$menu_file" ] ; then
	menu="$menu_file"
	rm -f $newtemplate
	unset newtemplate
	echo "found: $menu_file" >&2
	cp -f "$menu_file" "$menu_file~"
else
	# if not ask user if they want us to create one
	menu="$menu_file"
	echo >&2
	echo >&2
	echo -n "Could not find $menu_file file. " >&2
	if [ "-y" = "$command_line_arguments" ] ; then
		echo >&2
		echo "Generating $menu_file" >&2
		answer=y
	else
		echo -n "Would you like $menu_file generated for you? " >&2
		echo -n "(y/N) " >&2
		if test -t 1
		then
			read answer
		else
			echo -ne "Y\n" >&2
			answer=y
		fi
	fi

	case "$answer" in
		y* | Y*)
		cat "$newtemplate" > $menu_file
		rm -f $newtemplate
		unset newtemplate
		;;
		*)
		echo  "Not creating $menu_file as you wish" || exit 1
		exit 0
		;;
	esac
fi

# Extract the kernel options to use
kopt=$(GetMenuOpt "kopt" "$kopt")

# Set the kernel 2.6 option only for fresh install
test -z "$(GetMenuOpt "kopt" "")" && kopt_2_6="root=$root_device ro"

# Extract options for specific kernels
opts="$(ExtractMenuOpts "\(kopt_[[:alnum:]_]\+\)")"
test -z "$opts" || eval "$opts"
CustomKopts=$(GetMenuOpts "\(kopt_[[:alnum:]_]\+\)")

# Extract the pmon root
pmon_root_device=$(GetMenuOpt "groot" "$pmon_root_device")

# Extract the additional default options
defoptions=$(GetMenuOpt "defoptions" "$defoptions")

# Extract the updatedefaultentry option
updatedefaultentry=$(GetMenuOpt "updatedefaultentry" "$updatedefaultentry")


# Generate the menu options we want to insert
buffer=$(tempfile)
echo $start >> $buffer
echo "## lines between the AUTOMAGIC KERNELS LIST markers will be modified" >> $buffer
echo "## by the update-pmon script except for the default options below" >> $buffer
echo >> $buffer
echo "## DO NOT UNCOMMENT THEM, Just edit them to your needs" >> $buffer
echo >> $buffer
echo "## ## Start Default Options ##" >> $buffer

echo "## default kernel options" >> $buffer
echo "## default kernel options for automagic boot options" >> $buffer
echo "## If you want special options for specific kernels use kopt_x_y_z" >> $buffer
echo "## where x.y.z is kernel version. Minor versions can be omitted." >> $buffer
echo "## e.g. kopt=root=/dev/hda1 ro" >> $buffer
echo "# kopt=$kopt" >> $buffer
echo >> $buffer

echo "## ## End Default Options ##" >> $buffer
echo >> $buffer

sortedKernels=""
for kern in $(/bin/ls -1vr /boot | grep -v "dpkg-*" | grep -e "^vmlinuz-" -e "vmlinux-") ; do
        kern="/boot/$kern"
	newerKernels=""
	for i in $sortedKernels ; do
	    res=$(CompareVersions "$kern" "$i")
	    if [ "$kern" != "" ] && [ "$res" -gt 0 ] ; then
		newerKernels="$newerKernels $kern $i"
	 	kern=""
	    else
		newerKernels="$newerKernels $i"
	    fi
	done
	if [ "$kern" != "" ] ; then
	    newerKernels="$newerKernels $kern"
	fi
	sortedKernels="$newerKernels"
done

if test -f "/boot/vmlinuz.old" ; then
	sortedKernels="/boot/vmlinuz.old $sortedKernels"
fi
if test -f "/boot/vmlinuz" ; then
	sortedKernels="/boot/vmlinuz $sortedKernels"
fi

hypervisors=""
for hyp in /boot/xen-*.gz; do
    if [ ! -h "$hyp" ] && [ -f "$hyp" ]; then
	hypervisors="$hypervisors `basename "$hyp"`"
    fi
done

# figure out where pmon looks for the kernels at boot time
kernel_dir=/boot
if [ -n "$boot_device" ] ; then
	kernel_dir=
fi

#Finding the value the default line
use_pmon_set_default="false"
if test "$updatedefaultentry" = "true" ; then
	defaultEntryNumber=$(sed -ne 's/^[[:blank:]]*default[[:blank:]]*\(.*\).*/\1/p' $menu)

	if [ "$defaultEntryNumber" = "saved" ] ; then
	    defaultEntryNumber=$(sed 'q' "$pmon_dir/default")
	    use_pmon_set_default="true"	   
	fi
	
	if test -n "$defaultEntryNumber"; then	
		defaultEntryNumberPlusOne=$(expr $defaultEntryNumber \+ 1);
		defaultEntry=$(grep "^[[:blank:]]*title" $menu | sed -ne "${defaultEntryNumberPlusOne}p" | sed -ne ";s/^[[:blank:]]*title[[:blank:]]*//p")
		defaultEntry=$(echo $defaultEntry | sed -e "s/[[:blank:]]*$//") # don't trust trailing blanks	
	else
		notChangeDefault="yes"
	fi
else
		notChangeDefault="yes"
fi

case "$host_os" in
  freebsd|*/kfreebsd)
    if test -e /boot/loader.gz ; then
      kernel=/boot/loader.gz
    else
      kernel=/boot/loader
    fi
    write_kernel_entry "" "" "" "$pmon_root_device" "$kernel" "" "" "" "true" ""
  ;;
esac

## heres where we start writing out the kernel entries
counter=0

for kern in $sortedKernels ; do
	counter=$(($counter + 1))
	kernelName=$(basename $kern)
	kernelVersion=$(echo $kernelName | sed -e 's/vmlinuz//' -e 's/vmlinux//')
	initrdName=$(FindInitrdName "/boot" "$kernelVersion")
	initrd=""

	kernel=$kernel_dir/$kernelName
	if [ -n "$initrdName" ] ; then
		initrd=$kernel_dir/$initrdName
	fi

	echo "Found kernel: $kernel" >&2

	if [ "$kernelName" = "vmlinuz" ]; then
		if [ -L "/boot/$kernelName" ]; then
			kernelVersion=`readlink -f "/boot/$kernelName"`
			kernelVersion=$(echo $kernelVersion | sed -e 's/.*vmlinuz-//')
			kernelVersion="$kernelVersion Default"
		else
			kernelVersion="Default"
		fi
	fi
	if [ "$kernelName" = "vmlinuz.old" ]; then
		if [ -L "/boot/$kernelName" ]; then
			kernelVersion=`readlink -f "/boot/$kernelName"`
			kernelVersion=$(echo $kernelVersion | sed -e 's/.*vmlinuz-//')
			kernelVersion="$kernelVersion Previous"
		else
			kernelVersion="Previous"
		fi
	fi
	kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
	
	currentOpt=$(get_kernel_opt $kernelVersion)

#	echo "--- kernelVersion: $kernelVersion"
#	echo "--- pmon_root_device: $pmon_root_device"
#	echo "--- kernel: $kernel"
#	echo "--- currentOpt: $currentOpt"
#	echo "--- defoptions: $defoptions"
#	echo "--- initrd: $initrd"
#	echo "--- do_lockold: $do_lockold"
#	echo ---- $boot_device -----
#	echo ---- $root_device -----
	if [ "x$boot_device" == "x" ]; then
			write_kernel_entry "$kernel" "$kopt" "$initrd" "$root_device"
	else
			write_kernel_entry "$kernel" "$kopt" "$initrd" "$boot_device"
	fi
done

pmon2name="/boot/pmon/core.img"
if test -f $pmon2name ; then
	echo "Found PMON 2: $pmon2name" >&2
	cat >> $buffer << EOF
title		Chainload into PMON 2
root		$pmon_root_device
kernel		$pmon2name

EOF
fi
    
echo $end >> $buffer

echo -n "Updating $menu ... " >&2
# Insert the new options into the menu
if ! grep -q "^$start" $menu ; then
    cat $buffer >> $menu
    rm -f $buffer
else
    umask 077
    sed -e "/^$start/,/^$end/{
	/^$start/r $buffer
	d
	}
	" $menu > $menu.new
    cat $menu.new > $menu
    rm -f $buffer $menu.new
fi

# Function to update the default value
set_default_value() {
    if [ "$use_pmon_set_default" = "true" ] ; then
	pmon-set-default $1
    else
	value="$1"
	newmenu=$(tempfile)
	sed -e "s/^[[:blank:]]*default[[:blank:]]*[[:digit:]]*\(.*\)/default         ${value}\1/;b" $menu > $newmenu
	cat $newmenu > $menu
	rm -f $newmenu
	unset newmenu
    fi
}

#Updating the default number
if test -z "$notChangeDefault"; then
	newDefaultNumberPlusOne=$(grep "^[[:blank:]]*title[[:blank:]]*" $menu | grep -n "${defaultEntry}" | cut -f1 -d ":" | sed -ne "1p")
	if test -z "$newDefaultNumberPlusOne"; then
		echo "Previous default entry removed, resetting to 0">&2
		set_default_value "0"
	elif test -z "$defaultEntry"; then
		echo "Value of default value matches no entry, resetting to 0" >&2
		set_default_value "0"
	else
		if test "$newDefaultNumberPlusOne" = "1"; then
			newDefaultNumber="0"
		else
			newDefaultNumber=$(expr $newDefaultNumberPlusOne - 1)
		fi
		echo "Updating the default booting kernel">&2
		set_default_value "$newDefaultNumber"
	fi
fi

echo "done" >&2
echo >&2
