xref: /freebsd/libexec/rc/rc.d/mdconfig2 (revision b11974c250671368e1eb869ca8ce2ed70622917f)
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# $FreeBSD$
280696600cSBjoern A. Zeeb#
290696600cSBjoern A. Zeeb
300696600cSBjoern A. Zeeb# PROVIDE: mdconfig2
310696600cSBjoern A. Zeeb# REQUIRE: mountcritremote
320696600cSBjoern A. Zeeb# BEFORE: SERVERS
330696600cSBjoern A. Zeeb
340696600cSBjoern A. Zeeb. /etc/rc.subr
350696600cSBjoern A. Zeeb
360696600cSBjoern A. Zeebname="mdconfig2"
370696600cSBjoern A. Zeebdesc="Create and control memory disks"
380696600cSBjoern A. Zeebstop_cmd="mdconfig2_stop"
390696600cSBjoern A. Zeebstart_cmd="mdconfig2_start"
400696600cSBjoern A. Zeebstart_precmd='[ -n "${_mdconfig2_list}" ]'
410696600cSBjoern A. Zeebrequired_modules="geom_md:g_md"
420696600cSBjoern A. Zeeb
430696600cSBjoern A. Zeebis_readonly()
440696600cSBjoern A. Zeeb{
450696600cSBjoern A. Zeeb	local _mp _ret
460696600cSBjoern A. Zeeb
470696600cSBjoern A. Zeeb	_mp=$1
480696600cSBjoern A. Zeeb	_ret=`mount | while read _line; do
490696600cSBjoern A. Zeeb		case ${_line} in
500696600cSBjoern A. Zeeb		*" ${_mp} "*read-only*)
510696600cSBjoern A. Zeeb			echo "yes"
520696600cSBjoern A. Zeeb			;;
530696600cSBjoern A. Zeeb
540696600cSBjoern A. Zeeb		*)
550696600cSBjoern A. Zeeb			;;
560696600cSBjoern A. Zeeb		esac;
570696600cSBjoern A. Zeeb	done`
580696600cSBjoern A. Zeeb
590696600cSBjoern A. Zeeb	if [ -n "${_ret}" ]; then
600696600cSBjoern A. Zeeb		return 0
610696600cSBjoern A. Zeeb	else
620696600cSBjoern A. Zeeb		return 1
630696600cSBjoern A. Zeeb	fi
640696600cSBjoern A. Zeeb}
650696600cSBjoern A. Zeeb
660696600cSBjoern A. Zeebinit_variables()
670696600cSBjoern A. Zeeb{
680696600cSBjoern A. Zeeb	local _i
690696600cSBjoern A. Zeeb
700696600cSBjoern A. Zeeb	_fs=""
710696600cSBjoern A. Zeeb	_mp=""
720696600cSBjoern A. Zeeb	_mounted="no"
730696600cSBjoern A. Zeeb	_dev="/dev/${_md}"
740696600cSBjoern A. Zeeb	eval _config=\$mdconfig_${_md}
750696600cSBjoern A. Zeeb	eval _owner=\$mdconfig_${_md}_owner
760696600cSBjoern A. Zeeb	eval _perms=\$mdconfig_${_md}_perms
770696600cSBjoern A. Zeeb	eval _files=\$mdconfig_${_md}_files
780696600cSBjoern A. Zeeb	eval _populate=\$mdconfig_${_md}_cmd
790696600cSBjoern A. Zeeb
800696600cSBjoern A. Zeeb	_type=${_config##*-t\ }
810696600cSBjoern A. Zeeb	_type=${_type%%\ *}
820696600cSBjoern A. Zeeb	if [ -z "${_type}" ]; then
830696600cSBjoern A. Zeeb		err 1 "You need to specify \"-t <type>\" in mdconfig_${_md}"
840696600cSBjoern A. Zeeb	fi
850696600cSBjoern A. Zeeb
860696600cSBjoern A. Zeeb	if [ "${_type}" = "vnode" ]; then
870696600cSBjoern A. Zeeb		_file=${_config##*-f\ }
880696600cSBjoern A. Zeeb		_file=${_file%%\ *}
890696600cSBjoern A. Zeeb		if [ -z "${_file}" ]; then
900696600cSBjoern A. Zeeb			err 2 "You need to specify \"-f <file>\" in mdconfig_${_md} for vnode devices"
910696600cSBjoern A. Zeeb		fi
920696600cSBjoern A. Zeeb
930696600cSBjoern A. Zeeb		if [ "${_file}" != "${_file%.uzip}" ]; then
940696600cSBjoern A. Zeeb			_dev="/dev/${_md}.uzip"
950696600cSBjoern A. Zeeb		fi
960696600cSBjoern A. Zeeb		for _i in `df ${_file} 2>/dev/null`; do _fs=${_i}; done
970696600cSBjoern A. Zeeb	fi
980696600cSBjoern A. Zeeb
990696600cSBjoern A. Zeeb	# Debugging help.
1000696600cSBjoern A. Zeeb	debug "${_md} config: ${_config}"
1010696600cSBjoern A. Zeeb	debug "${_md} type: ${_type}"
1020696600cSBjoern A. Zeeb	debug "${_md} dev: ${_dev}"
1030696600cSBjoern A. Zeeb	debug "${_md} file: ${_file}"
1040696600cSBjoern A. Zeeb	debug "${_md} fs: ${_fs}"
1050696600cSBjoern A. Zeeb	debug "${_md} owner: ${_owner}"
1060696600cSBjoern A. Zeeb	debug "${_md} perms: ${_perms}"
1070696600cSBjoern A. Zeeb	debug "${_md} files: ${_files}"
1080696600cSBjoern A. Zeeb	debug "${_md} populate cmd: ${_populate}"
1090696600cSBjoern A. Zeeb}
1100696600cSBjoern A. Zeeb
1110696600cSBjoern A. Zeebmdconfig2_start()
1120696600cSBjoern A. Zeeb{
1130696600cSBjoern A. Zeeb	local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate _fsck_cmd _i
1140696600cSBjoern A. Zeeb
1150696600cSBjoern A. Zeeb	for _md in ${_mdconfig2_list}; do
1160696600cSBjoern A. Zeeb		init_variables ${_md}
1170696600cSBjoern A. Zeeb		if [ ! -r ${_file} ]; then
1180696600cSBjoern A. Zeeb			err 3 "${_file} doesn't exist"
1190696600cSBjoern A. Zeeb			continue
1200696600cSBjoern A. Zeeb		fi
1210696600cSBjoern A. Zeeb		# First pass: create md(4) vnode devices from files stored on
1220696600cSBjoern A. Zeeb		# non-root partition. Swap and malloc md(4) devices have already
1230696600cSBjoern A. Zeeb		# been created.
1240696600cSBjoern A. Zeeb		if [ "${_type}" = "vnode" -a "${_fs}" != "/" ]; then
1250696600cSBjoern A. Zeeb			if [ "${_file}" != "${_file%.uzip}" ]; then
126*b11974c2SChris Rees				load_kld -m g_uzip geom_uzip || return 3
1270696600cSBjoern A. Zeeb			fi
1280696600cSBjoern A. Zeeb			if is_readonly ${_fs}; then
1290696600cSBjoern A. Zeeb				warn "${_fs} is mounted read-only, skipping ${_md}."
1300696600cSBjoern A. Zeeb				continue
1310696600cSBjoern A. Zeeb			fi
1320696600cSBjoern A. Zeeb			if mdconfig -l -u ${_md} >/dev/null 2>&1; then
1330696600cSBjoern A. Zeeb				err 3 "${_md} already exists"
1340696600cSBjoern A. Zeeb			fi
1350696600cSBjoern A. Zeeb			echo "Creating ${_md} device (${_type})."
1360696600cSBjoern A. Zeeb			if ! mdconfig -a ${_config} -u ${_md}; then
1370696600cSBjoern A. Zeeb				echo "Creating ${_md} device failed, moving on."
1380696600cSBjoern A. Zeeb				continue
1390696600cSBjoern A. Zeeb			fi
1400696600cSBjoern A. Zeeb			# Skip fsck for uzip devices.
1410696600cSBjoern A. Zeeb			if [ "${_file}" != "${_file%.uzip}" ]; then
1420696600cSBjoern A. Zeeb				_fsck_cmd=":"
1430696600cSBjoern A. Zeeb			elif checkyesno background_fsck; then
1440696600cSBjoern A. Zeeb				_fsck_cmd="fsck -F"
1450696600cSBjoern A. Zeeb			else
1460696600cSBjoern A. Zeeb				_fsck_cmd="fsck"
1470696600cSBjoern A. Zeeb			fi
1480696600cSBjoern A. Zeeb			if ! eval ${_fsck_cmd} -p ${_dev} >/dev/null; then
1490696600cSBjoern A. Zeeb				echo "Fsck failed on ${_dev}, not mounting the filesystem."
1500696600cSBjoern A. Zeeb				continue
1510696600cSBjoern A. Zeeb			fi
1520696600cSBjoern A. Zeeb			if mount -d ${_dev} >/dev/null 2>&1; then
1530696600cSBjoern A. Zeeb				echo "Mounting ${_dev}."
1540696600cSBjoern A. Zeeb				mount ${_dev}
1550696600cSBjoern A. Zeeb			fi
1560696600cSBjoern A. Zeeb		fi
1570696600cSBjoern A. Zeeb
1580696600cSBjoern A. Zeeb		for _i in `df ${_dev} 2>/dev/null`; do _mp=${_i}; done
1590696600cSBjoern A. Zeeb		if [ ! -z "${_mp}" -a "${_mp}" = "${_mp%%%}" ]; then
1600696600cSBjoern A. Zeeb			_mounted="yes"
1610696600cSBjoern A. Zeeb		fi
1620696600cSBjoern A. Zeeb
1630696600cSBjoern A. Zeeb		if checkyesno _mounted; then
1640696600cSBjoern A. Zeeb			# Second pass: change permissions and ownership.
1650696600cSBjoern A. Zeeb			[ -z "${_owner}" ] || chown -f ${_owner} ${_dev} ${_mp}
1660696600cSBjoern A. Zeeb			[ -z "${_perms}" ] || chmod -f ${_perms} ${_dev} ${_mp}
1670696600cSBjoern A. Zeeb
1680696600cSBjoern A. Zeeb			# Third pass: populate with foreign files.
1690696600cSBjoern A. Zeeb			if [ -n "${_files}" -o -n "${_populate}" ]; then
1700696600cSBjoern A. Zeeb				echo "Populating ${_dev}."
1710696600cSBjoern A. Zeeb			fi
1720696600cSBjoern A. Zeeb			if [ -n "${_files}" ]; then
1730696600cSBjoern A. Zeeb				cp -Rp ${_files} ${_mp}
1740696600cSBjoern A. Zeeb			fi
1750696600cSBjoern A. Zeeb			if [ -n "${_populate}" ]; then
1760696600cSBjoern A. Zeeb				eval ${_populate}
1770696600cSBjoern A. Zeeb			fi
1780696600cSBjoern A. Zeeb		fi
1790696600cSBjoern A. Zeeb	done
1800696600cSBjoern A. Zeeb}
1810696600cSBjoern A. Zeeb
1820696600cSBjoern A. Zeebmdconfig2_stop()
1830696600cSBjoern A. Zeeb{
1840696600cSBjoern A. Zeeb	local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate
1850696600cSBjoern A. Zeeb
1860696600cSBjoern A. Zeeb	for _md in ${_mdconfig2_list}; do
1870696600cSBjoern A. Zeeb		init_variables ${_md}
1880696600cSBjoern A. Zeeb		if [ "${_type}" = "vnode" ]; then
1890696600cSBjoern A. Zeeb			for i in `df ${_dev} 2>/dev/null`; do _mp=$i; done
1900696600cSBjoern A. Zeeb			if [ ! -r "${_file}" -o "${_fs}" = "/" ]; then
1910696600cSBjoern A. Zeeb				continue
1920696600cSBjoern A. Zeeb			fi
1930696600cSBjoern A. Zeeb			if [ -z "${_mp}" -o "${_mp}" != "${_mp%%%}" ]; then
1940696600cSBjoern A. Zeeb				echo "Device ${_dev} isn't mounted."
1950696600cSBjoern A. Zeeb			else
1960696600cSBjoern A. Zeeb				echo "Umounting ${_dev}."
1970696600cSBjoern A. Zeeb				umount ${_dev}
1980696600cSBjoern A. Zeeb			fi
1990696600cSBjoern A. Zeeb			if mdconfig -l -u ${_md} >/dev/null 2>&1; then
2000696600cSBjoern A. Zeeb				echo "Destroying ${_md}."
2010696600cSBjoern A. Zeeb				mdconfig -d -u ${_md}
2020696600cSBjoern A. Zeeb			fi
2030696600cSBjoern A. Zeeb		fi
2040696600cSBjoern A. Zeeb	done
2050696600cSBjoern A. Zeeb}
2060696600cSBjoern A. Zeeb
2070696600cSBjoern A. Zeeb_mdconfig2_cmd="$1"
2080696600cSBjoern A. Zeebif [ $# -gt 0 ]; then
2090696600cSBjoern A. Zeeb        shift
2100696600cSBjoern A. Zeebfi
2110696600cSBjoern A. Zeeb[ -n "$*" ] && _mdconfig2_list="$*"
2120696600cSBjoern A. Zeeb
2130696600cSBjoern A. Zeebload_rc_config $name
2140696600cSBjoern A. Zeeb
2150696600cSBjoern A. Zeebif [ -z "${_mdconfig2_list}" ]; then
2160696600cSBjoern A. Zeeb	for _mdconfig2_config in `list_vars mdconfig_md[0-9]\* |
2170696600cSBjoern A. Zeeb		sort_lite -nk1.12`
2180696600cSBjoern A. Zeeb	do
2190696600cSBjoern A. Zeeb		_mdconfig2_unit=${_mdconfig2_config#mdconfig_md}
2200696600cSBjoern A. Zeeb		[ "${_mdconfig2_unit#*[!0-9]}" = "$_mdconfig2_unit" ] ||
2210696600cSBjoern A. Zeeb			continue
2220696600cSBjoern A. Zeeb		_mdconfig2_list="$_mdconfig2_list md$_mdconfig2_unit"
2230696600cSBjoern A. Zeeb	done
2240696600cSBjoern A. Zeeb	_mdconfig2_list="${_mdconfig2_list# }"
2250696600cSBjoern A. Zeebfi
2260696600cSBjoern A. Zeeb
2270696600cSBjoern A. Zeebrun_rc_command "${_mdconfig2_cmd}"
228