Add -e to set arbitrary kernel environment variables.

Nextboot(8) can now set any combination of kernel name (-k), kernel
options (-o), and environment strings (-e).  As a result of this change
-k also becomes optional.

Reviewed by:	freebsd-current (Ian Lepore, pluknet@, jhb@)
This commit is contained in:
Ed Maste 2012-01-31 15:32:05 +00:00
parent 86872b65ef
commit b7fa166b60
2 changed files with 44 additions and 10 deletions

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd November 4, 2002
.Dd January 31, 2012
.Dt NEXTBOOT 8
.Os
.Sh NAME
@ -32,15 +32,17 @@
.Nd "specify an alternate kernel and boot flags for the next reboot"
.Sh SYNOPSIS
.Nm
.Op Fl e Ar variable=value
.Op Fl f
.Op Fl k Ar kernel
.Op Fl o Ar options
.Fl k Ar kernel
.Nm
.Fl D
.Sh DESCRIPTION
The
.Nm
utility allows specifying an alternate kernel and/or boot flags for the
utility allows specifying some combination of an alternate kernel, boot flags
and kernel environment for the
next time the machine is booted.
Once the
.Xr loader 8
@ -58,6 +60,11 @@ with this
option removes an existing
.Nm
configuration.
.It Fl e Ar variable=value
This option adds the provided variable and value to the kernel environment.
The value is quoted when written to the
.Nm
configuration.
.It Fl f
This
option disables the sanity checking which checks if the kernel really exists

View File

@ -2,31 +2,59 @@
#
# Copyright 2002. Gordon Tetlow.
# gordon@FreeBSD.org
# Copyright (c) 2012 Sandvine Incorporated. All rights reserved.
#
# $FreeBSD$
delete="NO"
kenv=
force="NO"
nextboot_file="/boot/nextboot.conf"
add_kenv()
{
local var value
var=$1
# strip literal quotes if passed in
value=${2%\"*}
value=${value#*\"}
if [ -n "${kenv}" ]; then
kenv="${kenv}
"
fi
kenv="${kenv}${var}=\"${value}\""
}
display_usage() {
echo "Usage: nextboot [-f] [-o options] -k kernel"
echo "Usage: nextboot [-e variable=value] [-f] [-k kernel] [-o options]"
echo " nextboot -D"
}
while getopts "Dfk:o:" argument ; do
while getopts "De:fk:o:" argument ; do
case "${argument}" in
D)
delete="YES"
;;
e)
var=${OPTARG%%=*}
value=${OPTARG#*=}
if [ -z "$var" -o -z "$value" ]; then
display_usage
exit 1
fi
add_kenv "$var" "$value"
;;
f)
force="YES"
;;
k)
kernel="${OPTARG}"
add_kenv kernel "$kernel"
;;
o)
kernel_options="${OPTARG}"
add_kenv kernel_options "${OPTARG}"
;;
*)
display_usage
@ -40,12 +68,12 @@ if [ ${delete} = "YES" ]; then
exit 0
fi
if [ "xxx${kernel}" = "xxx" ]; then
if [ -z "${kenv}" ]; then
display_usage
exit 1
fi
if [ ${force} = "NO" -a ! -d /boot/${kernel} ]; then
if [ -n "${kernel}" -a ${force} = "NO" -a ! -d /boot/${kernel} ]; then
echo "Error: /boot/${kernel} doesn't exist. Use -f to override."
exit 1
fi
@ -60,6 +88,5 @@ done
cat > ${nextboot_file} << EOF
nextboot_enable="YES"
kernel="${kernel}"
kernel_options="${kernel_options}"
$kenv
EOF