#! /bin/sh -e

# Generate grub.cfg by inspecting /boot contents.
# Copyright (C) 2006, 2007 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 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., 51 Franklin St - Suite 330, Boston, MA 02110, USA.

transform="s,x,x,"

prefix=/usr
exec_prefix=${prefix}
sbindir=${exec_prefix}/sbin
libdir=${exec_prefix}/lib
sysconfdir=/etc
grub_prefix=`echo /boot/grub | sed ${transform}`
grub_cfg=${grub_prefix}/grub.cfg
update_grub_dir=${sysconfdir}/grub.d

grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed ${transform}`
grub_probe=${sbindir}/`echo grub-probe | sed ${transform}`

# for convert_system_path_to_grub_path()
. ${libdir}/grub/update-grub_lib

if [ "x$UID" = "x" ] ; then
  UID=`id -u`
fi

if [ "$UID" != 0 ] ; then
  echo "$0: You must run this as root" >&2
  exit 1
fi

if [ "$1" = "-y" ] ; then
  echo "$0: warning: Ignoring -y option (no longer needed)." >&2
fi

set $grub_mkdevicemap dummy
if test -f "$1"; then
    :
else
    echo "$1: Not found." 1>&2
    exit 1
fi

set $grub_probe dummy
if test -f "$1"; then
    :
else
    echo "$1: Not found." 1>&2
    exit 1
fi

mkdir -p ${grub_prefix}

if test -e ${grub_prefix}/device.map ; then : ; else
  grub-mkdevicemap
fi

# Device containing our userland.  Typicaly used for root= parameter.
GRUB_DEVICE="`grub-probe --target=device /`"

# Filesystem for the device containing our userland.  Used for stuff like
# choosing Hurd filesystem module.
GRUB_FS="`grub-probe --target=fs /`"

# GRUB path to /
GRUB_DRIVE="`grub-probe --target=drive /`"

# GRUB path to /boot
GRUB_DRIVE_BOOT="`convert_system_path_to_grub_path /boot`"

# GRUB path to /boot/grub
GRUB_DRIVE_BOOT_GRUB="`convert_system_path_to_grub_path /boot/grub`"

if test -f ${sysconfdir}/default/grub ; then
  . ${sysconfdir}/default/grub
fi

# These are defined in this script, export them here so that user can
# override them.
export GRUB_DEVICE GRUB_FS GRUB_DRIVE GRUB_DRIVE_BOOT GRUB_DRIVE_BOOT_GRUB

# These are optional, user-defined variables.
export GRUB_DEFAULT GRUB_TIMEOUT GRUB_DISTRIBUTOR GRUB_CMDLINE_LINUX

exec > ${grub_cfg}.new
chmod 444 ${grub_cfg}.new

echo "Updating ${grub_cfg} ..." >&2

cat << EOF
#
# DO NOT EDIT THIS FILE
#
# It is automaticaly generated by $0 using templates from ${update_grub_dir}
# and settings from ${sysconfdir}/default/grub
#
EOF

for i in ${update_grub_dir}/* ; do
  case $i in
    # emacsen backup files. FIXME: support other editors
    *~) ;;
    *)
      if test -x $i ; then
        echo
        echo "### BEGIN $i ###"
        $i
        echo "### END $i ###"
      fi
    ;;
  esac
done

# none of the children aborted with error, install the new grub.cfg
mv ${grub_cfg}.new ${grub_cfg}

echo "done" >&2
