1213137Spjd#!/bin/sh 2213137Spjd# 3213137Spjd# Copyright (c) 2010 Pawel Jakub Dawidek <pjd@FreeBSD.org> 4213137Spjd# All rights reserved. 5213137Spjd# 6213137Spjd# Redistribution and use in source and binary forms, with or without 7213137Spjd# modification, are permitted provided that the following conditions 8213137Spjd# are met: 9213137Spjd# 1. Redistributions of source code must retain the above copyright 10213137Spjd# notice, this list of conditions and the following disclaimer. 11213137Spjd# 2. Redistributions in binary form must reproduce the above copyright 12213137Spjd# notice, this list of conditions and the following disclaimer in the 13213137Spjd# documentation and/or other materials provided with the distribution. 14213137Spjd# 15213137Spjd# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 16213137Spjd# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17213137Spjd# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18213137Spjd# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 19213137Spjd# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20213137Spjd# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21213137Spjd# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22213137Spjd# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23213137Spjd# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24213137Spjd# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25213137Spjd# SUCH DAMAGE. 26213137Spjd# 27213137Spjd# $FreeBSD$ 28213137Spjd# 29213137Spjd 30213137Spjd# PROVIDE: gptboot 31213137Spjd# REQUIRE: mountcritremote 32213137Spjd# KEYWORD: nojail 33213137Spjd 34213137Spjd. /etc/rc.subr 35213137Spjd 36213137Spjdname="gptboot" 37230099Sdougbrcvar="gptboot_enable" 38213137Spjdstart_cmd="gptboot_report" 39213137Spjd 40213137Spjdgptboot_report() 41213137Spjd{ 42213137Spjd gpart show | \ 43213137Spjd egrep '(^=>| freebsd-ufs .*(\[|,)(bootfailed|bootonce)(,|\]))' | \ 44213137Spjd sed 's/^=>//' | \ 45213137Spjd egrep -v '(\[|,)bootme(,|\])' | \ 46213137Spjd while read start size pos type attrs rest; do 47213137Spjd case "${pos}" in 48213137Spjd [0-9]*) 49213137Spjd if [ -n "${disk}" ]; then 50213137Spjd part="${disk}p${pos}" 51213137Spjd echo "${attrs}" | egrep -q '(\[|,)bootfailed(,|\])' 52213137Spjd bootfailed=$? 53213137Spjd echo "${attrs}" | egrep -q '(\[|,)bootonce(,|\])' 54213137Spjd bootonce=$? 55213137Spjd if [ ${bootfailed} -eq 0 ]; then 56213137Spjd logger -t gptboot -p local0.notice "Boot from ${part} failed." 57213137Spjd gpart unset -a bootfailed -i ${pos} ${disk} >/dev/null 58213137Spjd elif [ ${bootonce} -eq 0 ]; then 59213137Spjd # We want to log success after all failures. 60213137Spjd echo -n "Boot from ${part} succeeded." 61213137Spjd gpart unset -a bootonce -i ${pos} ${disk} >/dev/null 62213137Spjd fi 63213137Spjd fi 64213137Spjd ;; 65213137Spjd *) 66213137Spjd if [ "${type}" = "GPT" ]; then 67213137Spjd disk="${pos}" 68213137Spjd else 69213137Spjd disk="" 70213137Spjd fi 71213137Spjd ;; 72213137Spjd esac 73213137Spjd done | logger -t gptboot -p local0.notice 74213137Spjd} 75213137Spjd 76213137Spjdload_rc_config $name 77213137Spjdrun_rc_command "$1" 78