xref: /freebsd/libexec/rc/rc.d/mdconfig2 (revision f99f0ee14e3af81c23150a6a340259ca8a33d01a)
10696600cSBjoern A. Zeeb#!/bin/sh
20696600cSBjoern A. Zeeb#
30696600cSBjoern A. Zeeb# Copyright (c) 2006  The FreeBSD Project
40696600cSBjoern A. Zeeb# All rights reserved.
50696600cSBjoern A. Zeeb#
60696600cSBjoern A. Zeeb# Redistribution and use in source and binary forms, with or without
70696600cSBjoern A. Zeeb# modification, are permitted provided that the following conditions
80696600cSBjoern A. Zeeb# are met:
90696600cSBjoern A. Zeeb# 1. Redistributions of source code must retain the above copyright
100696600cSBjoern A. Zeeb#    notice, this list of conditions and the following disclaimer.
110696600cSBjoern A. Zeeb# 2. Redistributions in binary form must reproduce the above copyright
120696600cSBjoern A. Zeeb#    notice, this list of conditions and the following disclaimer in the
130696600cSBjoern A. Zeeb#    documentation and/or other materials provided with the distribution.
140696600cSBjoern A. Zeeb#
150696600cSBjoern A. Zeeb# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
160696600cSBjoern A. Zeeb# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
170696600cSBjoern A. Zeeb# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
180696600cSBjoern A. Zeeb# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
190696600cSBjoern A. Zeeb# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
200696600cSBjoern A. Zeeb# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
210696600cSBjoern A. Zeeb# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
220696600cSBjoern A. Zeeb# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
230696600cSBjoern A. Zeeb# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
240696600cSBjoern A. Zeeb# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
250696600cSBjoern A. Zeeb# SUCH DAMAGE.
260696600cSBjoern A. Zeeb#
270696600cSBjoern A. Zeeb#
280696600cSBjoern A. Zeeb
290696600cSBjoern A. Zeeb# PROVIDE: mdconfig2
300696600cSBjoern A. Zeeb# REQUIRE: mountcritremote
310696600cSBjoern A. Zeeb# BEFORE: SERVERS
320696600cSBjoern A. Zeeb
330696600cSBjoern A. Zeeb. /etc/rc.subr
340696600cSBjoern A. Zeeb
350696600cSBjoern A. Zeebname="mdconfig2"
360696600cSBjoern A. Zeebdesc="Create and control memory disks"
370696600cSBjoern A. Zeebstop_cmd="mdconfig2_stop"
380696600cSBjoern A. Zeebstart_cmd="mdconfig2_start"
390696600cSBjoern A. Zeebstart_precmd='[ -n "${_mdconfig2_list}" ]'
400696600cSBjoern A. Zeebrequired_modules="geom_md:g_md"
410696600cSBjoern A. Zeeb
420696600cSBjoern A. Zeebis_readonly()
430696600cSBjoern A. Zeeb{
440696600cSBjoern A. Zeeb	local _mp _ret
450696600cSBjoern A. Zeeb
460696600cSBjoern A. Zeeb	_mp=$1
470696600cSBjoern A. Zeeb	_ret=`mount | while read _line; do
480696600cSBjoern A. Zeeb		case ${_line} in
490696600cSBjoern A. Zeeb		*" ${_mp} "*read-only*)
500696600cSBjoern A. Zeeb			echo "yes"
510696600cSBjoern A. Zeeb			;;
520696600cSBjoern A. Zeeb
530696600cSBjoern A. Zeeb		*)
540696600cSBjoern A. Zeeb			;;
550696600cSBjoern A. Zeeb		esac;
560696600cSBjoern A. Zeeb	done`
570696600cSBjoern A. Zeeb
580696600cSBjoern A. Zeeb	if [ -n "${_ret}" ]; then
590696600cSBjoern A. Zeeb		return 0
600696600cSBjoern A. Zeeb	else
610696600cSBjoern A. Zeeb		return 1
620696600cSBjoern A. Zeeb	fi
630696600cSBjoern A. Zeeb}
640696600cSBjoern A. Zeeb
650696600cSBjoern A. Zeebinit_variables()
660696600cSBjoern A. Zeeb{
670696600cSBjoern A. Zeeb	local _i
680696600cSBjoern A. Zeeb
690696600cSBjoern A. Zeeb	_fs=""
700696600cSBjoern A. Zeeb	_mp=""
710696600cSBjoern A. Zeeb	_mounted="no"
720696600cSBjoern A. Zeeb	_dev="/dev/${_md}"
730696600cSBjoern A. Zeeb	eval _config=\$mdconfig_${_md}
740696600cSBjoern A. Zeeb	eval _owner=\$mdconfig_${_md}_owner
750696600cSBjoern A. Zeeb	eval _perms=\$mdconfig_${_md}_perms
760696600cSBjoern A. Zeeb	eval _files=\$mdconfig_${_md}_files
770696600cSBjoern A. Zeeb	eval _populate=\$mdconfig_${_md}_cmd
780696600cSBjoern A. Zeeb
790696600cSBjoern A. Zeeb	_type=${_config##*-t\ }
800696600cSBjoern A. Zeeb	_type=${_type%%\ *}
810696600cSBjoern A. Zeeb	if [ -z "${_type}" ]; then
820696600cSBjoern A. Zeeb		err 1 "You need to specify \"-t <type>\" in mdconfig_${_md}"
830696600cSBjoern A. Zeeb	fi
840696600cSBjoern A. Zeeb
850696600cSBjoern A. Zeeb	if [ "${_type}" = "vnode" ]; then
860696600cSBjoern A. Zeeb		_file=${_config##*-f\ }
870696600cSBjoern A. Zeeb		_file=${_file%%\ *}
880696600cSBjoern A. Zeeb		if [ -z "${_file}" ]; then
890696600cSBjoern A. Zeeb			err 2 "You need to specify \"-f <file>\" in mdconfig_${_md} for vnode devices"
900696600cSBjoern A. Zeeb		fi
910696600cSBjoern A. Zeeb
920696600cSBjoern A. Zeeb		if [ "${_file}" != "${_file%.uzip}" ]; then
930696600cSBjoern A. Zeeb			_dev="/dev/${_md}.uzip"
940696600cSBjoern A. Zeeb		fi
950696600cSBjoern A. Zeeb		for _i in `df ${_file} 2>/dev/null`; do _fs=${_i}; done
960696600cSBjoern A. Zeeb	fi
970696600cSBjoern A. Zeeb
980696600cSBjoern A. Zeeb	# Debugging help.
990696600cSBjoern A. Zeeb	debug "${_md} config: ${_config}"
1000696600cSBjoern A. Zeeb	debug "${_md} type: ${_type}"
1010696600cSBjoern A. Zeeb	debug "${_md} dev: ${_dev}"
1020696600cSBjoern A. Zeeb	debug "${_md} file: ${_file}"
1030696600cSBjoern A. Zeeb	debug "${_md} fs: ${_fs}"
1040696600cSBjoern A. Zeeb	debug "${_md} owner: ${_owner}"
1050696600cSBjoern A. Zeeb	debug "${_md} perms: ${_perms}"
1060696600cSBjoern A. Zeeb	debug "${_md} files: ${_files}"
1070696600cSBjoern A. Zeeb	debug "${_md} populate cmd: ${_populate}"
1080696600cSBjoern A. Zeeb}
1090696600cSBjoern A. Zeeb
1100696600cSBjoern A. Zeebmdconfig2_start()
1110696600cSBjoern A. Zeeb{
1120696600cSBjoern A. Zeeb	local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate _fsck_cmd _i
1130696600cSBjoern A. Zeeb
1140696600cSBjoern A. Zeeb	for _md in ${_mdconfig2_list}; do
1150696600cSBjoern A. Zeeb		init_variables ${_md}
1160696600cSBjoern A. Zeeb		if [ ! -r ${_file} ]; then
1170696600cSBjoern A. Zeeb			err 3 "${_file} doesn't exist"
1180696600cSBjoern A. Zeeb			continue
1190696600cSBjoern A. Zeeb		fi
1200696600cSBjoern A. Zeeb		# First pass: create md(4) vnode devices from files stored on
1210696600cSBjoern A. Zeeb		# non-root partition. Swap and malloc md(4) devices have already
1220696600cSBjoern A. Zeeb		# been created.
1230696600cSBjoern A. Zeeb		if [ "${_type}" = "vnode" -a "${_fs}" != "/" ]; then
1240696600cSBjoern A. Zeeb			if [ "${_file}" != "${_file%.uzip}" ]; then
125b11974c2SChris Rees				load_kld -m g_uzip geom_uzip || return 3
1260696600cSBjoern A. Zeeb			fi
1270696600cSBjoern A. Zeeb			if is_readonly ${_fs}; then
1280696600cSBjoern A. Zeeb				warn "${_fs} is mounted read-only, skipping ${_md}."
1290696600cSBjoern A. Zeeb				continue
1300696600cSBjoern A. Zeeb			fi
1310696600cSBjoern A. Zeeb			if mdconfig -l -u ${_md} >/dev/null 2>&1; then
1320696600cSBjoern A. Zeeb				err 3 "${_md} already exists"
1330696600cSBjoern A. Zeeb			fi
1340696600cSBjoern A. Zeeb			echo "Creating ${_md} device (${_type})."
1350696600cSBjoern A. Zeeb			if ! mdconfig -a ${_config} -u ${_md}; then
1360696600cSBjoern A. Zeeb				echo "Creating ${_md} device failed, moving on."
1370696600cSBjoern A. Zeeb				continue
1380696600cSBjoern A. Zeeb			fi
1390696600cSBjoern A. Zeeb			# Skip fsck for uzip devices.
1400696600cSBjoern A. Zeeb			if [ "${_file}" != "${_file%.uzip}" ]; then
1410696600cSBjoern A. Zeeb				_fsck_cmd=":"
1420696600cSBjoern A. Zeeb			elif checkyesno background_fsck; then
1430696600cSBjoern A. Zeeb				_fsck_cmd="fsck -F"
1440696600cSBjoern A. Zeeb			else
1450696600cSBjoern A. Zeeb				_fsck_cmd="fsck"
1460696600cSBjoern A. Zeeb			fi
1470696600cSBjoern A. Zeeb			if ! eval ${_fsck_cmd} -p ${_dev} >/dev/null; then
1480696600cSBjoern A. Zeeb				echo "Fsck failed on ${_dev}, not mounting the filesystem."
1490696600cSBjoern A. Zeeb				continue
1500696600cSBjoern A. Zeeb			fi
1510696600cSBjoern A. Zeeb			if mount -d ${_dev} >/dev/null 2>&1; then
1520696600cSBjoern A. Zeeb				echo "Mounting ${_dev}."
1530696600cSBjoern A. Zeeb				mount ${_dev}
1540696600cSBjoern A. Zeeb			fi
1550696600cSBjoern A. Zeeb		fi
1560696600cSBjoern A. Zeeb
1570696600cSBjoern A. Zeeb		for _i in `df ${_dev} 2>/dev/null`; do _mp=${_i}; done
1580696600cSBjoern A. Zeeb		if [ ! -z "${_mp}" -a "${_mp}" = "${_mp%%%}" ]; then
1590696600cSBjoern A. Zeeb			_mounted="yes"
1600696600cSBjoern A. Zeeb		fi
1610696600cSBjoern A. Zeeb
1620696600cSBjoern A. Zeeb		if checkyesno _mounted; then
1630696600cSBjoern A. Zeeb			# Second pass: change permissions and ownership.
1640696600cSBjoern A. Zeeb			[ -z "${_owner}" ] || chown -f ${_owner} ${_dev} ${_mp}
1650696600cSBjoern A. Zeeb			[ -z "${_perms}" ] || chmod -f ${_perms} ${_dev} ${_mp}
1660696600cSBjoern A. Zeeb
1670696600cSBjoern A. Zeeb			# Third pass: populate with foreign files.
1680696600cSBjoern A. Zeeb			if [ -n "${_files}" -o -n "${_populate}" ]; then
1690696600cSBjoern A. Zeeb				echo "Populating ${_dev}."
1700696600cSBjoern A. Zeeb			fi
1710696600cSBjoern A. Zeeb			if [ -n "${_files}" ]; then
1720696600cSBjoern A. Zeeb				cp -Rp ${_files} ${_mp}
1730696600cSBjoern A. Zeeb			fi
1740696600cSBjoern A. Zeeb			if [ -n "${_populate}" ]; then
1750696600cSBjoern A. Zeeb				eval ${_populate}
1760696600cSBjoern A. Zeeb			fi
1770696600cSBjoern A. Zeeb		fi
1780696600cSBjoern A. Zeeb	done
1790696600cSBjoern A. Zeeb}
1800696600cSBjoern A. Zeeb
1810696600cSBjoern A. Zeebmdconfig2_stop()
1820696600cSBjoern A. Zeeb{
1830696600cSBjoern A. Zeeb	local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate
1840696600cSBjoern A. Zeeb
1850696600cSBjoern A. Zeeb	for _md in ${_mdconfig2_list}; do
1860696600cSBjoern A. Zeeb		init_variables ${_md}
1870696600cSBjoern A. Zeeb		if [ "${_type}" = "vnode" ]; then
1880696600cSBjoern A. Zeeb			for i in `df ${_dev} 2>/dev/null`; do _mp=$i; done
1890696600cSBjoern A. Zeeb			if [ ! -r "${_file}" -o "${_fs}" = "/" ]; then
1900696600cSBjoern A. Zeeb				continue
1910696600cSBjoern A. Zeeb			fi
1920696600cSBjoern A. Zeeb			if [ -z "${_mp}" -o "${_mp}" != "${_mp%%%}" ]; then
1930696600cSBjoern A. Zeeb				echo "Device ${_dev} isn't mounted."
1940696600cSBjoern A. Zeeb			else
1950696600cSBjoern A. Zeeb				echo "Umounting ${_dev}."
1960696600cSBjoern A. Zeeb				umount ${_dev}
1970696600cSBjoern A. Zeeb			fi
1980696600cSBjoern A. Zeeb			if mdconfig -l -u ${_md} >/dev/null 2>&1; then
1990696600cSBjoern A. Zeeb				echo "Destroying ${_md}."
2000696600cSBjoern A. Zeeb				mdconfig -d -u ${_md}
2010696600cSBjoern A. Zeeb			fi
2020696600cSBjoern A. Zeeb		fi
2030696600cSBjoern A. Zeeb	done
2040696600cSBjoern A. Zeeb}
2050696600cSBjoern A. Zeeb
2060696600cSBjoern A. Zeeb_mdconfig2_cmd="$1"
2070696600cSBjoern A. Zeebif [ $# -gt 0 ]; then
2080696600cSBjoern A. Zeeb        shift
2090696600cSBjoern A. Zeebfi
2100696600cSBjoern A. Zeeb[ -n "$*" ] && _mdconfig2_list="$*"
2110696600cSBjoern A. Zeeb
2120696600cSBjoern A. Zeebload_rc_config $name
2130696600cSBjoern A. Zeeb
214*f99f0ee1SAlexander Leidinger# doesn't make sense to run in a svcj: config setting
215*f99f0ee1SAlexander Leidingermdconfig2_svcj="NO"
216*f99f0ee1SAlexander Leidinger
2170696600cSBjoern A. Zeebif [ -z "${_mdconfig2_list}" ]; then
2180696600cSBjoern A. Zeeb	for _mdconfig2_config in `list_vars mdconfig_md[0-9]\* |
2190696600cSBjoern A. Zeeb		sort_lite -nk1.12`
2200696600cSBjoern A. Zeeb	do
2210696600cSBjoern A. Zeeb		_mdconfig2_unit=${_mdconfig2_config#mdconfig_md}
2220696600cSBjoern A. Zeeb		[ "${_mdconfig2_unit#*[!0-9]}" = "$_mdconfig2_unit" ] ||
2230696600cSBjoern A. Zeeb			continue
2240696600cSBjoern A. Zeeb		_mdconfig2_list="$_mdconfig2_list md$_mdconfig2_unit"
2250696600cSBjoern A. Zeeb	done
2260696600cSBjoern A. Zeeb	_mdconfig2_list="${_mdconfig2_list# }"
2270696600cSBjoern A. Zeebfi
2280696600cSBjoern A. Zeeb
2290696600cSBjoern A. Zeebrun_rc_command "${_mdconfig2_cmd}"
230