update_bootcfg(8): various improvements

- inherit a predefined set of system environment variables
  (the current set of inherited variables is: ahci; acpi; no_apic);
- auto-adjust the default menu option when lines are auto-removed;
- add variable substitution support for /etc/boot.cfg.local;
- make default menu options in boot.cfg.local relative to itself,
  allowing one to set the default to a menu option from this file.
This commit is contained in:
David van Moolenbroek 2012-10-16 00:40:35 +02:00
parent 3fab01cdb2
commit ceefd434f1
2 changed files with 88 additions and 13 deletions

View file

@ -6,26 +6,85 @@ DEFAULTCFG=/etc/boot.cfg.default
LOCALCFG=/etc/boot.cfg.local
TMP=/boot.cfg.temp
DIRSBASE=/boot/minix
INHERIT="ahci acpi no_apic"
filter_missing_entries()
filter_entries()
{
# This routine performs three tasks:
# - substitute variables in the configuration lines;
# - remove multiboot entries that refer to nonexistent kernels;
# - adjust the default option for line removal and different files.
# The last part is handled by the awk part of the routine.
while read line
do
if ! echo "$line" | grep -s -q 'multiboot'
# Substitute variables like $rootdevname and $args
line=$(eval echo \"$line\")
if ! echo "$line" | grep -sq '^menu=.*multiboot'
then
echo "$line"
continue
fi
# Check if kernel presents
# Check if the referenced kernel is present
kernel=`echo "$line" | sed -n 's/.*multiboot[[:space:]]*\(\/[^[:space:]]*\).*/\1/p'`
if [ ! -r "$kernel" ]
then
echo "Warning: config contains entry for \"$kernel\" which is missing! Entry skipped." 1>&2
echo "menu=SKIP"
else
echo "$line"
fi
done
done | awk '
BEGIN {
count=1
base=0
default=0
}
/^menu=SKIP$/ {
# A menu entry discarded by the kernel check above
skip[count++]=1
next
}
/^menu=/ {
# A valid menu entry
skip[count++]=0
print
next
}
/^BASE=/ {
# The menu count base as passed in by count_entries()
sub(/^.*=/,"",$1)
base=$1+0
next
}
/^default=/ {
# The default option
# Correct for the menu count base and store for later
sub(/^.*=/,"",$1)
default=$1+base
next
}
{
# Any other line
print
}
END {
# If a default was given, correct for removed lines
# (do not bother to warn if the default itself is gone)
if (default) {
for (i = default; i > 0; i--)
if (skip[i]) default--;
print "default=" default
}
}
'
}
count_entries()
{
echo -n "BASE="; grep -cs '^menu=' "$1"
}
if [ ! -b "$ROOT" ]
@ -36,14 +95,22 @@ fi
rootdevname=`echo $ROOT | sed 's/\/dev\///'`
# Construct a list of inherited arguments for boot options to use. Note that
# rootdevname must not be passed on this way, as it is changed during setup.
args=""
for k in $INHERIT; do
if sysenv | grep -sq "^$k="; then
kv=$(sysenv | grep "^$k=")
args="$args $kv"
fi
done
if [ -r $DEFAULTCFG ]
then
default_cfg=`cat $DEFAULTCFG`
# Substitute variables like $rootdevname
echo "$default_cfg" | while read line; do eval echo \"$line\" | filter_missing_entries >> $TMP; done
filter_entries < $DEFAULTCFG >> $TMP
fi
if [ -e /boot/minix_latest -a -d /boot/minix_latest -o -h /boot/minix_latest ]
if [ -d /boot/minix_latest -o -h /boot/minix_latest ]
then
latest=`basename \`stat -f "%Y" /boot/minix_latest\``
fi
@ -53,11 +120,19 @@ do
build_name="`basename $i`"
if [ "$build_name" != "$latest" ]
then
echo "menu=Start MINIX 3 ($build_name):load_mods $DIRSBASE/$i/mod*;multiboot $DIRSBASE/$i/kernel rootdevname=$rootdevname" >> /$TMP
echo "menu=Start MINIX 3 ($build_name):load_mods $DIRSBASE/$i/mod*;multiboot $DIRSBASE/$i/kernel rootdevname=$rootdevname $args" >> $TMP
fi
done
[ -r $LOCALCFG ] && cat $LOCALCFG | filter_missing_entries >> $TMP
if [ -r $LOCALCFG ]
then
# If the local config supplies a "default" option, we assume that this
# refers to one of the options in the local config itself. Therefore,
# we increase this default by the number of options already present in
# the output so far. To this end, count_entries() inserts a special
# token that is recognized and filtered out by filter_entries().
(count_entries $TMP; cat $LOCALCFG) | filter_entries >> $TMP
fi
mv $TMP /boot.cfg

View file

@ -1,8 +1,8 @@
clear=1
timeout=5
default=2
menu=Start MINIX 3:load_mods /boot/minix_default/mod*;multiboot /boot/minix_default/kernel rootdevname=$rootdevname
menu=Start latest MINIX 3:load_mods /boot/minix_latest/mod*;multiboot /boot/minix_latest/kernel rootdevname=$rootdevname
menu=Start latest MINIX 3 in single user mode:load_mods /boot/minix_latest/mod*;multiboot /boot/minix_latest/kernel rootdevname=$rootdevname bootopts=-s
menu=Start MINIX 3:load_mods /boot/minix_default/mod*;multiboot /boot/minix_default/kernel rootdevname=$rootdevname $args
menu=Start latest MINIX 3:load_mods /boot/minix_latest/mod*;multiboot /boot/minix_latest/kernel rootdevname=$rootdevname $args
menu=Start latest MINIX 3 in single user mode:load_mods /boot/minix_latest/mod*;multiboot /boot/minix_latest/kernel rootdevname=$rootdevname bootopts=-s $args
menu=Edit menu option:edit
menu=Drop to boot prompt:prompt