nextboot.sh revision 297772
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: head/sbin/reboot/nextboot.sh 297772 2016-04-10 01:25:12Z markj $ 28 29append="NO" 30delete="NO" 31kenv= 32force="NO" 33nextboot_file="/boot/nextboot.conf" 34 35add_kenv() 36{ 37 local var value 38 39 var=$1 40 # strip literal quotes if passed in 41 value=${2%\"*} 42 value=${value#*\"} 43 44 if [ -n "${kenv}" ]; then 45 kenv="${kenv} 46" 47 fi 48 kenv="${kenv}${var}=\"${value}\"" 49} 50 51display_usage() { 52 cat <<-EOF 53 Usage: nextboot [-e variable=value] [-f] [-k kernel] [-o options] 54 nextboot -D 55 EOF 56} 57 58while getopts "aDe:fk:o:" argument ; do 59 case "${argument}" in 60 a) 61 append="YES" 62 ;; 63 D) 64 delete="YES" 65 ;; 66 e) 67 var=${OPTARG%%=*} 68 value=${OPTARG#*=} 69 if [ -z "$var" -o -z "$value" ]; then 70 display_usage 71 exit 1 72 fi 73 add_kenv "$var" "$value" 74 ;; 75 f) 76 force="YES" 77 ;; 78 k) 79 kernel="${OPTARG}" 80 add_kenv kernel "$kernel" 81 ;; 82 o) 83 add_kenv kernel_options "${OPTARG}" 84 ;; 85 *) 86 display_usage 87 exit 1 88 ;; 89 esac 90done 91 92if [ ${delete} = "YES" ]; then 93 rm -f ${nextboot_file} 94 exit 0 95fi 96 97if [ -z "${kenv}" ]; then 98 display_usage 99 exit 1 100fi 101 102if [ -n "${kernel}" -a ${force} = "NO" -a ! -d /boot/${kernel} ]; then 103 echo "Error: /boot/${kernel} doesn't exist. Use -f to override." 104 exit 1 105fi 106 107df -Tn "/boot/" 2>/dev/null | while read _fs _type _other ; do 108 [ "zfs" = "${_type}" ] || continue 109 cat 1>&2 <<-EOF 110 WARNING: loader(8) has only R/O support for ZFS 111 nextboot.conf will NOT be reset in case of kernel boot failure 112 EOF 113done 114 115set -e 116 117nextboot_tmp=$(mktemp $(dirname ${nextboot_file})/nextboot.XXXXXX) 118 119if [ ${append} = "YES" -a -f ${nextboot_file} ]; then 120 cp -f ${nextboot_file} ${nextboot_tmp} 121fi 122 123cat >> ${nextboot_tmp} << EOF 124nextboot_enable="YES" 125$kenv 126EOF 127 128fsync ${nextboot_tmp} 129 130mv ${nextboot_tmp} ${nextboot_file} 131