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