1158722Sflz#!/bin/sh
2158722Sflz#
3158722Sflz# Copyright (c) 2006  The FreeBSD Project
4158722Sflz# All rights reserved.
5158722Sflz#
6158722Sflz# Redistribution and use in source and binary forms, with or without
7158722Sflz# modification, are permitted provided that the following conditions
8158722Sflz# are met:
9158722Sflz# 1. Redistributions of source code must retain the above copyright
10158722Sflz#    notice, this list of conditions and the following disclaimer.
11158722Sflz# 2. Redistributions in binary form must reproduce the above copyright
12158722Sflz#    notice, this list of conditions and the following disclaimer in the
13158722Sflz#    documentation and/or other materials provided with the distribution.
14158722Sflz#
15158722Sflz# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16158722Sflz# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17158722Sflz# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18158722Sflz# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19158722Sflz# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20158722Sflz# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21158722Sflz# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22158722Sflz# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23158722Sflz# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24158722Sflz# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25158722Sflz# SUCH DAMAGE.
26158722Sflz#
27158722Sflz# $FreeBSD: releng/11.0/etc/rc.d/mdconfig2 298514 2016-04-23 16:10:54Z lme $
28158722Sflz#
29158722Sflz
30158722Sflz# PROVIDE: mdconfig2
31158722Sflz# REQUIRE: mountcritremote
32158722Sflz# BEFORE: SERVERS
33158722Sflz
34158722Sflz. /etc/rc.subr
35158722Sflz
36158722Sflzname="mdconfig2"
37298514Slmedesc="Create and control memory disks"
38158722Sflzstop_cmd="mdconfig2_stop"
39158722Sflzstart_cmd="mdconfig2_start"
40165683Syarstart_precmd='[ -n "${_mdconfig2_list}" ]'
41165683Syarrequired_modules="geom_md:g_md"
42158722Sflz
43158722Sflzis_readonly()
44158722Sflz{
45158722Sflz	local _mp _ret
46158722Sflz
47158722Sflz	_mp=$1
48158722Sflz	_ret=`mount | while read _line; do
49158722Sflz		case ${_line} in
50158722Sflz		*" ${_mp} "*read-only*)
51158722Sflz			echo "yes"
52158722Sflz			;;
53208060Sdougb
54158722Sflz		*)
55158722Sflz			;;
56158722Sflz		esac;
57158722Sflz	done`
58158722Sflz
59158722Sflz	if [ -n "${_ret}" ]; then
60158722Sflz		return 0
61158722Sflz	else
62158722Sflz		return 1
63158722Sflz	fi
64158722Sflz}
65158722Sflz
66158722Sflzinit_variables()
67158722Sflz{
68158722Sflz	local _i
69158722Sflz
70158722Sflz	_fs=""
71158722Sflz	_mp=""
72158722Sflz	_mounted="no"
73158722Sflz	_dev="/dev/${_md}"
74158722Sflz	eval _config=\$mdconfig_${_md}
75158722Sflz	eval _owner=\$mdconfig_${_md}_owner
76158722Sflz	eval _perms=\$mdconfig_${_md}_perms
77158722Sflz	eval _files=\$mdconfig_${_md}_files
78158722Sflz	eval _populate=\$mdconfig_${_md}_cmd
79158722Sflz
80158722Sflz	_type=${_config##*-t\ }
81158722Sflz	_type=${_type%%\ *}
82158722Sflz	if [ -z "${_type}" ]; then
83158722Sflz		err 1 "You need to specify \"-t <type>\" in mdconfig_${_md}"
84158722Sflz	fi
85158722Sflz
86158722Sflz	if [ "${_type}" = "vnode" ]; then
87158722Sflz		_file=${_config##*-f\ }
88158722Sflz		_file=${_file%%\ *}
89158722Sflz		if [ -z "${_file}" ]; then
90158722Sflz			err 2 "You need to specify \"-f <file>\" in mdconfig_${_md} for vnode devices"
91158722Sflz		fi
92158722Sflz
93158722Sflz		if [ "${_file}" != "${_file%.uzip}" ]; then
94158722Sflz			_dev="/dev/${_md}.uzip"
95158722Sflz		fi
96158722Sflz		for _i in `df ${_file} 2>/dev/null`; do _fs=${_i}; done
97158722Sflz	fi
98158722Sflz
99158722Sflz	# Debugging help.
100158722Sflz	debug "${_md} config: ${_config}"
101158722Sflz	debug "${_md} type: ${_type}"
102158722Sflz	debug "${_md} dev: ${_dev}"
103158722Sflz	debug "${_md} file: ${_file}"
104158722Sflz	debug "${_md} fs: ${_fs}"
105158722Sflz	debug "${_md} owner: ${_owner}"
106158722Sflz	debug "${_md} perms: ${_perms}"
107158722Sflz	debug "${_md} files: ${_files}"
108158722Sflz	debug "${_md} populate cmd: ${_populate}"
109158722Sflz}
110158722Sflz
111158722Sflzmdconfig2_start()
112158722Sflz{
113158722Sflz	local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate _fsck_cmd _i
114158722Sflz
115158722Sflz	for _md in ${_mdconfig2_list}; do
116158722Sflz		init_variables ${_md}
117158722Sflz		if [ ! -r ${_file} ]; then
118158722Sflz			err 3 "${_file} doesn't exist"
119158722Sflz			continue
120158722Sflz		fi
121158722Sflz		# First pass: create md(4) vnode devices from files stored on
122158722Sflz		# non-root partition. Swap and malloc md(4) devices have already
123158722Sflz		# been created.
124158722Sflz		if [ "${_type}" = "vnode" -a "${_fs}" != "/" ]; then
125165683Syar			if [ "${_file}" != "${_file%.uzip}" ]; then
126165683Syar				load_kld -m g_uzip geom_uzip || return 3
127165683Syar			fi
128158722Sflz			if is_readonly ${_fs}; then
129158722Sflz				warn "${_fs} is mounted read-only, skipping ${_md}."
130158722Sflz				continue
131158722Sflz			fi
132158722Sflz			if mdconfig -l -u ${_md} >/dev/null 2>&1; then
133158722Sflz				err 3 "${_md} already exists"
134158722Sflz			fi
135158722Sflz			echo "Creating ${_md} device (${_type})."
136158722Sflz			if ! mdconfig -a ${_config} -u ${_md}; then
137158722Sflz				echo "Creating ${_md} device failed, moving on."
138158722Sflz				continue
139158722Sflz			fi
140158722Sflz			# Skip fsck for uzip devices.
141158722Sflz			if [ "${_file}" != "${_file%.uzip}" ]; then
142158722Sflz				_fsck_cmd=":"
143158722Sflz			elif checkyesno background_fsck; then
144158722Sflz				_fsck_cmd="fsck -F"
145158722Sflz			else
146158722Sflz				_fsck_cmd="fsck"
147158722Sflz			fi
148158722Sflz			if ! eval ${_fsck_cmd} -p ${_dev} >/dev/null; then
149158722Sflz				echo "Fsck failed on ${_dev}, not mounting the filesystem."
150158722Sflz				continue
151158722Sflz			fi
152158722Sflz			if mount -d ${_dev} >/dev/null 2>&1; then
153158722Sflz				echo "Mounting ${_dev}."
154158722Sflz				mount ${_dev}
155158722Sflz			fi
156158722Sflz		fi
157158722Sflz
158158722Sflz		for _i in `df ${_dev} 2>/dev/null`; do _mp=${_i}; done
159158722Sflz		if [ ! -z "${_mp}" -a "${_mp}" = "${_mp%%%}" ]; then
160158722Sflz			_mounted="yes"
161158722Sflz		fi
162158722Sflz
163158722Sflz		if checkyesno _mounted; then
164158722Sflz			# Second pass: change permissions and ownership.
165158722Sflz			[ -z "${_owner}" ] || chown -f ${_owner} ${_dev} ${_mp}
166158722Sflz			[ -z "${_perms}" ] || chmod -f ${_perms} ${_dev} ${_mp}
167158722Sflz
168158722Sflz			# Third pass: populate with foreign files.
169158722Sflz			if [ -n "${_files}" -o -n "${_populate}" ]; then
170158722Sflz				echo "Populating ${_dev}."
171158722Sflz			fi
172158722Sflz			if [ -n "${_files}" ]; then
173158722Sflz				cp -Rp ${_files} ${_mp}
174158722Sflz			fi
175158722Sflz			if [ -n "${_populate}" ]; then
176158722Sflz				eval ${_populate}
177158722Sflz			fi
178158722Sflz		fi
179158722Sflz	done
180158722Sflz}
181158722Sflz
182158722Sflzmdconfig2_stop()
183158722Sflz{
184158722Sflz	local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate
185158722Sflz
186158722Sflz	for _md in ${_mdconfig2_list}; do
187158722Sflz		init_variables ${_md}
188158722Sflz		if [ "${_type}" = "vnode" ]; then
189158722Sflz			for i in `df ${_dev} 2>/dev/null`; do _mp=$i; done
190158722Sflz			if [ ! -r "${_file}" -o "${_fs}" = "/" ]; then
191158722Sflz				continue
192158722Sflz			fi
193158722Sflz			if [ -z "${_mp}" -o "${_mp}" != "${_mp%%%}" ]; then
194158722Sflz				echo "Device ${_dev} isn't mounted."
195158722Sflz			else
196158722Sflz				echo "Umounting ${_dev}."
197158722Sflz				umount ${_dev}
198158722Sflz			fi
199158722Sflz			if mdconfig -l -u ${_md} >/dev/null 2>&1; then
200158722Sflz				echo "Destroying ${_md}."
201158722Sflz				mdconfig -d -u ${_md}
202158722Sflz			fi
203158722Sflz		fi
204158722Sflz	done
205158722Sflz}
206158722Sflz
207158722Sflz_mdconfig2_cmd="$1"
208158722Sflzif [ $# -gt 0 ]; then
209158722Sflz        shift
210158722Sflzfi
211158722Sflz[ -n "$*" ] && _mdconfig2_list="$*"
212158722Sflz
213158722Sflzload_rc_config $name
214158722Sflz
215158722Sflzif [ -z "${_mdconfig2_list}" ]; then
216264243Sdteske	for _mdconfig2_config in `list_vars mdconfig_md[0-9]\* |
217264243Sdteske		sort_lite -nk1.12`
218264243Sdteske	do
219264243Sdteske		_mdconfig2_unit=${_mdconfig2_config#mdconfig_md}
220290163Sdteske		[ "${_mdconfig2_unit#*[!0-9]}" = "$_mdconfig2_unit" ] ||
221290163Sdteske			continue
222264243Sdteske		_mdconfig2_list="$_mdconfig2_list md$_mdconfig2_unit"
223158722Sflz	done
224264243Sdteske	_mdconfig2_list="${_mdconfig2_list# }"
225158722Sflzfi
226208060Sdougb
227158722Sflzrun_rc_command "${_mdconfig2_cmd}"
228