]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - sbin/reboot/nextboot.sh
MFC r230812: Add -e to set arbitrary kernel environment variables.
[FreeBSD/stable/9.git] / sbin / reboot / nextboot.sh
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$
8
9 delete="NO"
10 kenv=
11 force="NO"
12 nextboot_file="/boot/nextboot.conf"
13
14 add_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
30 display_usage() {
31         echo "Usage: nextboot [-e variable=value] [-f] [-k kernel] [-o options]"
32         echo "       nextboot -D"
33 }
34
35 while 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
64 done
65
66 if [ ${delete} = "YES" ]; then
67         rm -f ${nextboot_file}
68         exit 0
69 fi
70
71 if [ -z "${kenv}" ]; then
72         display_usage
73         exit 1
74 fi
75
76 if [ -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
79 fi
80
81 df -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
87 done
88
89 cat > ${nextboot_file} << EOF
90 nextboot_enable="YES"
91 $kenv
92 EOF