X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=scripts%2Fstart-vservers;fp=scripts%2Fstart-vservers;h=f35bf1337251a193ac463bad4b2a1251d2d841f8;hb=8cf13bb177d92c93eb73dc8939777150536c2d00;hp=0000000000000000000000000000000000000000;hpb=6bf3f95de36c804c97716b2d0bdf10680c559044;p=util-vserver.git diff --git a/scripts/start-vservers b/scripts/start-vservers new file mode 100755 index 0000000..f35bf13 --- /dev/null +++ b/scripts/start-vservers @@ -0,0 +1,181 @@ +#! /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() +{ + true +} + +### + +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_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; 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" -a -r "$f" && grep -qx "$OPTION_MARK" "$f"; } || \ + { test -z "$OPTION_MARK" && test ! -e "$f"; } || \ + unset vservers[$i] +done + +makedir=$($_MKTEMPDIR /tmp/vserver-init.XXXXXX) +okfile=$($_MKTEMP /tmp/vserver-init.XXXXXX) +passedfile=$($_MKTEMP /tmp/vserver-init.XXXXXX) +trap "$_RM -rf $makedir $resultfile $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 + 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 + 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" + 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" + echo -ne ".$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