0xV3NOMx
Linux ip-172-26-7-228 5.4.0-1103-aws #111~18.04.1-Ubuntu SMP Tue May 23 20:04:10 UTC 2023 x86_64



Your IP : 3.144.255.198


Current Path : /usr/sbin/
Upload File :
Current File : //usr/sbin/update-grub-legacy-ec2

#!/bin/bash
#
# Insert a list of installed kernels in a grub config file
#   Copyright 2001 Wichert Akkerman <wichert@linux.com>
#   Copyright 2007, 2008 Canonical Ltd.
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# Contributors:
#	Jason Thomas <jason@debian.org>
#	David B.Harris <dbarclay10@yahoo.ca>
#	Marc Haber <mh@zugschlus.de>
#	Crispin Flowerday <crispin@zeus.com>
#	Steve Langasek <steve.langasek@canonical.com>

# Abort on errors
set -e

# load debconf first, since this re-execs the script
. /usr/share/debconf/confmodule

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

abort() {
	message=$@

	echo >&2
	printf '%s\n' "$message" >&2
	echo >&2
	exit 1
}

find_grub_dir ()
{
	echo  -n "Searching for GRUB installation directory ... " >&2

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

	echo $grub_dir
}

find_device ()
{
	mount_point=$1

	# Autodetect current root device
	device=
	if [ -f /etc/fstab ] ; then
		device=$(awk '$1!~/^#/{
		  if ($2 ~ "^/+$") { $2 = "/"; } else { sub("/*$", "", $2); }
		  if ($2 == "'"$mount_point"'"){
				print $1;
			}
		  }' /etc/fstab | tail -n 1)
	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 GRUB 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-grub 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
		# GRUB'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 GRUB 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 "${grub_root_device_fallback}"
	fi
}

is_removable () {
	removabledevice="$(echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' -e 's%\(fd[0-9]*\)$%\1%' -e 's%/part[0-9]*$%/disc%' -e 's%\(c[0-7]d[0-9]*\).*$%\1%' -e 's%^/dev/%%g')"
        if [ -e "/sys/block/$removabledevice/removable" ]; then
                if [ "$(cat /sys/block/$removabledevice/removable)" != "0" ]; then
                        echo "/dev/$removabledevice"
                        return
                fi
        fi
	echo ""
}

convert_to_uuid()
{
	local dev; dev=$1

	convert=false
	case "$dev" in
		/dev/disk/*)
			;;
		/dev/mapper/*)
			;;
		/dev/evms/[hs]d[a-z][0-9]*)
			convert=:
			;;
		/dev/evms/*)
			;;
		/dev/md[0-9]*)
			;;
		/dev/*)
			convert=:
			;;
	esac
	if $convert; then
		if [ -b "$dev" ]; then
			uuid=$(blkid -o value -s UUID "$dev" || true)
		fi
	fi

	echo "$uuid"
}

convert_kopt_to_uuid()
{
	local kopt; kopt=$1

	convert=false
	root=$(echo "$kopt" | sed 's/.*root=//;s/ .*//')
	case "$root" in
		UUID=*|LABEL=*)
			;;
		/dev/disk/*)
			;;
		/dev/mapper/*)
			;;
		/dev/evms/[hs]d[a-z][0-9]*)
			convert=:
			;;
		/dev/evms/*)
			;;
		/dev/md[0-9]*)
			;;
		/dev/*)
			convert=:
			;;
	esac
	if $convert; then
		if [ -L "$DEV" ] && readlink "$DEV" | grep -q "^/dev/mapper/"
		then
			:
		elif [ -b "$root" ]; then
			uuid=$(blkid -o value -s UUID "$root" || true)
			if [ -n "$uuid" ]; then
				kopt=$(echo "$kopt" | sed "s/\(.*root=\)[^ ]*/\1UUID=$uuid/")
			fi
		fi
	fi

	echo "$kopt"
}


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

# The grub installation directory
grub_dir=$(find_grub_dir)

# Full path to the menu.lst
menu_file_basename=menu.lst
menu_file=$grub_dir/$menu_file_basename

# Full path to the menu.lst fragment used for ucf management
ucf_menu_file=/var/run/grub/$menu_file_basename

