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