]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - sbin/reboot/nextboot.sh
MFC r368207,368607:
[FreeBSD/stable/10.git] / sbin / reboot / nextboot.sh
1 #! /bin/sh
2 #
3 # Copyright (c) 2002 Gordon Tetlow. All rights reserved.
4 # Copyright (c) 2012 Sandvine Incorporated. All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 #    notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 #    notice, this list of conditions and the following disclaimer in the
13 #    documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 # SUCH DAMAGE.
26 #
27 # $FreeBSD$
28
29 delete="NO"
30 kenv=
31 force="NO"
32 nextboot_file="/boot/nextboot.conf"
33
34 add_kenv()
35 {
36         local var value
37
38         var=$1
39         # strip literal quotes if passed in
40         value=${2%\"*}
41         value=${value#*\"}
42
43         if [ -n "${kenv}" ]; then
44                 kenv="${kenv}
45 "
46         fi
47         kenv="${kenv}${var}=\"${value}\""
48 }
49
50 display_usage() {
51         echo "Usage: nextboot [-e variable=value] [-f] [-k kernel] [-o options]"
52         echo "       nextboot -D"
53 }
54
55 while getopts "De:fk:o:" argument ; do
56         case "${argument}" in
57         D)
58                 delete="YES"
59                 ;;
60         e)
61                 var=${OPTARG%%=*}
62                 value=${OPTARG#*=}
63                 if [ -z "$var" -o -z "$value" ]; then
64                         display_usage
65                         exit 1
66                 fi
67                 add_kenv "$var" "$value"
68                 ;;
69         f)
70                 force="YES"
71                 ;;
72         k)
73                 kernel="${OPTARG}"
74                 add_kenv kernel "$kernel"
75                 ;;
76         o)
77                 add_kenv kernel_options "${OPTARG}"
78                 ;;
79         *)
80                 display_usage
81                 exit 1
82                 ;;
83         esac
84 done
85
86 if [ ${delete} = "YES" ]; then
87         rm -f ${nextboot_file}
88         exit 0
89 fi
90
91 if [ -z "${kenv}" ]; then
92         display_usage
93         exit 1
94 fi
95
96 if [ -n "${kernel}" -a ${force} = "NO" -a ! -d /boot/${kernel} ]; then
97         echo "Error: /boot/${kernel} doesn't exist. Use -f to override."
98         exit 1
99 fi
100
101 df -Tn "/boot/" 2>/dev/null | while read _fs _type _other ; do
102         [ "zfs" = "${_type}" ] || continue
103         cat 1>&2 <<-EOF
104                 WARNING: loader(8) has only R/O support for ZFS
105                 nextboot.conf will NOT be reset in case of kernel boot failure
106         EOF
107 done
108
109 cat > ${nextboot_file} << EOF
110 nextboot_enable="YES"
111 $kenv
112 EOF