#! /bin/bash # Copyright (C) 2004 Enrico Scholz # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Usage: start-vservers [-c ] [-m ] [-j ] [--start|--stop|--status|--condrestart|--restart] [--test] [--all] [--debug] -- + : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars} test -e "$UTIL_VSERVER_VARS" || { echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2 exit 1 } . "$UTIL_VSERVER_VARS" . "$_LIB_FUNCTIONS" ### Some local functions function showHelp() { echo \ $"Usage: $(basename $0) [-c ] [-m ] [-j + Please report bugs to $PACKAGE_BUGREPORT" exit 0 } function showVersion() { echo \ $"start-vserver $PACKAGE_VERSION -- starts/stops a bunch of vservers This program is part of $PACKAGE_STRING Copyright (C) 2004 Enrico Scholz This program is free software; you may redistribute it under the terms of the GNU General Public License. This program has absolutely no warranty." exit 0 } function verifyVserver() { local xtra="${2:+ mentioned in '$2'}" case x$1 in (x\#*|x) return 1;; # skip empty and comment lines ($__CONFDIR/*) warning "This version of 'start-vservers' supports only short vserver names; try to remove the '$__CONFDIR' from '$1'$xtra" return 1 ;; (/*) warning "This version of 'start-vservers' supports only short vserver names; '$1'$xtra is not possible" return 1 ;; (*) $_VSERVER_INFO -q "$__CONFDIR/$1" VDIR || { warning "Vserver '$1'$xtra does not exist; skipping it..." return 1; } ;; esac return 0 } ### set +e tmp=$(getopt -o c:j:m: \ --long debug,help,version,start,stop,test,$VS_ALLVSERVERS_ARGS \ -n "$0" -- "$@") || exit 1 eval set -- "$tmp" declare -a tmp_vservers=() declare -r TAB=$(echo -en "\t") OPTION_MARK= OPTION_MARK_ANY=1 OPTION_PARALLEL=99 OPTION_DEBUG= NOOPTION_DEBUG=1 case "`basename $0`" in start-*) OPTION_FLAVOR=start;; stop-*) OPTION_FLAVOR=stop;; *) OPTION_FLAVOR=;; esac while true; do getAllVserversByArg tmp_vservers "$1" || \ case "$1" in (--help) showHelp $0 ;; (--version) showVersion $0 ;; (-c) CONFDIR=$2; shift;; (-m) OPTION_MARK=$2; OPTION_MARK_ANY=; shift;; (-j) OPTION_PARALLEL=$2; shift;; (--start) OPTION_FLAVOR=start;; (--stop) OPTION_FLAVOR=stop;; (--debug) OPTION_DEBUG=1; NOOPTION_DEBUG=; set -x;; (--) shift; break;; (*) echo $"$0: internal error; arg=='$1'" >&2; exit 1;; esac shift done test -n "$OPTION_FLAVOR" || { echo "$0: unknown invocation method; aborting..." >&2 exit 1 } vservers=( "$@" "${tmp_vservers[@]}" ) orig_vservers=$vservers i=${#vservers[*]} while test $i -gt 0; do let --i d=$__CONFDIR/${vservers[$i]}/apps/init f=$d/mark { test -n "$OPTION_MARK_ANY"; } || \ { test -n "$OPTION_MARK" -a -r "$f" && grep -qx "$OPTION_MARK" "$f"; } || \ { test -z "$OPTION_MARK" && test ! -e "$f"; } || \ unset vservers[$i] done makedir=$($_MKTEMPDIR vserver-init.XXXXXX) okfile=$($_MKTEMP vserver-init.XXXXXX) passedfile=$($_MKTEMP vserver-init.XXXXXX) trap "$_RM -rf $makedir $okfile $passedfile" EXIT test_cmd=false case "$OPTION_FLAVOR" in start) test_cmd="${_VSERVER} --silent '\$*' status";; stop) test_cmd="! ${_VSERVER} --silent '\$*' status";; esac { cat <>$passedfile ; \ ${TAB}$_VSERVER --defaulttty --sync ${OPTION_DEBUG:+--debug} "\$*" ${OPTION_FLAVOR}; } ${TAB}echo -n '.' >>$okfile ${TAB}@touch "\$@" EOF echo -ne "all:\t" for i in "${vservers[@]}"; do verifyVserver "$i" || continue echo -n ".$i.stamp " done echo } >$makedir/Makefile for i in "${vservers[@]}"; do d="$__CONFDIR/$i"/apps/init echo "$i" test -e "$d"/depends || continue cat "$d"/depends done | sort -u | while read vserver; do verifyVserver "$vserver" || continue d="$__CONFDIR/$vserver"/apps/init case "$OPTION_FLAVOR" in (start) if test -e "$d"/depends; then echo -ne ".$vserver.stamp:\t" cat "$d"/depends | while read dep; do verifyVserver "$dep" "$d"/depends || continue echo -n ".$dep.stamp " done echo fi >>$makedir/Makefile ;; (stop) if test -e "$d"/depends; then cat "$d"/depends | while read dep; do verifyVserver "$dep" "$d"/depends || continue echo -e ".$dep.stamp:\t.$vserver.stamp" done echo fi >>$makedir/Makefile esac done #cat $makedir/Makefile make -k ${NOOPTION_DEBUG:+-s} ${OPTION_PARALLEL:+-j$OPTION_PARALLEL} -C $makedir test -s "$passedfile" || exit 0 test -s "$okfile" || exit 1 $_CMP -s "$passedfile" "$okfile" || exit 2 exit 0