mdconfig2 revision 290163
1145510Sdarrenr#!/bin/sh
2145510Sdarrenr#
3145510Sdarrenr# Copyright (c) 2006  The FreeBSD Project
4145510Sdarrenr# All rights reserved.
5145510Sdarrenr#
6145510Sdarrenr# Redistribution and use in source and binary forms, with or without
7145510Sdarrenr# modification, are permitted provided that the following conditions
8145510Sdarrenr# are met:
9145510Sdarrenr# 1. Redistributions of source code must retain the above copyright
10145510Sdarrenr#    notice, this list of conditions and the following disclaimer.
11145510Sdarrenr# 2. Redistributions in binary form must reproduce the above copyright
12145510Sdarrenr#    notice, this list of conditions and the following disclaimer in the
13145510Sdarrenr#    documentation and/or other materials provided with the distribution.
14145510Sdarrenr#
15145510Sdarrenr# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16145510Sdarrenr# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17145510Sdarrenr# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18145510Sdarrenr# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19145510Sdarrenr# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20145510Sdarrenr# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21145510Sdarrenr# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22145510Sdarrenr# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23145510Sdarrenr# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24145510Sdarrenr# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25145510Sdarrenr# SUCH DAMAGE.
26145510Sdarrenr#
27145510Sdarrenr# $FreeBSD: head/etc/rc.d/mdconfig2 290163 2015-10-29 21:12:57Z dteske $
28145510Sdarrenr#
29145510Sdarrenr
30145510Sdarrenr# PROVIDE: mdconfig2
31145510Sdarrenr# REQUIRE: mountcritremote
32145510Sdarrenr# BEFORE: SERVERS
33145510Sdarrenr
34145510Sdarrenr. /etc/rc.subr
35145510Sdarrenr
36145510Sdarrenrname="mdconfig2"
37145510Sdarrenrstop_cmd="mdconfig2_stop"
38145510Sdarrenrstart_cmd="mdconfig2_start"
39145510Sdarrenrstart_precmd='[ -n "${_mdconfig2_list}" ]'
40145510Sdarrenrrequired_modules="geom_md:g_md"
41145510Sdarrenr
42145510Sdarrenris_readonly()
43145510Sdarrenr{
44145510Sdarrenr	local _mp _ret
45145510Sdarrenr
46145510Sdarrenr	_mp=$1
47145510Sdarrenr	_ret=`mount | while read _line; do
48145510Sdarrenr		case ${_line} in
49145510Sdarrenr		*" ${_mp} "*read-only*)
50145510Sdarrenr			echo "yes"
51145510Sdarrenr			;;
52145510Sdarrenr
53145510Sdarrenr		*)
54145510Sdarrenr			;;
55145510Sdarrenr		esac;
56145510Sdarrenr	done`
57145510Sdarrenr
58145510Sdarrenr	if [ -n "${_ret}" ]; then
59145510Sdarrenr		return 0
60145510Sdarrenr	else
61145510Sdarrenr		return 1
62145510Sdarrenr	fi
63145510Sdarrenr}
64145510Sdarrenr
65145510Sdarrenrinit_variables()
66145510Sdarrenr{
67145510Sdarrenr	local _i
68145510Sdarrenr
69145510Sdarrenr	_fs=""
70145510Sdarrenr	_mp=""
71145510Sdarrenr	_mounted="no"
72145510Sdarrenr	_dev="/dev/${_md}"
73145510Sdarrenr	eval _config=\$mdconfig_${_md}
74145510Sdarrenr	eval _owner=\$mdconfig_${_md}_owner
75145510Sdarrenr	eval _perms=\$mdconfig_${_md}_perms
76145510Sdarrenr	eval _files=\$mdconfig_${_md}_files
77145510Sdarrenr	eval _populate=\$mdconfig_${_md}_cmd
78145510Sdarrenr
79145510Sdarrenr	_type=${_config##*-t\ }
80145510Sdarrenr	_type=${_type%%\ *}
81145510Sdarrenr	if [ -z "${_type}" ]; then
82145510Sdarrenr		err 1 "You need to specify \"-t <type>\" in mdconfig_${_md}"
83145510Sdarrenr	fi
84145510Sdarrenr
85145510Sdarrenr	if [ "${_type}" = "vnode" ]; then
86145510Sdarrenr		_file=${_config##*-f\ }
87145510Sdarrenr		_file=${_file%%\ *}
88145510Sdarrenr		if [ -z "${_file}" ]; then
89145510Sdarrenr			err 2 "You need to specify \"-f <file>\" in mdconfig_${_md} for vnode devices"
90145510Sdarrenr		fi
91145510Sdarrenr
92145510Sdarrenr		if [ "${_file}" != "${_file%.uzip}" ]; then
93145510Sdarrenr			_dev="/dev/${_md}.uzip"
94145510Sdarrenr		fi
95145510Sdarrenr		for _i in `df ${_file} 2>/dev/null`; do _fs=${_i}; done
96145510Sdarrenr	fi
97145510Sdarrenr
98145510Sdarrenr	# Debugging help.
99145510Sdarrenr	debug "${_md} config: ${_config}"
100145510Sdarrenr	debug "${_md} type: ${_type}"
101145510Sdarrenr	debug "${_md} dev: ${_dev}"
102145510Sdarrenr	debug "${_md} file: ${_file}"
103145510Sdarrenr	debug "${_md} fs: ${_fs}"
104145510Sdarrenr	debug "${_md} owner: ${_owner}"
105145510Sdarrenr	debug "${_md} perms: ${_perms}"
106145510Sdarrenr	debug "${_md} files: ${_files}"
107145510Sdarrenr	debug "${_md} populate cmd: ${_populate}"
108145510Sdarrenr}
109145510Sdarrenr
110145510Sdarrenrmdconfig2_start()
111145510Sdarrenr{
112145510Sdarrenr	local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate _fsck_cmd _i
113
114	for _md in ${_mdconfig2_list}; do
115		init_variables ${_md}
116		if [ ! -r ${_file} ]; then
117			err 3 "${_file} doesn't exist"
118			continue
119		fi
120		# First pass: create md(4) vnode devices from files stored on
121		# non-root partition. Swap and malloc md(4) devices have already
122		# been created.
123		if [ "${_type}" = "vnode" -a "${_fs}" != "/" ]; then
124			if [ "${_file}" != "${_file%.uzip}" ]; then
125				load_kld -m g_uzip geom_uzip || return 3
126			fi
127			if is_readonly ${_fs}; then
128				warn "${_fs} is mounted read-only, skipping ${_md}."
129				continue
130			fi
131			if mdconfig -l -u ${_md} >/dev/null 2>&1; then
132				err 3 "${_md} already exists"
133			fi
134			echo "Creating ${_md} device (${_type})."
135			if ! mdconfig -a ${_config} -u ${_md}; then
136				echo "Creating ${_md} device failed, moving on."
137				continue
138			fi
139			# Skip fsck for uzip devices.
140			if [ "${_file}" != "${_file%.uzip}" ]; then
141				_fsck_cmd=":"
142			elif checkyesno background_fsck; then
143				_fsck_cmd="fsck -F"
144			else
145				_fsck_cmd="fsck"
146			fi
147			if ! eval ${_fsck_cmd} -p ${_dev} >/dev/null; then
148				echo "Fsck failed on ${_dev}, not mounting the filesystem."
149				continue
150			fi
151			if mount -d ${_dev} >/dev/null 2>&1; then
152				echo "Mounting ${_dev}."
153				mount ${_dev}
154			fi
155		fi
156
157		for _i in `df ${_dev} 2>/dev/null`; do _mp=${_i}; done
158		if [ ! -z "${_mp}" -a "${_mp}" = "${_mp%%%}" ]; then
159			_mounted="yes"
160		fi
161
162		if checkyesno _mounted; then
163			# Second pass: change permissions and ownership.
164			[ -z "${_owner}" ] || chown -f ${_owner} ${_dev} ${_mp}
165			[ -z "${_perms}" ] || chmod -f ${_perms} ${_dev} ${_mp}
166
167			# Third pass: populate with foreign files.
168			if [ -n "${_files}" -o -n "${_populate}" ]; then
169				echo "Populating ${_dev}."
170			fi
171			if [ -n "${_files}" ]; then
172				cp -Rp ${_files} ${_mp}
173			fi
174			if [ -n "${_populate}" ]; then
175				eval ${_populate}
176			fi
177		fi
178	done
179}
180
181mdconfig2_stop()
182{
183	local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate
184
185	for _md in ${_mdconfig2_list}; do
186		init_variables ${_md}
187		if [ "${_type}" = "vnode" ]; then
188			for i in `df ${_dev} 2>/dev/null`; do _mp=$i; done
189			if [ ! -r "${_file}" -o "${_fs}" = "/" ]; then
190				continue
191			fi
192			if [ -z "${_mp}" -o "${_mp}" != "${_mp%%%}" ]; then
193				echo "Device ${_dev} isn't mounted."
194			else
195				echo "Umounting ${_dev}."
196				umount ${_dev}
197			fi
198			if mdconfig -l -u ${_md} >/dev/null 2>&1; then
199				echo "Destroying ${_md}."
200				mdconfig -d -u ${_md}
201			fi
202		fi
203	done
204}
205
206_mdconfig2_cmd="$1"
207if [ $# -gt 0 ]; then
208        shift
209fi
210[ -n "$*" ] && _mdconfig2_list="$*"
211
212load_rc_config $name
213
214if [ -z "${_mdconfig2_list}" ]; then
215	for _mdconfig2_config in `list_vars mdconfig_md[0-9]\* |
216		sort_lite -nk1.12`
217	do
218		_mdconfig2_unit=${_mdconfig2_config#mdconfig_md}
219		[ "${_mdconfig2_unit#*[!0-9]}" = "$_mdconfig2_unit" ] ||
220			continue
221		_mdconfig2_list="$_mdconfig2_list md$_mdconfig2_unit"
222	done
223	_mdconfig2_list="${_mdconfig2_list# }"
224fi
225
226run_rc_command "${_mdconfig2_cmd}"
227