# Full path to the default file
default_file_basename=default
default_file=$grub_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=$grub_dir/device.map

# Default kernel options, overidden by the kopt statement in the menufile.
loop_file=""
if [ -f /etc/fstab ]; then
   loop_file=$(awk '$2=="/" && $4~"loop" {print $1}' /etc/fstab)
fi
if [ -n "$loop_file" ]; then
	dev_mountpoint=$(awk '"'${loop_file}'"~"^"$2 && $2!="/" {print $1";"$2}' /proc/mounts|tail -n 1)
	host_device="${dev_mountpoint%;*}"
	host_mountpoint="${dev_mountpoint#*;}"
fi
if [ -n "$host_device" ]; then
	boot_device=
	root_device="$host_device"
	default_kopt="root=$host_device loop=${loop_file#$host_mountpoint} ro"
else
	default_kopt="root=$root_device ro"
fi
default_kopt="$(convert_kopt_to_uuid "$default_kopt")"
kopt="$default_kopt"

# Title
title=$(lsb_release --short --description 2>/dev/null) || title="Ubuntu"

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

# Drive(in GRUB 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.

# Try to use a UUID instead of the GRUB device name.
if test -z "$boot_device" ; then
	uuid=$(convert_to_uuid "$root_device")
else
	uuid=$(convert_to_uuid "$boot_device")
fi

#if [ -n "$uuid" ]; then
#	grub_root_device="$uuid"
#fi
## The ec2 provide pv-grub do not support 'uuid' so we have to use a grub name
## when presented to grub, the root filesystem is on what grub sees
## as a bare disk (hd0), rather than what we see it as in user space (sda1).
grub_root_device_fallback="(hd0)"
grub_root_device="${grub_root_device_fallback}"

check_removable=""
if true; then
	if test -f "$device_map"; then
		if test -z "$boot_device" ; then
			grub_root_device=$(convert_default "$root_device")
			check_removable="$(is_removable "$root_device")"
		else
			grub_root_device=$(convert_default "$boot_device")
			check_removable="$(is_removable "$boot_device")"
		fi
	else
		grub_root_device="${grub_root_device_fallback}"
	fi
fi

# If the root/boot device is on a removable target, we need to override
# the grub_root_device to (hd0,X). This is a requirement since the BIOS
# will change device mapping dynamically if we switch boot device.

if test -n "$check_removable" ; then
	grub_root_device="$(echo "$grub_root_device" | sed -e 's/d.*,/d0,/g')"
fi

# should grub create the alternative boot options in the menu
	alternative="true"

# should grub lock the alternative boot options in the menu
	lockalternative="false"

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

# should grub lock the old kernels
	lockold="false"

# Xen hypervisor options to use with the default Xen boot option
	xenhopt=""

# Xen Linux kernel options to use with the default Xen boot option
	xenkopt="console=tty0"

# options to use with the alternative boot options
	altoptions="(recovery mode) single"

# controls howmany kernels are listed in the config file,
# this does not include the alternative kernels
	howmany="all"

# should grub create a memtest86 entry
	memtest86="true"

# should grub add "savedefault" to default boot options
	savedefault="false"

# is grub running in a domU?
	indomU="true"

# stores the command line arguments
	command_line_arguments=$1

# does this version of grub support the quiet option?
if [ -f ${grub_dir}/installed-version ] && dpkg --compare-versions `cat ${grub_dir}/installed-version` ge 0.97-11ubuntu4; then
    supports_quiet=true
else
    supports_quiet=false
fi

# read user configuration
if test -f "/etc/default/grub" ; then
    . /etc/default/grub
fi

# 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
# $menu_file_basename - See: grub(8), info grub, update-grub(8)
#            grub-install(8), grub-floppy(8),
#            grub-md5-crypt, /usr/share/doc/grub
#            and /usr/share/doc/grub-legacy-doc/.

## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
# WARNING: If you are using dmraid do not use 'savedefault' or your
# array will desync and will not let you boot your system.
default		0

## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
# on ec2, with no console access, there is no reason for a timeout.  set to 0.
timeout		0

## hiddenmenu
# Hides the menu by default (press ESC to see the menu)
hiddenmenu

# Pretty colours
#color cyan/blue white/blue

