3 # Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; version 2 of the License.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 # $VSERVER_DIR ... path to vserver-cfg dir
20 # $VSERVER_NAME ... name of vserver
22 declare -a NICE_CMD=()
23 declare -a CHBIND_OPTS=()
24 declare -a CAP_OPTS=()
25 declare -a CHCONTEXT_FLAG_OPTS=()
26 declare -a CHCONTEXT_OPTS=()
27 declare -a CAPCHROOT_OPTS=()
28 declare -a INTERFACES=()
29 declare -a START_CMD=()
35 function _generateInterfaceList
41 for iface in "$VSERVER_DIR/interfaces/"*; do
42 test -d "$iface" || continue
43 test ! -e "$iface"/disabled || continue
45 _getInterfaceValue ip '' "$iface"
46 _getInterfaceValue mask '' "$iface" "$iface/.."
47 _getInterfaceValue prefix '' "$iface" "$iface/.."
49 _transformMask2Prefix prefix "$prefix" "$mask"
51 INTERFACES=( "${INTERFACES[@]}" "$ip${prefix:+/$prefix}" )
55 function _generateChbindOptions
61 local f=$vdir/interfaces/bcast
62 test ! -e "$f" || read bcast <"$f"
64 CHBIND_OPTS=( $SILENT_OPT ${bcast:+--bcast "$bcast"} )
66 for i in "${INTERFACES[@]}"; do
67 CHBIND_OPTS=( "${CHBIND_OPTS[@]}" --ip "$i" )
71 function _generateNiceCommand
76 test -e "$vdir/nice" || return 0;
77 read nice <"$vdir"/nice
79 NICE_CMD=( $_NICE -$nice )
82 function _generateCapabilityOptions
87 test -e "$vdir"/capabilities || return 0
96 CAP_OPTS=( "${CAP_OPTS[@]}" --cap "$cap" )
97 CAPCHROOT_OPTS=( "${CAPCHROOT_OPTS[@]}" --nochroot )
100 CAP_OPTS=( "${CAP_OPTS[@]}" --cap "$cap" );;
102 done <"$vdir"/capabilities
105 function _generateFlagOptions
109 CHCONTEXT_FLAG_OPTS=()
111 ## TODO: get_initdefault
112 START_CMD=( /etc/rc.d/rc "$RUNLEVEL" )
113 test ! -x "$vdir/etc/init.d/rc" || {
114 START_CMD=( /etc/init.d/rc "$RUNLEVEL" )
117 test -e "$vdir"/flags || return 0
124 CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}" \
125 --disconnect --flag --fakeinit )
128 START_CMD=( /sbin/minit-start )
131 *) START_CMD=( /sbin/init );;
135 CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}"
142 function _generateChcontextOptions
145 local ctx hostname domainname
150 read ctx <"$vdir"/context
151 read hostname <"$vdir"/hostname
152 read domainname <"$vdir"/domainname
155 _generateCapabilityOptions "$vdir"
156 _generateFlagOptions "$vdir"
158 CHCONTEXT_OPTS=( $SILENT_OPT \
159 "${CHCONTEXT_FLAG_OPTS[@]}" \
162 ${ctx:+--ctx "$ctx"} \
163 ${hostname:+--hostname "$hostname"} \
164 ${domainname:+--domainname "$domainname"} )
167 function _getInterfaceValue
177 read tmp <"$i/$val" && break || :
180 eval $val=${tmp:-$dflt}
183 function _transformMask2Prefix
188 $_MASK2PREFIX "$3" || tmp=$?
195 function enableSingleInterface
207 _getInterfaceValue ip '' "$iface"
208 _getInterfaceValue dev '' "$iface" "$iface/.."
209 _getInterfaceValue prefix '' "$iface" "$iface/.."
210 _getInterfaceValue mask '' "$iface" "$iface/.."
211 _getInterfaceValue bcast '' "$iface" "$iface/.."
212 _getInterfaceValue name '' "$iface"
213 _getInterfaceValue scope '' "$iface" "$iface/.."
215 test "$ip" || { echo $"Can not read ip for '$iface'"; return 1; }
217 test ! -e "$iface"/only_ip || unset dev
220 _transformMask2Prefix prefix "$prefix" "$mask"
224 test -d /proc/net/vlan || {
225 echo -e $"VLAN device-name used, but vlan subsystem not enabled.\nTry to execute 'modprobe 8021q' before starting the vservers"
228 test -f /proc/net/vlan || {
229 $_VCONFIG add ${dev/./ }
230 $_IP addr add 127.0.0.1/8 broadcast 127.255.255.255 dev "$dev"
231 $_IP link set "$dev" up
236 $_IP addr add "$ip${prefix:+/$prefix}" broadcast ${bcast:-+} \
237 ${name:+label "$dev:$name"} dev "$dev"
238 $_IP route add "$ip""${prefix:+/$prefix}" dev "$dev"
239 $_IP link set "$dev" up
243 function enableInterfaces
246 local VSERVER_NAME=$2
251 for iface in "$VSERVER_DIR/interfaces/"*; do
252 test -d "$iface" || continue
253 test ! -e "$iface"/disabled || continue
255 enableSingleInterface "$iface"
264 pushd "$vdir/vdir" >/dev/null
267 { find var/run ! -type d -print0; \
268 find var/lock ! -type d -print0; } | xargs -0r $_CHROOT_RM
269 $_FAKE_RUNLEVEL "$RUNLEVEL" /var/run/utmp
277 function generateOptions
279 _generateInterfaceList "$1"
280 _generateChbindOptions "$1"
281 _generateNiceCommand "$1"
282 _generateChcontextOptions "$1"
285 function mountVserver
289 local src dst type opts aux
294 test -e "$cfgdir"/fstab || return 0
295 $_CHBIND "${CHBIND_OPTS[@]}" \
296 $_SECURE_MOUNT -a --chroot "$vdir" --fstab "$cfgdir"/fstab
299 function execScriptlets
306 for i in "$vdir/scripts/$flavor" "$vdir/scripts/$flavor.d"/*; do
307 test -f "$i" -a -x "$i" || continue
308 "$i" "$flavor" "$name"
312 ############################################
314 : ${VSERVER_NAME:=$(basename "$VSERVER_DIR")}
316 if test -e "$VSERVER_DIR"/noisy; then
319 SILENT_OPT='--silent'
322 if isVserverRunning "$VSERVER_DIR"; then
323 echo $"vserver '$VSERVER_NAME' already running; aborting..."
327 execScriptlets "$VSERVER_DIR" "$VSERVER_NAME" prepre-start
328 generateOptions "$VSERVER_DIR"
329 enableInterfaces "$VSERVER_DIR" "$VSERVER_NAME"
331 mountVserver "$VSERVER_DIR"
332 prepareInit "$VSERVER_DIR" "$INITSTYLE"
334 cd "$VSERVER_DIR"/vdir/
336 execScriptlets "$VSERVER_DIR" "$VSERVER_NAME" pre-start
339 "$_CHBIND" "${CHBIND_OPTS[@]}" \
340 "$_CHCONTEXT" "${CHCONTEXT_OPTS[@]}" \
341 "$_SAVE_CTXINFO" "$VSERVER_DIR" \
342 "$_CAPCHROOT" "${CAPCHROOT_OPTS[@]}" . "${START_CMD[@]}"
344 execScriptlets "$VSERVER_DIR" "$VSERVER_NAME" post-start