From 78b51059c3b2967f7ef9ef5a3cba3ba0601e783a Mon Sep 17 00:00:00 2001 From: robertmh Date: Sun, 13 Apr 2008 10:51:54 +0000 Subject: [PATCH] 2007-04-13 Fabian Greffrath * util/grub.d/30_os-prober.in: New script. Use `os-prober' and `linux-boot-prober' (if installed) to detect other operating systems which are installed on the computer and add them to the boot menu. * conf/common.rmk: Build and install 30_os-prober. --- ChangeLog | 8 ++++ DISTLIST | 1 + conf/common.mk | 6 +++ conf/common.rmk | 6 +++ util/grub.d/30_os-prober.in | 89 +++++++++++++++++++++++++++++++++++++ 5 files changed, 110 insertions(+) create mode 100644 util/grub.d/30_os-prober.in diff --git a/ChangeLog b/ChangeLog index e63a70bdd..88fcf7b86 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-04-13 Fabian Greffrath + + * util/grub.d/30_os-prober.in: New script. Use `os-prober' and + `linux-boot-prober' (if installed) to detect other operating + systems which are installed on the computer and add them to + the boot menu. + * conf/common.rmk: Build and install 30_os-prober. + 2008-04-12 Robert Millan * kern/powerpc/ieee1275/init.c: Move from here ... diff --git a/DISTLIST b/DISTLIST index 291174e2b..1afbca1f1 100644 --- a/DISTLIST +++ b/DISTLIST @@ -332,6 +332,7 @@ util/update-grub_lib.in util/grub.d/00_header.in util/grub.d/10_hurd.in util/grub.d/10_linux.in +util/grub.d/30_os-prober.in util/grub.d/README util/elf/grub-mkimage.c util/i386/efi/grub-install.in diff --git a/conf/common.mk b/conf/common.mk index a7fa89b83..75fb633ba 100644 --- a/conf/common.mk +++ b/conf/common.mk @@ -457,6 +457,12 @@ CLEANFILES += 10_linux update-grub_SCRIPTS += 10_hurd CLEANFILES += 10_hurd +30_os-prober: util/grub.d/30_os-prober.in config.status + ./config.status --file=$@:$< + chmod +x $@ +update-grub_SCRIPTS += 30_os-prober +CLEANFILES += 30_os-prober + update-grub_DATA += util/grub.d/README diff --git a/conf/common.rmk b/conf/common.rmk index 6e2d7aa3a..acbebc7b7 100644 --- a/conf/common.rmk +++ b/conf/common.rmk @@ -125,6 +125,12 @@ CLEANFILES += 10_linux update-grub_SCRIPTS += 10_hurd CLEANFILES += 10_hurd +30_os-prober: util/grub.d/30_os-prober.in config.status + ./config.status --file=$@:$< + chmod +x $@ +update-grub_SCRIPTS += 30_os-prober +CLEANFILES += 30_os-prober + update-grub_DATA += util/grub.d/README diff --git a/util/grub.d/30_os-prober.in b/util/grub.d/30_os-prober.in new file mode 100644 index 000000000..56686e7b9 --- /dev/null +++ b/util/grub.d/30_os-prober.in @@ -0,0 +1,89 @@ +#! /bin/sh -e + +# update-grub helper script. +# Copyright (C) 2006,2007,2008 Free Software Foundation, Inc. +# +# GRUB 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. +# +# GRUB 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 GRUB. If not, see . + +if [ -z "`which os-prober 2> /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then + # missing os-prober and/or linux-boot-prober + exit 0 +fi + +OSPROBED="`os-prober 2> /dev/null | tr ' ' '^' | paste -s -d ' '`" +if [ -z "${OSPROBED}" ] ; then + # empty os-prober output, nothing doing + exit 0 +fi + +for OS in ${OSPROBED} ; do + DEVICE="`echo ${OS} | cut -d ':' -f 1`" + LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`" + LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`" + BOOT="`echo ${OS} | cut -d ':' -f 4`" + + if [ -z "${LONGNAME}" ] ; then + LONGNAME="${LABEL}" + fi + + echo "Found ${LONGNAME} on ${DEVICE}" >&2 + + case ${BOOT} in + chain) + CHAINROOT="`grub-probe --target=drive --device ${DEVICE} 2> /dev/null`" + + cat << EOF +menuentry "${LONGNAME} (on ${DEVICE})" { + set root=${CHAINROOT} + chainloader +1 +} +EOF + ;; + linux) + LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`" + + for LINUX in ${LINUXPROBED} ; do + LROOT="`echo ${LINUX} | cut -d ':' -f 1`" + LBOOT="`echo ${LINUX} | cut -d ':' -f 2`" + LLABEL="`echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' '`" + LKERNEL="`echo ${LINUX} | cut -d ':' -f 4`" + LINITRD="`echo ${LINUX} | cut -d ':' -f 5`" + LPARAMS="`echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' '`" + + LINUXROOT="`grub-probe --target=drive --device ${LBOOT} 2> /dev/null`" + + if [ -z "${LLABEL}" ] ; then + LLABEL="${LONGNAME}" + fi + + cat << EOF +menuentry "${LLABEL} (on ${DEVICE})" { + set root=${LINUXROOT} + linux ${LKERNEL} ${LPARAMS} +EOF + if [ -n "${LINITRD}" ] ; then + cat << EOF + initrd ${LINITRD} +EOF + fi + cat << EOF +} +EOF + done + ;; + hurd|*) + echo " ${LONGNAME} is not yet supported by update-grub." >&2 + ;; + esac +done