## password ['--md5'] passwd
# If used in the first section of a menu file, disable all interactive editing
# control (menu entry editor and command-line)  and entries protected by the
# command 'lock'
# e.g. password topsecret
#      password --md5 \$1\$gLhU0/\$aW78kHK1QfV3P2b2znUoe/
# password topsecret

#
# examples
#
# title		Windows 95/98/NT/2000
# root		(hd0,0)
# makeactive
# chainloader	+1
#
# title		Linux
# root		(hd0,1)
# kernel	/vmlinuz root=/dev/hda2 ro
#

#
# Put static boot stanzas before and/or after AUTOMAGIC KERNEL LIST

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
  grub-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 DEBIAN AUTOMAGIC KERNELS LIST"

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

# path to grub2
grub2name="/boot/grub/core.img"

# 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

			oldversion="$version"
			version=$(echo $version | sed 's/_\?[^_]*$//')
			if [ "$version" = "$oldversion" ] ; then
				# Break infinite loop, if the version isn't what we expect
				break
			fi
		done
	fi

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

	echo $currentOpt
}

write_kernel_entry()
{
	local kernel_version; kernel_version=$1; shift
	local recovery_desc; recovery_desc=$1; shift
	local lock_alternative; lock_alternative=$1; shift
	local grub_root_device; grub_root_device=$1; shift
	local kernel; kernel=$1; shift
	local kernel_options; kernel_options=$1; shift
	local recovery_suffix; recovery_suffix=$1; shift
	local initrd; initrd=$1; shift
	local savedefault; savedefault=$1; shift
	local lockold; lockold=$1; shift
	local dapper_upgrade; dapper_upgrade=$1; shift
	local hypervisor
	if [ -n "$1" ]; then
		# Hypervisor.
		hypervisor=$1; shift
		local hypervisor_image; hypervisor_image=$1; shift
		local hypervisor_version; hypervisor_version=$1; shift
		local hypervisor_options; hypervisor_options=$1; shift
	fi

	echo -n "title		" >> $buffer

	if [ -n "$hypervisor" ]; then
		echo -n "$hypervisor $hypervisor_version / " >> $buffer
	fi

	echo -n "$title" >> $buffer
	if [ -n "$kernel_version" ]; then
		echo -n ", " >> $buffer
		# memtest86 is not strictly a kernel
		if ! echo "$kernel_version" | grep -q ^memtest86; then
			echo -n "kernel " >> $buffer
		fi
		echo -n "$kernel_version" >> $buffer
	fi
	if [ -n "$recovery_desc" ]; then
		echo -n " $recovery_desc" >> $buffer
	fi
	echo >> $buffer

	# lock the alternative options
	if test x"$lock_alternative" = x"true" ; then
		echo "lock" >> $buffer
	fi
	# lock the old entries
	if test x"$lockold" = x"true" ; then
	echo "lock" >> $buffer
	fi

	case "$grub_root_device" in
		[^A-Za-z0-9]*)
			echo "root		$grub_root_device" >> $buffer
		;;
		*)
			echo "uuid		$grub_root_device" >> $buffer
		;;
	esac

	echo -n "kernel		"  >> $buffer
	if [ -n "$hypervisor" ]; then
		echo -n "$hypervisor_image" >> $buffer
		if [ -n "$hypervisor_options" ]; then
			echo -n " $hypervisor_options"  >> $buffer
		fi
		echo >> $buffer
		echo -n "module		"  >> $buffer
	fi
	echo -n "$kernel"  >> $buffer
	if [ -n "$kernel_options" ]; then
		echo -n " $kernel_options"  >> $buffer
	fi
	if [ -n "$recovery_desc" ]; then
		echo -n " $recovery_suffix"  >> $buffer
	fi
	if [ -n "$dapper_upgrade" -a -z "$kernel_options$recovery_desc" ]; then
		echo -n " "  >> $buffer
	fi
	echo >> $buffer

	if [ -n "$initrd" ]; then
		if [ -n "$hypervisor" ]; then
			echo -n "module		" >> $buffer
		else
			echo -n "initrd		" >> $buffer
		fi
		echo "$initrd" >> $buffer
	fi

	if [ ! -n "$recovery_desc" -a x"$supports_quiet" = x"true" -a -z "$dapper_upgrade" ]; then
		echo "quiet" >> $buffer
	fi

	if test x"$savedefault" = x"true" ; then
		echo "savedefault" >> $buffer
	fi
	if test x"$dapper_upgrade" != x ; then
		echo "boot" >> $buffer
	fi
	echo >> $buffer
}

