added support for new migrate feature
[util-vserver.git] / util-vserver / scripts / vserver
index 21b8d52..817d835 100755 (executable)
@@ -18,9 +18,9 @@
 
 # set -e
 
-: ${UTIL_VSERVER_VARS:=$(dirname $0)/util-vserver-vars}
+: ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
 test -e "$UTIL_VSERVER_VARS" || {
-    echo "Can not find util-vserver installation; aborting..."
+    echo "Can not find util-vserver installation; aborting..." >&2
     exit 1
 }
 . "$UTIL_VSERVER_VARS"
@@ -31,14 +31,16 @@ test -e "$UTIL_VSERVER_VARS" || {
 function showHelp()
 {
     echo \
-$"Usage: $(basename $0) [-s|--sync] [-v|--verbose]
+$"Usage: $(basename $0) [-s|--sync] [-v|--verbose] [--silent]
              [--] <vserver> <command> <args>*
 
 <vserver> is the name of a vserver.
 
 Possible commands are:
-    start       ... starts the specified vserver
-    stop        ... stops the specified vserver
+    start [--nodeps] <start-vservers-opts>*
+                ... starts the specified vserver
+    stop [--nodeps] <start-vservers-opts>*
+                ... stops the specified vserver
     restart     ... restarts the specified vserver; this is the subsequent
                     execution of a synchronized 'stop' and a 'start'
     condrestart ... restarts the vserver when it is running already
@@ -57,6 +59,12 @@ Possible commands are:
     build <buildopts>*
                 ... builds a new vserver from scratch
 
+    unify [-R]
+               ... (de)unify vserver
+               
+    pkg install <pkg>
+               ... installs package(s) in the vserver
+               
     apt-get,apt-config,apt-cache <apt-opts>*
                ... execute the apt-* command for the given vserver
     rpm <rpm-opts>*
@@ -89,28 +97,48 @@ the GNU General Public License.  This program has absolutely no warranty."
     exit 0
 }
 
+function suexec()
+{
+    . $PKGLIBDIR/vserver.suexec
+}
+
+function restart()
+{
+    "${SELF[@]}" --sync "$vserver" stop
+    exec "${SELF[@]}" "$vserver" start
+}
 
 ### main starts here
 
 set +e
 
-tmp=$(getopt -o +sv --long help,version,sync,verbose -n "$0" -- "$@") || exit 1
+OPTIONS_ORIG=( "$@" )
+tmp=$(getopt -o +sv --long nonamespace,--nonamespace,help,debug,version,sync,verbose,silent -n "$0" -- "$@") || exit 1
 eval set -- "$tmp"
 
 OPTION_FORCE_SYNC=
 OPTION_VERBOSE=
+OPTION_SILENT=
+OPTION_DEBUG=
+OPTION_NONAMESPACE=
 
 while true; do
     case "$1" in
        --help)         showHelp $0 ;;
        --version)      showVersion ;;
-       -v|--verbose)   OPTION_VERBOSE=1;    shift;;
-       -s|--sync)      OPTION_FORCE_SYNC=1; shift;;
+       --debug)        OPTION_DEBUG=$1; set -x;;
+       -v|--verbose)   OPTION_VERBOSE=$1;;
+       -s|--sync)      OPTION_FORCE_SYNC=$1;;
+       --silent)       OPTION_SILENT=$1;;
+       ----nonamespace)OPTION_NONAMESPACE=$1;;
        --)             shift; break;;
-       *)              echo $"vserver: internal error; arg=='$1'"; exit 1;;
+       *)              echo $"vserver: internal error; arg=='$1'" >&2; exit 1;;
     esac
+    shift
 done
 
+OPTION_ALL=( $OPTION_SILENT $OPTION_VERBOSE $OPTION_DEBUG )
+SELF=( "$0" "${OPTION_ALL[@]}" )
 
 vserver=$1
 cmd=$2
@@ -134,7 +162,7 @@ if test "$allow_legacy"; then
     test -d "$VSERVER_DIR" -o ! -e "$CONFDIR/$vserver.conf" || do_legacy=1
 
     test -z "$do_legacy" || {
-       echo $"WARNING: can not find configuration, assuming legacy method"
+       echo $"WARNING: can not find configuration, assuming legacy method" >&2
        exec "$_VSERVER_LEGACY" "$@"
     }
 fi
@@ -142,7 +170,7 @@ fi
 test -d "$VSERVER_DIR" || {
     echo "Can not find vserver-setup"
     exit 1
-}
+} >&2
 
 if test -e "$VSERVER_DIR"/name; then
     read VSERVER_NAME <"$VSERVER_DIR"/name
@@ -150,35 +178,48 @@ else
     VSERVER_NAME=$(basename "$VSERVER_DIR")
 fi
 
+test "$2" != start -o "$OPTION_NONAMESPACE" || isAvoidNamespace "$VSERVER_DIR" || \
+    exec $_VNAMESPACE --new -- $_VSERVER ----nonamespace "${OPTIONS_ORIG[@]}"
+
 . $PKGLIBDIR/vserver.functions
 case "$2" in
-    start|stop|suexec)
+    start|stop)
        shift 2
        . $PKGLIBDIR/vserver.$cmd
        ;;
-    restart)
-       "$0" --sync "$1" stop
-       exec "$0" "$1" start
+    suexec|restart)
+       shift 2
+       $cmd "$@"
        ;;
     condrestart)
-       test ! isVserverRunning "$VSERVER_DIR" || exec "$0" "$1" restart
+       test ! isVserverRunning "$VSERVER_DIR" || restart
        ;;
     exec)
        shift 2
-       exec "$0" "$vserver" suexec root "$@"
+       suexec root "$@"
        ;;
     chkconfig)
        shift 2
-       exec "$0" "$vserver" suexec root chkconfig "$@"
+       suexec root chkconfig "$@"
        ;;
     enter)
        getEnterShell "$VSERVER_DIR"
-       exec "$0" "$1" suexec root "${ENTER_SHELL[@]}"
+       suexec root "${ENTER_SHELL[@]}"
        ;;
     running)
        isVserverRunning "$VSERVER_DIR"
        ;;
 
+    unify)
+       shift 2
+       exec $_VUNIFY "$@" "$vserver"
+       ;;
+       
+    pkg)
+       shift 2
+       exec $_VPKG "$vserver" "$@"
+       ;;
+
     apt-get|apt-config|apt-cache)
        export _APT_GET=$2
        shift 2
@@ -190,7 +231,7 @@ case "$2" in
        
     status)
        if getVserverStatus "$VSERVER_DIR" ctx procnum; then
-           echo $"Vserver '$1' is running at context '$ctx'"
+           echo $"Vserver '$vserver' is running at context '$ctx'"
 
            if test "$2" = status; then
                echo    $"Number of processes:" $procnum
@@ -199,12 +240,12 @@ case "$2" in
            fi
            exit 0
        else
-           echo $"Vserver '$1' is not running"
+           echo $"Vserver '$vserver' is not running"
            exit 1
        fi
        ;;
     *)
-       echo $"Usage: $0 {start|stop|suexec|restart|condrestart|exec|enter|chkconfig|running|status}"
+       echo $"Usage: $0 {start|stop|suexec|restart|condrestart|exec|enter|chkconfig|running|status}" >&2
        exit 2
        ;;
 esac