xref: /dragonfly/etc/rc.d/vkernel (revision ce0833857e05eba4d13f3fd8a4d049ea68c5ffa4)
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