## write out the kernel entries
output_kernel_list() {
	counter=0

	# Xen entries first.
	for kern in $xenKernels ; do
		if test ! x"$howmany" = x"all" ; then
			if [ $counter -gt $howmany ] ; then
				break
			fi
		fi

		kernelName=$(basename $kern)
		kernelVersion=$(echo $kernelName | sed -e 's/vmlinuz//')

		initrdName=$(FindInitrdName "/boot" "$kernelVersion")
		initrd=""

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

		kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
		currentOpt=$(get_kernel_opt $kernelVersion)

		hypervisorVersions=$(FindXenHypervisorVersions "$kernelVersion")

		found=
		for hypervisorVersion in $hypervisorVersions; do
			hypervisor="$kernel_dir/xen-$hypervisorVersion.gz"
			if [ -e "$hypervisor" ]; then
				found=1

				echo "Found Xen hypervisor $hypervisorVersion,  kernel: $kernel" >&2

				write_kernel_entry "$kernelVersion" '' '' "$grub_root_device" \
				  "$kernel" "$currentOpt $xenkopt" '' "$initrd" "$savedefault" '' "$dapper_upgrade" \
				  Xen "$hypervisor" "$hypervisorVersion" "$xenhopt"
		        counter=$(($counter + 1))
			fi
		done

		if [ -z $found ]; then
			for hypervisor in $hypervisors; do
				hypVersion=`basename "$hypervisor" .gz | sed s%xen-%%`
		
				echo "Found Xen hypervisor $hypVersion,  kernel: $kernel" >&2

				write_kernel_entry "$kernelVersion" '' '' "$grub_root_device" \
				  "$kernel" "$currentOpt $xenkopt" '' "$initrd" "$savedefault" '' "$dapper_upgrade" \
				  Xen "$kernel_dir/$hypervisor" "$hypVersion" "$xenhopt"
		        counter=$(($counter + 1))
			done
		fi
	done

	for kern in $sortedKernels ; do
		counter=$(($counter + 1))
		if test ! x"$howmany" = x"all" ; then
			if [ $counter -gt $howmany ] ; then 
				break
			fi
		fi
		kernelName=$(basename $kern)
		initrdName=""
		initrd=""
		extra_opts=""

		if [ "$kern" = "/boot/last-good-boot/vmlinuz" ]; then
			kernelVersion="Last successful boot"
			if [ -e "/boot/last-good-boot/initrd.img" ]; then
				initrdName="last-good-boot/initrd.img"
			fi
			kernelName="last-good-boot/vmlinuz"
			extra_opts="$extra_opts last-good-boot"
		else
			kernelVersion=$(echo $kernelName | sed -e 's/vmlinuz//')
			initrdName=$(FindInitrdName "/boot" "$kernelVersion")
			if [ -x "/usr/bin/makedumpfile" ] && [ -x "/sbin/kexec" ]; then
				extra_opts="$extra_opts crashkernel=384M-2G:64M,2G-:128M"
			fi
		fi

		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)

		do_lockold=$lockold
		# do not lockold for the first entry
		[ $counter -eq 1 ] && do_lockold=false

		if [ "$kernelName" = "last-good-boot/vmlinuz" ]; then
			if [ -e /boot/last-good-boot/cmdline ]; then
				cmdline="$(cat /boot/last-good-boot/cmdline) last-good-boot"
			else
				cmdline="$currentOpt $defoptions $extra_opts"
			fi
			write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" "$kernel" \
				"$cmdline" "" "$initrd" "$savedefault" "$do_lockold" \
				"$dapper_upgrade"
		else
			write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" "$kernel" \
				"$currentOpt $defoptions $extra_opts" "" "$initrd" "$savedefault" \
				"$do_lockold" "$dapper_upgrade"
		fi

		# insert the alternative boot options
		if test ! x"$alternative" = x"false" && \
		   test ! x"$kernelName" = x"last-good-boot/vmlinuz"; then
			# for each altoptions line do this stuff
			sed -ne 's/# altoptions=\(.*\)/\1/p' $buffer | while read line; do
				descr=$(echo $line | sed -ne 's/\(([^)]*)\)[[:space:]]\(.*\)/\1/p')
				suffix=$(echo $line | sed -ne 's/\(([^)]*)\)[[:space:]]\(.*\)/\2/p')

				test x"$lockalternative" = x"true" && do_lockold=false
				write_kernel_entry "$kernelVersion" "$descr" "$lockalternative" \
					"$grub_root_device" "$kernel" "$currentOpt $extra_opts" \
					"$suffix" "$initrd" "false" "$do_lockold" \
					"$dapper_upgrade"
			done
		fi
	done

