nextboot.sh revision 230812
1#! /bin/sh
2#
3# Copyright 2002. Gordon Tetlow.
4# gordon@FreeBSD.org
5# Copyright (c) 2012 Sandvine Incorporated. All rights reserved.
6#
7# $FreeBSD: head/sbin/reboot/nextboot.sh 230812 2012-01-31 15:32:05Z emaste $
8
9delete="NO"
10kenv=
11force="NO"
12nextboot_file="/boot/nextboot.conf"
13
14add_kenv()
15{
16	local var value
17
18	var=$1
19	# strip literal quotes if passed in
20	value=${2%\"*}
21	value=${value#*\"}
22
23	if [ -n "${kenv}" ]; then
24		kenv="${kenv}
25"
26	fi
27	kenv="${kenv}${var}=\"${value}\""
28}
29
30display_usage() {
31	echo "Usage: nextboot [-e variable=value] [-f] [-k kernel] [-o options]"
32	echo "       nextboot -D"
33}
34
35while getopts "De:fk:o:" argument ; do
36	case "${argument}" in
37	D)
38		delete="YES"
39		;;
40	e)
41		var=${OPTARG%%=*}
42		value=${OPTARG#*=}
43		if [ -z "$var" -o -z "$value" ]; then
44			display_usage
45			exit 1
46		fi
47		add_kenv "$var" "$value"
48		;;
49	f)
50		force="YES"
51		;;
52	k)
53		kernel="${OPTARG}"
54		add_kenv kernel "$kernel"
55		;;
56	o)
57		add_kenv kernel_options "${OPTARG}"
58		;;
59	*)
60		display_usage
61		exit 1
62		;;
63	esac
64done
65
66if [ ${delete} = "YES" ]; then
67	rm -f ${nextboot_file}
68	exit 0
69fi
70
71if [ -z "${kenv}" ]; then
72	display_usage
73	exit 1
74fi
75
76if [ -n "${kernel}" -a ${force} = "NO" -a ! -d /boot/${kernel} ]; then
77	echo "Error: /boot/${kernel} doesn't exist. Use -f to override."
78	exit 1
79fi
80
81df -Tn "/boot/" 2>/dev/null | while read _fs _type _other ; do
82	[ "zfs" = "${_type}" ] || continue
83	cat 1>&2 <<-EOF
84		WARNING: loader(8) has only R/O support for ZFS
85		nextboot.conf will NOT be reset in case of kernel boot failure
86	EOF
87done
88
89cat > ${nextboot_file} << EOF
90nextboot_enable="YES"
91$kenv
92EOF
93