version 0.30.210
[util-vserver.git] / util-vserver / scripts / start-vservers
index 182a8eb..6728437 100755 (executable)
@@ -19,7 +19,7 @@
 
 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
 test -e "$UTIL_VSERVER_VARS" || {
-    echo "Can not find util-vserver installation; aborting..." >&2
+    echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2
     exit 1
 }
 . "$UTIL_VSERVER_VARS"
@@ -31,7 +31,7 @@ function showHelp()
 {
     echo \
 $"Usage: $(basename $0) [-c <CFGDIR>] [-m <MARK>] [-j <NUM] [--test]
-             [--start|--stop] [--all] -- <name>+
+             [--start|--stop] [--all|--[un]marked|--running|--stopped] -- <name>+
 
 Please report bugs to $PACKAGE_BUGREPORT"
     exit 0
@@ -52,7 +52,27 @@ the GNU General Public License.  This program has absolutely no warranty."
 
 function verifyVserver()
 {
-    true
+    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
 }
 
 ###
@@ -60,12 +80,14 @@ function verifyVserver()
 set +e
 
 
-tmp=$(getopt -o c:j:m: --long debug,help,version,start,stop,test,all -n "$0" -- "$@") || exit 1
+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_ALL=
 OPTION_PARALLEL=99
 OPTION_DEBUG=
 NOOPTION_DEBUG=1
@@ -77,18 +99,18 @@ case "`basename $0`" in
 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;;
-       --all)          OPTION_ALL=1;;
-       --debug)        OPTION_DEBUG=1; NOOPTION_DEBUG=; set -x;;
-       --)             shift; break;;
-       *)              echo $"$0: internal error; arg=='$1'" >&2; exit 1;;
+       (--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
@@ -98,29 +120,24 @@ test -n "$OPTION_FLAVOR" || {
     exit 1
 }
 
-vservers=( "$@" )
-test -z  "$OPTION_ALL" || getAllVservers vservers
+vservers=( "$@" "${tmp_vservers[@]}" )
 
 orig_vservers=$vservers
 i=${#vservers[*]}
 
 while test $i -gt 0; do
     let --i
-    d=$CONFDIR/${vservers[$i]}/apps/init
+    d=$__CONFDIR/${vservers[$i]}/apps/init
     f=$d/mark
-    { test "$OPTION_MARK" -a -r "$f" && grep -qx "$OPTION_MARK" "$f"; } || \
+    { test -n "$OPTION_MARK" -a -r "$f" && grep -qx "$OPTION_MARK" "$f"; } || \
     { test -z "$OPTION_MARK" && test ! -e "$f"; } || \
     unset vservers[$i]
 done
 
-makedir=$(mktemp -d /tmp/vserver-init.XXXXXX)
-okfile=$(mktemp     /tmp/vserver-init.XXXXXX)
-passedfile=$(mktemp /tmp/vserver-init.XXXXXX)
-trap "rm -rf $makedir $resultfile $passedfile" EXIT
-
-defaulttty="$CONFDIR/.defaults/apps/init/tty"
-test -c "$defaulttty" || defaulttty=$(tty)
-test -c "$defaulttty" || defaulttty=/dev/null
+makedir=$($_MKTEMPDIR vserver-init.XXXXXX)
+okfile=$($_MKTEMP     vserver-init.XXXXXX)
+passedfile=$($_MKTEMP vserver-init.XXXXXX)
+trap "$_RM -rf $makedir $resultfile $passedfile" EXIT
 
 test_cmd=false
 case "$OPTION_FLAVOR" in
@@ -130,49 +147,48 @@ esac
 
 {
     cat <<EOF
-TTY = ${defaulttty}
 .%.stamp:
 ${TAB}$test_cmd || { \
 ${TAB}echo -n '.' >>$passedfile ; \
-${TAB}$_VSERVER --sync ${OPTION_DEBUG:+--debug} "\$*" ${OPTION_FLAVOR} >\$(TTY) 2>\$(TTY) <\$(TTY) ; }
+${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
+    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
-    test ! -e $d/tty || {
-       echo -e ".$vserver.stamp:\tTTY=$d/tty" >>$makedir/Makefile
-    }
+    verifyVserver "$vserver" || continue
+    d="$__CONFDIR/$vserver"/apps/init
 
     case "$OPTION_FLAVOR" in
-       start)
+       (start)
            if test -e "$d"/depends; then
                echo -ne ".$vserver.stamp:\t"
                cat "$d"/depends | while read dep; do
-                   verifyVserver "$dep"
+                   verifyVserver "$dep" "$d"/depends || continue
                    echo -n ".$dep.stamp "
                done
                echo
            fi >>$makedir/Makefile
            ;;
-       stop)
+       (stop)
            if test -e "$d"/depends; then
                cat "$d"/depends | while read dep; do
-                   verifyVserver "$dep"
-                   echo -ne ".$dep.stamp:\t.$vserver.stamp"
+                   verifyVserver "$dep" "$d"/depends || continue
+                   echo -e ".$dep.stamp:\t.$vserver.stamp"
                done
                echo
            fi >>$makedir/Makefile
@@ -182,7 +198,7 @@ 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
+test  -s "$passedfile"           || exit 0
+test  -s "$okfile"               || exit 1
+$_CMP -s "$passedfile" "$okfile" || exit 2
 exit 0