## Adding the chainload stanza is simply confusing, and for
## legacy ec2 grub, it will never be used. LP: #627451
##
#	if test -f $grub2name ; then
#		echo "Found GRUB 2: $grub2name" >&2
#		cat >> $buffer << EOF
#title		Chainload into GRUB 2
#root		$grub_root_device
#kernel		$grub2name
#EOF
#		if test x"$savedefault" = x"true" ; then
#			echo "savedefault" >> $buffer
#		fi
#		echo >> $buffer
#	fi
    
	memtest86names="memtest86 memtest86+"

	if test ! x"$memtest86" = x"false" ; then
		for name in $memtest86names ; do
			if test -f "/boot/$name.bin" ; then
				kernelVersion="$name"
				kernel="$kernel_dir/$name.bin"
				currentOpt=
				initrd=

				echo "Found kernel: $kernel" >&2

				write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" \
				"$kernel" "$currentOpt" "" "$initrd" "false" "" "$dapper_upgrade"
			fi
		done
	fi

	echo $end >> $buffer
}

ucf_update_kernels() {
	local target; target="$1"
	local buffer; buffer="$2"

	sed -ni -e"/$endopt/,/$end/p" "$buffer"

	if [ "x$initialconfig" = "x" ]; then
		sed -n -e"/$endopt/,/$end/p" < $menu > $ucf_menu_file
	else
		cat $buffer > $ucf_menu_file
	fi

	db_x_loadtemplatefile "$(dpkg-query --control-path grub-legacy-ec2 templates)" grub

	ucf --debconf-ok \
		--debconf-template grub/update_grub_changeprompt_threeway \
		--three-way "$buffer" $ucf_menu_file
	rm "$buffer"

	# now re-merge the ucf results with the target file
	sed -i -e "/^$endopt/,/^$end/ {
		/^$endopt/r $ucf_menu_file
		d
	}
	" $target

	rm -f $ucf_menu_file ${ucf_menu_file}.ucf-old
}


echo -n "Testing for an existing GRUB $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
	initialconfig=1
	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
		read answer <&2
	fi

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

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

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

# Set the kernel 2.6 option only for fresh install (but convert it to
# mount-by-UUID on upgrade)
test -z "$kopt_2_6" && test -z "$(GetMenuOpt "kopt" "")" && \
	kopt_2_6="$default_kopt"

# Extract the grub root
grub_root_device=$(GetMenuOpt "groot" "$grub_root_device")
groot_cfg=$(GetMenuOpt groot "${grub_root_device_fallback}")
case "${groot_cfg}" in
	[^A-Za-z0-9]*) :;;
	*) 
		echo "uuid not supported. update 'groot' in ${menu_file}" >&2;
		abort "groot must be grub root device (ie '(hd0)'). not '${groot_cfg}'" >&2;
esac

# Extract the old recovery value
alternative=$(GetMenuOpt "recovery" "$alternative")

# Extract the alternative value
alternative=$(GetMenuOpt "alternative" "$alternative")

# Extract the lockalternative value
lockalternative=$(GetMenuOpt "lockalternative" "$lockalternative")

# Extract the additional default options
# Check nonaltoptions too for compatibility with Ubuntu <= 5.10
defoptions=$(GetMenuOpt "nonaltoptions" "$defoptions")
defoptions=$(GetMenuOpt "defoptions" "$defoptions")

# Extract the lockold value
lockold=$(GetMenuOpt "lockold" "$lockold")

