xref: /dragonfly/etc/rc.d/vkernel (revision ce083385)
12feb07f7SSascha Wildner#!/bin/sh
22feb07f7SSascha Wildner
32feb07f7SSascha Wildner# PROVIDE: vkernel
4*ce083385SAaron LI# REQUIRE: LOGIN
52feb07f7SSascha Wildner
62feb07f7SSascha Wildner. /etc/rc.subr
72feb07f7SSascha Wildner
82feb07f7SSascha Wildnername="vkernel"
92feb07f7SSascha Wildnerrcvar=`set_rcvar`
1032733d8dSAntonio Huete Jimenez
112feb07f7SSascha Wildnerstart_cmd="vkernel_start"
122feb07f7SSascha Wildnerstop_cmd="vkernel_stop"
132feb07f7SSascha Wildner
142feb07f7SSascha Wildnervkernel_start()
152feb07f7SSascha Wildner{
162feb07f7SSascha Wildner	echo -n 'Starting virtual kernels:'
172feb07f7SSascha Wildner	for _vkernel in ${vkernel_list}
182feb07f7SSascha Wildner	do
192b1d5679SAntonio Huete Jimenez		# Start with a clean set of variables
204ade232dSAntonio Huete Jimenez		unset pidfile bin memsize rootimgs ifaces logfile flags
214ade232dSAntonio Huete Jimenez		unset vkuser vkgroup memimg
2232733d8dSAntonio Huete Jimenez
2332733d8dSAntonio Huete Jimenez		# Configure user to run vkernel
2432733d8dSAntonio Huete Jimenez		eval vkuser=\"\${vkernel_${_vkernel}_user}\"
2532733d8dSAntonio Huete Jimenez		if [ -z "${vkuser}" ]; then
2632733d8dSAntonio Huete Jimenez		    vkuser="root"
2732733d8dSAntonio Huete Jimenez		    vkgroup="wheel"
2832733d8dSAntonio Huete Jimenez		else
2932733d8dSAntonio Huete Jimenez		    vkgroup=$(id -ng ${vkuser})
3032733d8dSAntonio Huete Jimenez		fi
31e9597feaSAntonio Huete Jimenez
322feb07f7SSascha Wildner		# Check if already running
332feb07f7SSascha Wildner		eval pidfile="/var/run/vkernel.${_vkernel}.pid"
34db511d28SRumko		if [ -f "${pidfile}" ]; then
35db511d28SRumko			eval pid=`cat ${pidfile}`
36ef42da70SSascha Wildner			if [ ! -z "${pid}" -a ! -z "`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'`" ]; then
372feb07f7SSascha Wildner				echo
382b1d5679SAntonio Huete Jimenez				warn "vkernel ${_vkernel} already running? (check ${pidfile})"
392feb07f7SSascha Wildner				continue
402feb07f7SSascha Wildner			fi
4132733d8dSAntonio Huete Jimenez		else
4232733d8dSAntonio Huete Jimenez			# Regular users do not have write access in /var/run
4332733d8dSAntonio Huete Jimenez			install -c -o ${vkuser} -g ${vkgroup} /dev/null ${pidfile}
44db511d28SRumko		fi
452feb07f7SSascha Wildner
462feb07f7SSascha Wildner		# Configure vkernel binary
472feb07f7SSascha Wildner		eval _bin=\"\${vkernel_${_vkernel}_bin}\"
482feb07f7SSascha Wildner		if [ -z "${_bin}" -o ! -x "${_bin}" ]; then
492214b591SRumko			eval _bin=\"\${vkernel_bin}\"
502214b591SRumko			if [ -z "${_bin}" -o ! -x "${_bin}" ]; then
512feb07f7SSascha Wildner				echo
522feb07f7SSascha Wildner				warn "Missing or undefined binary for vkernel '${_vkernel}'. Skipping."
532feb07f7SSascha Wildner				continue
542feb07f7SSascha Wildner			fi
552214b591SRumko		fi
562214b591SRumko		bin=${_bin}
572feb07f7SSascha Wildner
582feb07f7SSascha Wildner		# Configure vkernel memory
592feb07f7SSascha Wildner		eval _memsize=\"\$vkernel_${_vkernel}_memsize\"
602feb07f7SSascha Wildner		if [ -z "${_memsize}" ]; then
612feb07f7SSascha Wildner			echo
622feb07f7SSascha Wildner			warn "No memsize has been defined for vkernel '${_vkernel}'. Skipping."
632feb07f7SSascha Wildner			continue
642feb07f7SSascha Wildner		else
652feb07f7SSascha Wildner			memsize="-m ${_memsize}"
662feb07f7SSascha Wildner		fi
672feb07f7SSascha Wildner
684ade232dSAntonio Huete Jimenez		# Configure vkernel memory image file
694ade232dSAntonio Huete Jimenez		eval _memimg=\"\${vkernel_${_vkernel}_memimg}\"
704ade232dSAntonio Huete Jimenez		if [ -z "${_memimg}" ]; then
714ade232dSAntonio Huete Jimenez			mkdir -m 1777 -p /var/vkernel
724ade232dSAntonio Huete Jimenez
734ade232dSAntonio Huete Jimenez			for n in $(seq 0 999999)
744ade232dSAntonio Huete Jimenez			do
754ade232dSAntonio Huete Jimenez				eval _memf=$(printf "/var/vkernel/memimg.%06s" ${n})
764ade232dSAntonio Huete Jimenez				if [ ! -f "${_memf}" ]
774ade232dSAntonio Huete Jimenez				then
784ade232dSAntonio Huete Jimenez					memimg=" -i ${_memf}"
794ade232dSAntonio Huete Jimenez					break
804ade232dSAntonio Huete Jimenez				else
814ade232dSAntonio Huete Jimenez					if lockf -kst 0 ${_memf} echo >/dev/null
824ade232dSAntonio Huete Jimenez					then
834ade232dSAntonio Huete Jimenez						# Test if memimg is writable by vkuser
844ade232dSAntonio Huete Jimenez						su - ${vkuser} -c "test -w ${_memf}"
854ade232dSAntonio Huete Jimenez						if [ $? -eq 0 ]
864ade232dSAntonio Huete Jimenez						then
874ade232dSAntonio Huete Jimenez							memimg="-i ${_memf}"
884ade232dSAntonio Huete Jimenez							break
894ade232dSAntonio Huete Jimenez						fi
904ade232dSAntonio Huete Jimenez					fi
914ade232dSAntonio Huete Jimenez				fi
924ade232dSAntonio Huete Jimenez			done
934ade232dSAntonio Huete Jimenez		else
944ade232dSAntonio Huete Jimenez			memimg="-i ${_memimg}"
954ade232dSAntonio Huete Jimenez		fi
964ade232dSAntonio Huete Jimenez
972feb07f7SSascha Wildner		# Configure vkernel root image(s)
982feb07f7SSascha Wildner		eval _rootimgs=\"\${vkernel_${_vkernel}_rootimg_list}\"
992feb07f7SSascha Wildner		if [ -z "${_rootimgs}" ]; then
1002feb07f7SSascha Wildner			echo
1012214b591SRumko			warn "No root image has been defined for vkernel '${_vkernel}'."
1022feb07f7SSascha Wildner		else
1032feb07f7SSascha Wildner			for _rootimg in ${_rootimgs}
1042feb07f7SSascha Wildner			do
1052feb07f7SSascha Wildner				eval rootimgs=\"${rootimgs} -r ${_rootimg}\"
1062feb07f7SSascha Wildner			done
1072feb07f7SSascha Wildner		fi
1082feb07f7SSascha Wildner
1092feb07f7SSascha Wildner		# Configure optional vkernel network interface(s)
1102feb07f7SSascha Wildner		eval _ifaces=\"\${vkernel_${_vkernel}_iface_list}\"
1112feb07f7SSascha Wildner		if [ -n "${_ifaces}" ]; then
1122feb07f7SSascha Wildner			for _iface in ${_ifaces}
1132feb07f7SSascha Wildner			do
1142feb07f7SSascha Wildner				eval ifaces=\"${ifaces} -I ${_iface}\"
1152feb07f7SSascha Wildner			done
1162feb07f7SSascha Wildner		fi
1172feb07f7SSascha Wildner
1182feb07f7SSascha Wildner		# Configure optional console logfile
1192feb07f7SSascha Wildner		eval logfile=\"\${vkernel_${_vkernel}_logfile}\"
1202feb07f7SSascha Wildner		[ -z "${logfile}" ] && logfile="/dev/null"
1212feb07f7SSascha Wildner
1222feb07f7SSascha Wildner		# Configure optional flags
1232feb07f7SSascha Wildner		eval flags=\"\${vkernel_${_vkernel}_flags}\"
1242feb07f7SSascha Wildner
1254ade232dSAntonio Huete Jimenez		eval "daemon -u ${vkuser} ${bin} ${memsize} ${rootimgs} " \
1264ade232dSAntonio Huete Jimenez		     "${memimg} ${ifaces} ${flags} -p ${pidfile}" \
1274ade232dSAntonio Huete Jimenez		     ">>${logfile} 2>&1 </dev/null"
1282feb07f7SSascha Wildner		echo -n " ${_vkernel}"
1292feb07f7SSascha Wildner	done
1302feb07f7SSascha Wildner	echo '.'
1312feb07f7SSascha Wildner}
1322feb07f7SSascha Wildner
1332feb07f7SSascha Wildnervkernel_stop()
1342feb07f7SSascha Wildner{
1352feb07f7SSascha Wildner	for _vkernel in ${vkernel_list}
1362feb07f7SSascha Wildner	do
1372feb07f7SSascha Wildner		eval pidfile="/var/run/vkernel.${_vkernel}.pid"
1382feb07f7SSascha Wildner		if [ -f "${pidfile}" ]; then
1392feb07f7SSascha Wildner			eval pid=`cat ${pidfile}`
1402feb07f7SSascha Wildner		fi
1412feb07f7SSascha Wildner		if [ -z "${pid}" ]; then
1422feb07f7SSascha Wildner			warn "vkernel '${_vkernel}' not running?"
1437c53feedSRumko			continue
1447c53feedSRumko		fi
1452feb07f7SSascha Wildner		eval kill -TERM ${pid}
1467c53feedSRumko
1477c53feedSRumko		eval _kill_timeout=\"\${vkernel_${_vkernel}_kill_timeout}\"
1487c53feedSRumko		if [ -z "${_kill_timeout}" ]; then
1497c53feedSRumko			eval _kill_timeout=\"\${vkernel_kill_timeout}\"
1507c53feedSRumko			if [ -z "${_kill_timeout}" ]; then
1517c53feedSRumko				_kill_timeout=60
1527c53feedSRumko			fi
1537c53feedSRumko		fi
1547c53feedSRumko
1557c53feedSRumko		# Check that the vkernel ended properly
1567c53feedSRumko		cnt=1
157ef42da70SSascha Wildner		eval temp_pid=`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'`
1587c53feedSRumko		while [ ! -z "${temp_pid}" -a "${cnt}" -lt "${_kill_timeout}" ]; do
159ef42da70SSascha Wildner			eval temp_pid=`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'`
1607c53feedSRumko			cnt=`expr $cnt + 1`
1617c53feedSRumko			sleep 1
1627c53feedSRumko		done
1637c53feedSRumko
1647c53feedSRumko		if [ ! -z "${temp_pid}" ]; then
1657c53feedSRumko			eval kill -KILL ${pid}
1667c53feedSRumko			warn "'${_vkernel}' had to be forcefully killed."
1672feb07f7SSascha Wildner		fi
1682feb07f7SSascha Wildner	done
1692feb07f7SSascha Wildner}
1702feb07f7SSascha Wildner
1712feb07f7SSascha Wildnerload_rc_config $name
1722feb07f7SSascha Wildnerrun_rc_command "$1"
173