xref: /dragonfly/etc/rc.d/vkernel (revision 9348a738)
1#!/bin/sh
2#
3
4# PROVIDE: vkernel
5# REQUIRE: LOGIN NETWORKING
6
7. /etc/rc.subr
8
9name="vkernel"
10rcvar=`set_rcvar`
11
12start_cmd="vkernel_start"
13stop_cmd="vkernel_stop"
14
15vkernel_start()
16{
17	echo -n 'Starting virtual kernels:'
18	for _vkernel in ${vkernel_list}
19	do
20		# Start with a clean set of variables
21		unset pidfile bin memsize rootimgs ifaces logfile flags
22		unset vkuser vkgroup memimg
23
24		# Configure user to run vkernel
25		eval vkuser=\"\${vkernel_${_vkernel}_user}\"
26		if [ -z "${vkuser}" ]; then
27		    vkuser="root"
28		    vkgroup="wheel"
29		else
30		    vkgroup=$(id -ng ${vkuser})
31		fi
32
33		# Check if already running
34		eval pidfile="/var/run/vkernel.${_vkernel}.pid"
35		if [ -f "${pidfile}" ]; then
36			eval pid=`cat ${pidfile}`
37			if [ ! -z "${pid}" -a ! -z "`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'`" ]; then
38				echo
39				warn "vkernel ${_vkernel} already running? (check ${pidfile})"
40				continue
41			fi
42		else
43			# Regular users do not have write access in /var/run
44			install -c -o ${vkuser} -g ${vkgroup} /dev/null ${pidfile}
45		fi
46
47		# Configure vkernel binary
48		eval _bin=\"\${vkernel_${_vkernel}_bin}\"
49		if [ -z "${_bin}" -o ! -x "${_bin}" ]; then
50			eval _bin=\"\${vkernel_bin}\"
51			if [ -z "${_bin}" -o ! -x "${_bin}" ]; then
52				echo
53				warn "Missing or undefined binary for vkernel '${_vkernel}'. Skipping."
54				continue
55			fi
56		fi
57		bin=${_bin}
58
59		# Configure vkernel memory
60		eval _memsize=\"\$vkernel_${_vkernel}_memsize\"
61		if [ -z "${_memsize}" ]; then
62			echo
63			warn "No memsize has been defined for vkernel '${_vkernel}'. Skipping."
64			continue
65		else
66			memsize="-m ${_memsize}"
67		fi
68
69		# Configure vkernel memory image file
70		eval _memimg=\"\${vkernel_${_vkernel}_memimg}\"
71		if [ -z "${_memimg}" ]; then
72			mkdir -m 1777 -p /var/vkernel
73
74			for n in $(seq 0 999999)
75			do
76				eval _memf=$(printf "/var/vkernel/memimg.%06s" ${n})
77				if [ ! -f "${_memf}" ]
78				then
79					memimg=" -i ${_memf}"
80					break
81				else
82					if lockf -kst 0 ${_memf} echo >/dev/null
83					then
84						# Test if memimg is writable by vkuser
85						su - ${vkuser} -c "test -w ${_memf}"
86						if [ $? -eq 0 ]
87						then
88							memimg="-i ${_memf}"
89							break
90						fi
91					fi
92				fi
93			done
94		else
95			memimg="-i ${_memimg}"
96		fi
97
98		# Configure vkernel root image(s)
99		eval _rootimgs=\"\${vkernel_${_vkernel}_rootimg_list}\"
100		if [ -z "${_rootimgs}" ]; then
101			echo
102			warn "No root image has been defined for vkernel '${_vkernel}'."
103		else
104			for _rootimg in ${_rootimgs}
105			do
106				eval rootimgs=\"${rootimgs} -r ${_rootimg}\"
107			done
108		fi
109
110		# Configure optional vkernel network interface(s)
111		eval _ifaces=\"\${vkernel_${_vkernel}_iface_list}\"
112		if [ -n "${_ifaces}" ]; then
113			for _iface in ${_ifaces}
114			do
115				eval ifaces=\"${ifaces} -I ${_iface}\"
116			done
117		fi
118
119		# Configure optional console logfile
120		eval logfile=\"\${vkernel_${_vkernel}_logfile}\"
121		[ -z "${logfile}" ] && logfile="/dev/null"
122
123		# Configure optional flags
124		eval flags=\"\${vkernel_${_vkernel}_flags}\"
125
126		eval "daemon -u ${vkuser} ${bin} ${memsize} ${rootimgs} " \
127		     "${memimg} ${ifaces} ${flags} -p ${pidfile}" \
128		     ">>${logfile} 2>&1 </dev/null"
129		echo -n " ${_vkernel}"
130	done
131	echo '.'
132}
133
134vkernel_stop()
135{
136	for _vkernel in ${vkernel_list}
137	do
138		eval pidfile="/var/run/vkernel.${_vkernel}.pid"
139		if [ -f "${pidfile}" ]; then
140			eval pid=`cat ${pidfile}`
141		fi
142		if [ -z "${pid}" ]; then
143			warn "vkernel '${_vkernel}' not running?"
144			continue
145		fi
146		eval kill -TERM ${pid}
147
148		eval _kill_timeout=\"\${vkernel_${_vkernel}_kill_timeout}\"
149		if [ -z "${_kill_timeout}" ]; then
150			eval _kill_timeout=\"\${vkernel_kill_timeout}\"
151			if [ -z "${_kill_timeout}" ]; then
152				_kill_timeout=60
153			fi
154		fi
155
156		# Check that the vkernel ended properly
157		cnt=1
158		eval temp_pid=`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'`
159		while [ ! -z "${temp_pid}" -a "${cnt}" -lt "${_kill_timeout}" ]; do
160			eval temp_pid=`ps axwwp ${pid} | grep -wE "^[ ]*${pid}" | grep -v grep | awk '{print $1}'`
161			cnt=`expr $cnt + 1`
162			sleep 1
163		done
164
165		if [ ! -z "${temp_pid}" ]; then
166			eval kill -KILL ${pid}
167			warn "'${_vkernel}' had to be forcefully killed."
168		fi
169	done
170}
171
172
173load_rc_config $name
174run_rc_command "$1"
175