# Extract Xen hypervisor options
xenhopt=$(GetMenuOpt "xenhopt" "$xenhopt")

# Extract Xen Linux kernel options
xenkopt=$(GetMenuOpt "xenkopt" "$xenkopt")

# Extract the howmany value
howmany=$(GetMenuOpt "howmany" "$howmany")

# Extract the memtest86 value
memtest86=$(GetMenuOpt "memtest86" "$memtest86")

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

# If "default saved" is in use, set the default to true
grep -q "^default.*saved" $menu && savedefault=true
# Extract the savedefault option
savedefault=$(GetMenuOpt "savedefault" "$savedefault")

# 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 debian update-grub 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_2_6_8=root=/dev/hdc1 ro" >> $buffer
echo "##      kopt_2_6_8_2_686=root=/dev/hdc2 ro" >> $buffer
echo "# kopt=$kopt" >> $buffer
if [ -n "$kopt_2_6" ] && [ "$kopt" != "$kopt_2_6" ]; then
    echo "# kopt_2_6=$kopt_2_6" >> $buffer
fi
if [ -n "$CustomKopts" ] ; then
    echo "$CustomKopts" >> $buffer
fi
echo >> $buffer

echo "## default grub root device" >> $buffer
echo "## e.g. groot=${grub_root_device_fallback}" >> $buffer
echo "# groot=$grub_root_device" >> $buffer
echo >> $buffer

echo "## should update-grub create alternative automagic boot options" >> $buffer
echo "## e.g. alternative=true" >> $buffer
echo "##      alternative=false" >> $buffer
echo "# alternative=$alternative" >> $buffer
echo >> $buffer

echo "## should update-grub lock alternative automagic boot options" >> $buffer
echo "## e.g. lockalternative=true" >> $buffer
echo "##      lockalternative=false" >> $buffer
echo "# lockalternative=$lockalternative" >> $buffer
echo >> $buffer

echo "## additional options to use with the default boot option, but not with the" >> $buffer
echo "## alternatives" >> $buffer
echo "## e.g. defoptions=vga=791 resume=/dev/hda5" >> $buffer
echo "# defoptions=$defoptions" >> $buffer
echo >> $buffer

echo "## should update-grub lock old automagic boot options" >> $buffer
echo "## e.g. lockold=false" >> $buffer
echo "##      lockold=true" >> $buffer
echo "# lockold=$lockold" >> $buffer
echo >> $buffer

echo "## Xen hypervisor options to use with the default Xen boot option" >> $buffer
echo "# xenhopt=$xenhopt" >> $buffer
echo >> $buffer

echo "## Xen Linux kernel options to use with the default Xen boot option" >> $buffer
echo "# xenkopt=$xenkopt" >> $buffer
echo >> $buffer

echo "## altoption boot targets option" >> $buffer
echo "## multiple altoptions lines are allowed" >> $buffer
echo "## e.g. altoptions=(extra menu suffix) extra boot options" >> $buffer
echo "##      altoptions=(recovery) single" >> $buffer

if ! grep -q "^# altoptions" $menu ; then
	echo "# altoptions=$altoptions" >> $buffer
else
	grep "^# altoptions" $menu >> $buffer
fi
echo >> $buffer

echo "## controls how many kernels should be put into the $menu_file_basename" >> $buffer
echo "## only counts the first occurence of a kernel, not the" >> $buffer
echo "## alternative kernel options" >> $buffer
echo "## e.g. howmany=all" >> $buffer
echo "##      howmany=7" >> $buffer
echo "# howmany=$howmany" >> $buffer
echo >> $buffer

echo "## specify if running in Xen domU or have grub detect automatically" >> $buffer
echo "## update-grub will ignore non-xen kernels when running in domU and vice versa" >> $buffer
echo "## e.g. indomU=detect" >> $buffer
echo "##      indomU=true" >> $buffer
echo "##      indomU=false" >> $buffer
echo "# indomU=$indomU" >> $buffer
echo >> $buffer

echo "## should update-grub create memtest86 boot option" >> $buffer
echo "## e.g. memtest86=true" >> $buffer
echo "##      memtest86=false" >> $buffer
echo "# memtest86=$memtest86" >> $buffer
echo >> $buffer

