summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Plessy <plessy@debian.org>2012-08-26 16:05:09 +0900
committerCharles Plessy <plessy@debian.org>2012-08-26 16:12:36 +0900
commit8cd8da2d03822e0efd28569eed6b335ef06aa8e2 (patch)
treed9af2034dbe1df88207b368b88ac8a4654bbde73
Adapted from update-grub (0.97-66)
-rw-r--r--debian/README.Debian32
-rw-r--r--debian/changelog5
-rw-r--r--debian/compat1
-rw-r--r--debian/control20
-rw-r--r--debian/copyright26
-rw-r--r--debian/dirs1
-rw-r--r--debian/install3
-rw-r--r--debian/manpages1
-rwxr-xr-xdebian/rules6
-rw-r--r--kernel-hook/pv-grub-menu19
-rwxr-xr-xupdate-menu-lst1068
-rw-r--r--update-menu-lst.894
12 files changed, 1276 insertions, 0 deletions
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644
index 0000000..c7be3bb
--- /dev/null
+++ b/debian/README.Debian
@@ -0,0 +1,32 @@
+quick setup
+-----------
+
+ * update-menu-lst which will create a menu.lst for you if one does not exist
+ or manually create one, and skip to step 4
+
+ * edit /boot/grub/menu.lst
+ or if /boot is a separate partition
+ edit /boot/boot/grub/menu.lst
+
+ and change groot, and kopt to whatever settings you need.
+ modify anything else in the menu.lst you want,
+
+ re-run update-grub to update the lines for each kernel to those
+ that you specified with groot and kopt
+
+update-menu-lst
+---------------
+This script is a debian specific addon used to generate a menu.lst for you
+either intially, and/or automatically everytime you install a new kernel.
+
+To setup automatic updates add these lines to your /etc/kernel-img.conf:
+
+postinst_hook = update-grub
+postrm_hook = update-grub
+do_bootloader = no
+
+For further information see the manpage kernel-img.conf(5) or update-menu-lst(8)
+
+Unlike Lilo, it is not necessary to re-run or re-install the boot loader
+after every change to /boot/grub/menu.lst. menu.lst is automatically
+found on GRUB's root disk and read during GRUB's boot process.
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..7b160e4
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+pv-grub-menu (0.97-66) UNRELEASED; urgency=low
+
+ * Initial released prepared from update-grub (0.97-66) (Closes: #672104).
+
+ -- Charles Plessy <plessy@debian.org> Sun, 26 Aug 2012 14:43:06 +0900
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..ec63514
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..60006c0
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,20 @@
+Source: pv-grub-menu
+Section: admin
+Priority: optional
+Maintainer: Charles Plessy <plessy@debian.org>
+DM-Upload-Allowed: yes
+Build-Depends: debhelper (>= 9),
+Standards-Version: 3.9.3
+Vcs-Git: git://git.debian.org/collab-maint/pv-grub-menu
+
+Package: pv-grub-menu
+Architecture: all
+Depends: ${misc:Depends}
+Provides: grub-legacy-ec2
+# grub-legacy-ec2 is in Ubuntu.
+Conflicts: grub-legacy, grub-legacy-ec2
+Description: Creates a menu.lst file for PV-GRUB
+ PV-GRUB is a utility of the vitualisation platform Xen, to boot virtual
+ machines with their own kernel. This package maintains a configuration file in
+ /boot/grub/menu.lst, that is read by PV-GRUB. It does nothing else, which
+ means that it is not suitable for booting non-virtual systems.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..bb140fa
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,26 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+
+Files: debian/update-grub
+Copyright: 2001 Wichert Akkerman <wichert@linux.com>
+ 2007,2008 Free Software Foundation, Inc.
+License: GPL-3+
+ This program 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 3 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, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian GNU systems, the complete text of the GNU General Public
+ License version 3 can be found in `/usr/share/common-licenses/GPL-3'.
+Comment: Contributors:
+ Jason Thomas <jason@debian.org>
+ David B.Harris <dbarclay10@yahoo.ca>
+ Marc Haber <mh+debian-packages@zugschlus.de>
+ Crispin Flowerday <crispin@zeus.com>
diff --git a/debian/dirs b/debian/dirs
new file mode 100644
index 0000000..42fa466
--- /dev/null
+++ b/debian/dirs
@@ -0,0 +1 @@
+boot/grub
diff --git a/debian/install b/debian/install
new file mode 100644
index 0000000..fe2af24
--- /dev/null
+++ b/debian/install
@@ -0,0 +1,3 @@
+update-menu-lst usr/sbin
+kernel/pv-grub-menu etc/kernel/postinst.d
+kernel/pv-grub-menu etc/kernel/postrm.d
diff --git a/debian/manpages b/debian/manpages
new file mode 100644
index 0000000..83c0124
--- /dev/null
+++ b/debian/manpages
@@ -0,0 +1 @@
+update-menu-lst.8
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..f2244f7
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,6 @@
+#!/usr/bin/make -f
+
+export DH_VERBOSE=1
+
+%:
+ dh $@
diff --git a/kernel-hook/pv-grub-menu b/kernel-hook/pv-grub-menu
new file mode 100644
index 0000000..63bded4
--- /dev/null
+++ b/kernel-hook/pv-grub-menu
@@ -0,0 +1,19 @@
+#! /bin/sh
+set -e
+
+which update-menu-lst >/dev/null 2>&1 || exit 0
+
+set -- $DEB_MAINT_PARAMS
+mode="${1#\'}"
+mode="${mode%\'}"
+case $0:$mode in
+ # Only run on postinst configure and postrm remove, to avoid wasting
+ # time by calling update-menu-lst multiple times on upgrade and removal.
+ # Also run if we have no DEB_MAINT_PARAMS, in order to work with old
+ # kernel packages.
+ */postinst.d/*:|*/postinst.d/*:configure|*/postrm.d/*:|*/postrm.d/*:remove)
+ exec update-menu-lst
+ ;;
+esac
+
+exit 0
diff --git a/update-menu-lst b/update-menu-lst
new file mode 100755
index 0000000..ff0c60c
--- /dev/null
+++ b/update-menu-lst
@@ -0,0 +1,1068 @@
+#!/bin/bash
+#
+# Insert a list of installed kernels in a grub config file
+# Copyright 2001 Wichert Akkerman <wichert@linux.com>
+# Copyright (C) 2007,2008 Free Software Foundation, Inc.
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+# Contributors:
+# Jason Thomas <jason@debian.org>
+# David B.Harris <dbarclay10@yahoo.ca>
+# Marc Haber <mh+debian-packages@zugschlus.de>
+# Crispin Flowerday <crispin@zeus.com>
+
+# 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_grub_dir ()
+{
+ echo -n "Searching for GRUB installation directory ... " >&2
+
+ for d in /boot/grub /boot/boot/grub ; do
+ if [ -d "$d" ] ; then
+ grub_dir="$d"
+ break
+ fi
+ done
+
+ if [ -z "$grub_dir" ] ; then
+ abort "No GRUB directory found.\n To create a template run 'mkdir /boot/grub' first."
+ else
+ echo "found: $grub_dir" >&2
+ fi
+
+ echo $grub_dir
+}
+
+# This function was borrowed from grub2/util/update-grub_lib.in
+make_system_path_relative_to_its_root ()
+{
+ path=$1
+ # abort if file doesn't exist
+ if test -e $path ; then : ;else
+ return 1
+ fi
+
+ # canonicalize
+ if path=`readlink -f $path` ; then : ; else
+ return 1
+ fi
+
+ # if not a directory, climb up to the directory containing it
+ if test -d $path ; then
+ dir=$path
+ else
+ dir=`echo $path | sed -e "s,/[^/]*$,,g"`
+ fi
+
+ num=`stat -c %d $dir`
+
+ # this loop sets $dir to the root directory of the filesystem we're inspecting
+ while : ; do
+ parent=`readlink -f $dir/..`
+ if [ "x`stat -c %d $parent`" = "x$num" ] ; then : ; else
+ # $parent is another filesystem; we found it.
+ break
+ fi
+ if [ "x$dir" = "x/" ] ; then
+ # / is our root.
+ break
+ fi
+ dir=$parent
+ done
+
+ # This function never prints trailing slashes (so that its output can be
+ # appended a slash unconditionally). Each slash in $dir is considered a
+ # preceding slash, and therefore the root directory is an empty string.
+ if [ "$dir" = "/" ] ; then
+ dir=""
+ fi
+
+ echo $path | sed -e "s,^$dir,,g"
+}
+
+# The grub installation directory
+grub_dir=$(find_grub_dir)
+
+# Full path to the device.map
+device_map=$grub_dir/device.map
+
+find_device ()
+{
+ if ! test -e ${device_map} ; then
+ echo quit | grub --batch --no-floppy --device-map=${device_map} > /dev/null
+ fi
+ grub-probe --device-map=${device_map} -t device $1 2> /dev/null
+}
+
+# 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] | /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.
+convert () {
+ if ! test -e ${device_map} ; then
+ echo quit | grub --batch --no-floppy --device-map=${device_map} > /dev/null
+ fi
+ GRUB_LEGACY_0_BASED_PARTITIONS=1 grub-probe --device-map=${device_map} -t drive -d "$1" 2> /dev/null || {
+ echo "warning: grub-probe can't find drive for $1." >&2
+ tmp_map=$(mktemp -t device.map.XXXXXXXX)
+ grub-mkdevicemap --device-map=${tmp_map} --no-floppy >/dev/null 2>&1 || true
+ GRUB_LEGACY_0_BASED_PARTITIONS=1 grub-probe --device-map=${tmp_map} -t drive -d "$1" || {
+ rm -f ${tmp_map}
+ return 1
+ }
+ echo "Please check ${device_map}, you might have to regenerate it with grub-mkdevicemap." >&2
+ rm -f ${tmp_map}
+ }
+}
+
+# Usage: convert_default os_device
+# Convert an OS device to the corresponding GRUB drive.
+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
+
+ convert $tmp_dev
+}
+
+## Configuration Options
+
+# Full path to the menu.lst
+menu_file_basename=menu.lst
+menu_file=$grub_dir/$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_device "/")
+
+# loop-AES arranges things so that /dev/loop/X can be our root device, but
+# the initrds that Linux uses don't like that.
+case ${root_device} in
+ /dev/loop/*|/dev/loop[0-9])
+ root_device=`losetup ${root_device} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
+ ;;
+esac
+
+# the device for the /boot filesystem
+boot_device=$(find_device "/boot")
+
+# where grub looks for the kernels at boot time
+kernel_dir=`make_system_path_relative_to_its_root /boot`
+
+# the "-t abstraction" check is a workaround untill #484297 is fixed
+if abstraction=`grub-probe -t abstraction --device ${root_device} 2> /dev/null` && [ "$abstraction" = "" ] && \
+ root_uuid=`grub-probe --device-map=${device_map} --device ${root_device} --target=fs_uuid 2> /dev/null` && \
+ test -e "/dev/disk/by-uuid/${root_uuid}" ; then
+ linux_root_device=UUID=${root_uuid}
+else
+ linux_root_device=${root_device}
+fi
+
+# Default kernel options, overidden by the kopt statement in the menufile.
+kopt="root=$linux_root_device ro"
+
+# Title
+title="Debian GNU/`uname -s | sed -e s,GNU/,,g`"
+
+# should update-grub remember the default entry
+updatedefaultentry="false"
+
+# Drive(in GRUB terms) where the kernel is located. Overridden by the
+# groot statement in menufile.
+grub_root_device=$(convert_default "$boot_device")
+
+# 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=""
+
+# 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="(single-user 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"
+
+# stores the command line arguments
+ command_line_arguments=$1
+
+# 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 change this entry to 'saved' 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).
+timeout 5
+
+# 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
+ if [ -f /usr/lib/grub-legacy/grub-set-default ] ; then
+ /usr/lib/grub-legacy/grub-set-default $1
+ else
+ grub-set-default $1
+ fi
+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 ##"
+
+# 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()
+{
+ local sedexp="s,.*/vmlinu[zx]-,,g;s/[._-]\(pre\|rc\|test\|git\|trunk\)/~\1/g"
+ local a=`echo $1 | sed -e "$sedexp"`
+ local b=`echo $2 | sed -e "$sedexp"`
+ if [ "$a" = "$b" ] ; then
+ echo 0
+ elif dpkg --compare-versions "$a" gt "$b" ; then
+ echo 1
+ else
+ echo -1
+ fi
+}
+
+# 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()
+{
+ 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 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 ", kernel $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
+
+ echo "root $grub_root_device" >> $buffer
+
+ 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
+ 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 test x"$savedefault" = x"true" ; then
+ echo "savedefault" >> $buffer
+ fi
+ echo >> $buffer
+}
+
+
+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
+ menu="$menu_file"
+ echo >&2
+ echo >&2
+ if [ "-y" = "$command_line_arguments" ] ; then
+ echo "Warning: ignoring deprecated -y option." >&2
+ fi
+ echo >&2
+ echo "Generating $menu_file" >&2
+ cat "$newtemplate" > $menu_file
+ rm -f $newtemplate
+ unset newtemplate
+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=$linux_root_device ro"
+
+# Extract options for specific kernels
+opts="$(ExtractMenuOpts "\(kopt_[[:alnum:]_]\+\)")"
+test -z "$opts" || eval "$opts"
+CustomKopts=$(GetMenuOpts "\(kopt_[[:alnum:]_]\+\)")
+
+# Extract the grub root
+grub_root_device=$(GetMenuOpt "groot" "$grub_root_device")
+
+# 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
+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 updatedefaultentry option
+updatedefaultentry=$(GetMenuOpt "updatedefaultentry" "$updatedefaultentry")
+
+# 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 "$CustomKopts" ] ; then
+ echo "$CustomKopts" >> $buffer
+elif [ -n "$kopt_2_6" ] && [ "$kopt" != "$kopt_2_6" ]; then
+ echo "# kopt_2_6=$kopt_2_6" >> $buffer
+fi
+echo >> $buffer
+
+echo "## default grub root device" >> $buffer
+echo "## e.g. groot=(hd0,0)" >> $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=(single-user) 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 "## 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`
+grub_dir_rel=`make_system_path_relative_to_its_root $grub_dir`
+splashimage_path="splashimage=${grub_root_device}/${grub_dir_rel##${kernel_dir}}/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 "$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 "$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 "$current_splash" >> $buffer
+ echo >> $buffer
+else
+ echo "none found, skipping ..." >&2
+fi
+
+xen0Kernels=""
+# First kernels with xen0 support.
+for ver in `grep -l CONFIG_XEN=y /boot/config* | sed -e s%/boot/config-%%`; do
+ if ! grep -q CONFIG_XEN_PRIVILEGED_GUEST=y /boot/config-$ver ; then
+ continue
+ fi
+ # ver is a kernel version
+ kern="/boot/vmlinuz-$ver"
+ if [ -r $kern ] ; then
+ newerKernels=""
+ for i in $xen0Kernels ; 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
+ xen0Kernels="$newerKernels"
+ fi
+done
+
+sortedKernels=""
+for kern in $(/bin/ls -1vr /boot | grep -v "dpkg-*" | grep "^vmlinuz-") ; 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
+
+#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
+
+## heres where we start writing out the kernel entries
+counter=0
+
+grub2name="${kernel_dir}/grub/core.img"
+if [ "$LET_US_TRY_GRUB_2" = "true" ] \
+ && test -f /boot/grub/core.img ; then
+ echo "Found GRUB 2: $grub2name" >&2
+ cat >> $buffer << EOF
+title Chainload into GRUB 2
+root $grub_root_device
+kernel $grub2name
+
+title `echo ───────────────────────────────────────────────────────────────────── | iconv -f utf-8 -t cp437`
+root
+
+title When you have verified GRUB 2 works, you can use this command to
+root
+
+title complete the upgrade: upgrade-from-grub-legacy
+root
+
+title `echo ───────────────────────────────────────────────────────────────────── | iconv -f utf-8 -t cp437`
+root
+
+EOF
+fi
+
+
+# Xen entries first.
+for kern in $xen0Kernels ; 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" '' \
+ 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" '' \
+ 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)
+ 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
+
+ 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
+
+ write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" "$kernel" \
+ "$currentOpt $defoptions" "" "$initrd" "$savedefault" "$do_lockold"
+
+ # insert the alternative boot options
+ if test ! x"$alternative" = x"false" ; 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" "$suffix" "$initrd" \
+ "$savedefault" "$do_lockold"
+
+ done
+ fi
+done
+
+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" ""
+ fi
+ done
+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_grub_set_default" = "true" ] ; then
+ if [ -f /usr/lib/grub-legacy/grub-set-default ] ; then
+ /usr/lib/grub-legacy/grub-set-default $1
+ else
+ grub-set-default $1
+ fi
+ 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 [ "$LET_US_TRY_GRUB_2" = "true" ] && test -f /boot/grub/core.img ; then
+ set_default_value "0"
+elif 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
diff --git a/update-menu-lst.8 b/update-menu-lst.8
new file mode 100644
index 0000000..ad0efba
--- /dev/null
+++ b/update-menu-lst.8
@@ -0,0 +1,94 @@
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh disable hyphenation
+.\" .hy enable hyphenation
+.\" .ad l left justify
+.\" .ad b justify to both left and right margins
+.\" .nf disable filling
+.\" .fi enable filling
+.\" .br insert line break
+.\" .sp <n> insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.TH "update\-menu\-lst" "8" "August 26, 2012" "Charles Plessy"
+.SH "NAME"
+update\-menu\-lst \- program to generate PV-GRUB's menu.lst file
+.SH "SYNOPSIS"
+.B update\-menu\-lst
+.SH "DESCRIPTION"
+.B \fBupdate\-menu\-lst\fR
+is a program used to generate the \fImenu.lst\fR file used by the PV-GRUB bootloader.
+It works by looking in \fI/boot\fR for all files which start with "\fIvmlinuz\-\fR". They will be treated as kernels, and grub menu entries will be created for each. It will also create the initial \fImenu.lst\fR if none exists, after prompting the user.
+It will also add initrd lines for ramdisk images found with the same version as kernels found. e.g. /boot/vmlinuz-2.4.5 and /boot/initrd-2.4.5 will cause a line of "initrd=/boot/initrd-2.4.5 or similar to be added for the kernel entry in the menu.lst.
+
+After \fBupdate\-menu\-lst\fR has been run for the first time, the user is required to edit the generated \fBmenu.lst\fR. The user must set the two options \fBupdate\-menu\-lst\fR uses. Then re\-run the \fBupdate\-menu\-lst\fR script to update the \fImenu.lst\fR file using the default's that have been set.
+
+These are the options passed to the linux kernel:
+.br
+# kopt=root=/dev/hda1 ro
+.br
+Everything after "kopt=" is passed to the kernel as parameters. See bootparam(7) for more information.
+
+This is the grub device from which grub loads the kernel:
+.br
+# groot=(hd0,1)
+.br
+(hd0,1) is a partition in grub notation. See grub(8) for more information.
+
+This option controls if grub should create the alternative boot options in the menu entries
+.br
+# alternative=true
+.br
+# alternative=false
+
+This option controls if grub should lock the alternative boot options see grub(8) for more information.
+.br
+# lockalternative=true
+.br
+# lockalternative=false
+
+This option controls if grub should lock the old kernels.
+.br
+# lockold=true
+.br
+# lockold=false
+
+This options controls what is used for the alternative boot options, multiple altoptions lines are allowed.
+.br
+# altoptions=(some description) some kernel command line options
+.br
+# altoptions=(recovery option) single
+.br
+The description is placed in '()' and the kernel command line options follow that.
+.br
+# updatedefault=true
+.br
+# updatedefault=false
+
+This option controls if grub should update the default entry to keep
+booting the same kernel even if a new one is installed.
+
+
+The \fBupdate\-menu\-lst\fR script can be ran automagically from the \fI/etc/kernel\-img.conf\fR file by adding the following lines:
+
+postinst_hook = update\-menu\-lst
+.br
+postrm_hook = update\-menu\-lst
+.br
+do_bootloader = no
+
+For further information related to \fI/etc/kernel\-img.conf\fR, see the manpage kernel\-img.conf(5).
+.SH "SEE ALSO"
+.BR kernel\-img.conf (5)
+(contained in the
+.B kernel-package
+package).
+.PP
+.SH "AUTHOR"
+\fBupdate\-menu\-lst\fR was derived from \fBupdate\-grub\fR version 0.97-66
+by Charles Plessy <plessy@debian.org>.
+.
+This manual page was derived by Charles Plessy <plessy@debian.org> from
+the manual page of update\-grub, written by Jason Thomas <jason@debian.org>,
+for the Debian GNU/Linux system (but may be used by others).
+.\" vim:syn=nroff