xref: /freebsd/libexec/rc/rc.d/dumpon (revision 2b8331622f0b212cf3bb4fc4914a501e5321d506)
1#!/bin/sh
2#
3# $FreeBSD$
4#
5
6# PROVIDE: dumpon
7# BEFORE: disks
8# KEYWORD: nojail
9
10. /etc/rc.subr
11
12name="dumpon"
13desc="Dump kernel corefiles from swap to disk"
14start_cmd="dumpon_start"
15stop_cmd="dumpon_stop"
16
17dumpon_try()
18{
19	local flags
20
21	flags=${dumpon_flags}
22	if [ -n "${dumppubkey}" ]; then
23		warn "The dumppubkey variable is deprecated.  Use dumpon_flags."
24		flags="${flags} -k ${dumppubkey}"
25	fi
26	/sbin/dumpon ${flags} "${1}"
27	if [ $? -eq 0 ]; then
28		# Make a symlink in devfs for savecore
29		ln -fs "${1}" /dev/dumpdev
30		return 0
31	fi
32	warn "unable to specify $1 as a dump device"
33	return 1
34}
35
36dumpon_warn_unencrypted()
37{
38	if [ -n "${dumppubkey}" ]; then
39		return
40	fi
41	for flag in ${dumpon_flags}; do
42		if [ $flag = -k ]; then
43			return
44		fi
45	done
46	warn "Kernel dumps will be written to the swap partition without encryption."
47}
48
49dumpon_start()
50{
51	# Enable dumpdev so that savecore can see it. Enable it
52	# early so a crash early in the boot process can be caught.
53	#
54	case ${dumpdev} in
55	[Nn][Oo] | '')
56		;;
57	[Aa][Uu][Tt][Oo])
58		root_hold_wait
59		dev=$(/bin/kenv -q dumpdev)
60		if [ -n "${dev}" ] ; then
61			dumpon_try "${dev}"
62			return $?
63		fi
64		while read dev mp type more ; do
65			[ "${type}" = "swap" ] || continue
66			case ${dev} in
67			*.bde|*.eli)
68				dumpon_warn_unencrypted
69				dev=${dev%.*}
70				;;
71			esac
72			[ -c "${dev}" ] || continue
73			dumpon_try "${dev}" 2>/dev/null && return 0
74		done </etc/fstab
75		echo "No suitable dump device was found." 1>&2
76		return 1
77		;;
78	*)
79		root_hold_wait
80		dumpon_try "${dumpdev}"
81		;;
82	esac
83}
84
85dumpon_stop()
86{
87	case ${dumpdev} in
88	[Nn][Oo] | '')
89		;;
90	*)
91		rm -f /dev/dumpdev
92		/sbin/dumpon -v off
93		;;
94	esac
95}
96
97load_rc_config $name
98run_rc_command "$1"
99