echo "## should update-grub adjust the value of the default booted system" >> $buffer
echo "## can be true or false" >> $buffer
echo "# updatedefaultentry=$updatedefaultentry" >> $buffer
echo >> $buffer

echo "## should update-grub add savedefault to the default options" >> $buffer
echo "## can be true or false" >> $buffer
echo "# savedefault=$savedefault" >> $buffer
echo >> $buffer

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

echo -n "Searching for splash image ... " >&2
current_splash=`grep '^splashimage=' ${menu_file} || true`
splash_root_device=""
splash_uuid=""
case "$grub_root_device" in
	[^A-Za-z0-9]*)
		splash_root_device=${grub_root_device}
	;;
	*)
		splash_uuid="uuid		$grub_root_device"
	;;
esac
splashimage_path="splashimage=${splash_root_device}${grub_dir##${boot_device:+/boot}}/splash.xpm.gz"
if [ `sed -e "/^$start/,/^$end/d" $menu_file | grep -c '^splashimage='` != "0" ] ; then
       #checks for splashscreen defined outside the autoupdated part
       splashimage=$(grep '^splashimage=' ${menu_file})
       echo "found: ${splashimage##*=}" >&2
       echo >&2  
elif [ -f "${grub_dir}/splash.xpm.gz" ]  && [ "$current_splash" = "" ]; then
       echo "found: /boot/grub/splash.xpm.gz" >&2
       echo "$splash_uuid" >> $buffer
       echo "$splashimage_path" >> $buffer
       echo >> $buffer
elif [ -f "${grub_dir}/splash.xpm.gz" ]  && [ "$current_splash" = "$splashimage_path" ]; then
       echo "found: /boot/grub/splash.xpm.gz" >&2
       echo "$splash_uuid" >> $buffer
       echo "$splashimage_path" >> $buffer
       echo >> $buffer
elif [ "$current_splash" != "" ] && [ "$current_splash" != "$splashimage_path" ]; then
       echo "found but preserving previous setting: $(grep '^splashimage=' ${menu_file})" >&2
       echo "$splash_uuid" >> $buffer
       echo "$current_splash" >> $buffer
       echo >> $buffer
else
       echo "none found, skipping ..." >&2
fi


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

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


# We need a static path to use for the ucf registration; since we're not
# using the full menu.lst file (maybe we should, just copying it around?
# C.f. discussion with Manoj), create a directory in a fixed location
# even though we're not treating the file in that location as
# persistent.
mkdir -p /var/run/grub

# The first time ucf sees the file, we can only assume any difference
# between the magic comments and the kernel options is a result of local
# mods, so this will result in a ucf prompt for anyone whose first
# invocation of update-grub is as a result of updating the magic comments.
if ! ucfq grub | grep -q $ucf_menu_file; then
	otherbuffer=$(tempfile)
	cat $buffer > $otherbuffer

	sortedKernels=`sed -n -e "
	/$endopt/,/$end/ {
		s/^kernel[[:space:]]\+\([^[:space:]]\+\).*/\1/p
	}" < $menu | grep -vE "memtest86|$grub2name|xen" | uniq`
	xenKernels=`sed -n -e "
	/$endopt/,/$end/ {
		s/^module[[:space:]]\+\([^[:space:]]*vmlinuz[^[:space:]]\+\).*/\1/p
	}" < $menu | uniq`

	savebuffer="$buffer"
	buffer="$otherbuffer"
	savetitle="$title"
	title="$(sed -n -e "/$endopt/,/$end/ {
		s/^title[[:space:]]\+\(.*\),.*/\1/p
	}" < $menu | head -n 1)"
	if [ -z "$title" ]; then
		title="$savetitle"
	fi

	# Hack: the kernel list output in Ubuntu 6.06 was different than
	# in the current version, so to support smooth upgrades we need to
	# properly detect a config generated by this old version of
	# update-grub and mimic it for the initial ucf registration
	dapper_upgrade=`sed -n -e "
	/$endopt/,/$end/ {
		/^boot/p
	}" < $menu`
	save_savedefault="$savedefault"
	if [ -n "$dapper_upgrade" ]; then
		savedefault=true
	fi

	output_kernel_list

	savedefault="$save_savedefault"
	dapper_upgrade=""
	buffer="$savebuffer"
	title="$savetitle"

	ucf_update_kernels "$menu" "$otherbuffer"

	# all done, now register it
	ucfr grub $ucf_menu_file
