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