fi


if ! type is_xen_kernel >/dev/null 2>&1; then
  check_xen_config_for_kernel() {
    # input is like /boot/vmlinuz-2.6.35-13-virtual
    # expected config path is /boot/config-2.6.35-13-virtual
    local kernel="$1" config="" dir="" bname=""
    dir=${kernel%/*}
    [ "$dir" = "$kernel" ] && dir="."
    bname=${kernel##*/}
    config="$dir/config-${bname#*-}"
    [ -f "$config" ] || return 1
    grep -q CONFIG_XEN=y "$config"
  }

  is_xen_kernel() {
    # input is like /boot/vmlinuz-2.6.35-13-virtual
    # return whether or not this kernel is xen bootable.
    check_xen_config_for_kernel "$1" && return 0

    # get the version string out of it.
    local ver_flavor="";
    ver_flavor="${1##*vmlinuz-}"

    case "${ver_flavor}" in
       *-aws) return 0;;
       *-ec2) return 0;;
       *-virtual)
         # 10.04 LTS through 12.04 LTS -virtual is the EC2/Xen kernel
         dpkg --compare-versions ${ver_flavor%-virtual} gt 2.6.35-13 && return 0;;
       *-generic)
         # Starting with 12.10, -virtual was merged into -generic
         dpkg --compare-versions ${ver_flavor%-generic} ge 3.4.0-3 && return 0;;
    esac
    return 1;
  }
fi

for kern in /boot/vmlinuz-*; do
  case "$kern" in
    *.signed) continue;;
  esac
  is_xen_kernel "${kern}" &&
    xen_verlist="${xen_verlist} ${kern#/boot/vmlinuz-}"
done
xen_verlist=${xen_verlist# }

xenKernels=""
for ver in ${xen_verlist}; do
  # ver is a kernel version
  kern="/boot/vmlinuz-$ver"
  if [ -r $kern ] ; then
       newerKernels=""
       for i in $xenKernels ; 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
        xenKernels="$newerKernels"
    fi
done
xenKernels=" ${xenKernels} "

if [ "$indomU" = "detect" ]; then
    if [ -e /proc/xen/capabilities ] && ! grep -q "control_d" /proc/xen/capabilities; then
        indomU="true"
    else
        indomU="false"
    fi
fi

sortedKernels=""
for kern in $(/bin/ls -1vr /boot | grep -v "dpkg-*" | grep "^vmlinuz-") ; do
	if `echo "$xenKernels" | grep -q "$kern "` || `echo "$kern" | grep -q "xen"`; then
		is_xen=1
	else
		is_xen=
	fi

    if [ "$indomU" = "false" ] && [ "$is_xen" ]; then
        # We aren't running in a Xen domU, skip xen kernels
        echo "Ignoring Xen kernel on non-Xen host: $kern"
        continue
    elif [ "$indomU" = "true" ] && ! [ "$is_xen" ]; then
        # We are running in a Xen domU, skip non-xen kernels
        echo "Ignoring non-Xen Kernel on Xen domU host: $kern"
        continue
    fi
    
    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

# Add our last-good-boot kernel, second in list. We always add it, because
# it can appear out of nowhere.
newerKernels=""
last_good="/boot/last-good-boot/vmlinuz"
if [ -e "$last_good" ]; then
	for i in $sortedKernels ; do
		if [ "$last_good" != "" ]; then
			newerKernels="$i $last_good"
			last_good=""
		else
			newerKernels="$newerKernels $i"
		fi
	done
	# Shouldn't happen, unless someone removed all the kernels
	if [ "$last_good" != "" ]; then
		newerKernels="$newerKernels $last_good"
	fi
	sortedKernels="$newerKernels"
fi

#Finding the value the default line
use_grub_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' "$grub_dir/default")
	    use_grub_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

output_kernel_list

otherbuffer=$(tempfile)
cat $buffer > $otherbuffer

ucf_update_kernels "$buffer" "$otherbuffer"

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_grub_set_default" = "true" ] ; then
	grub-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