Merge 0.30.214.
[util-vserver.git] / scripts / vserver
index 59553fa..cbee386 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/bash
-# $Id: vserver,v 1.30 2005/04/28 18:03:42 ensc Exp $
+# $Id: vserver 2566 2007-07-18 17:24:36Z dhozac $
 
 # Copyright (C) 2003,2004,2005 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
 #  
@@ -37,7 +37,7 @@ $"Usage: $(basename $0) [-s|--sync] [-v|--verbose] [--silent]
 <vserver> is the name of a vserver.
 
 Possible commands are:
-    start [--rescue] [--rescue-cmd <cmd>]
+    start [--rescue [--rescue-init]] [<rescue-cmd> <args>*]
                 ... starts the specified vserver
     stop        ... stops the specified vserver
     restart     ... restarts the specified vserver; this is the subsequent
@@ -57,9 +57,10 @@ Possible commands are:
 
     build <buildopts>*
                 ... builds a new vserver from scratch
+    delete      ... remove a vserver
 
-    unify [-R]
-               ... (de)unify vserver
+    unify [-R] <vunify-opts>*
+               ... (de)unify the vserver with its reference vserver(s).
                
     pkg install <pkg>
                ... installs package(s) in the vserver
@@ -76,8 +77,8 @@ Possible commands are:
                    while 'internalize' means that data and programs from the
                    vserver will be used.
 
-    unify <vunify-opts>*
-                ... unify the vserver with its reference vserver(s).
+    hashify
+                ... hashify the guest.
                    
 
 Please report bugs to $PACKAGE_BUGREPORT"
@@ -118,7 +119,7 @@ function msg()
 set +e
 
 OPTIONS_ORIG=( "$@" )
-tmp=$(getopt -o +sv --long nonamespace,--nonamespace,--insecure,defaulttty,help,debug,version,sync,verbose,silent -n "$0" -- "$@") || exit 1
+tmp=$(getopt -o +sv --long nonamespace,--nonamespace,--insecure,defaulttty,help,debug,strace,debug-sysv,version,sync,verbose,silent -n "$0" -- "$@") || exit 1
 eval set -- "$tmp"
 
 OPTION_FORCE_SYNC=
@@ -128,6 +129,8 @@ OPTION_DEBUG=
 OPTION_NONAMESPACE=
 OPTION_INSECURE=
 OPTION_DEFAULTTTY=
+OPTION_STRACE=
+OPTION_DEBUG_SYSV=
 
 while true; do
     case "$1" in
@@ -140,6 +143,8 @@ while true; do
        (----nonamespace)OPTION_NONAMESPACE=$1;;
        (--defaulttty)  OPTION_DEFAULTTTY=$1;;
        (----insecure)  OPTION_INSECURE=1;;
+       (--strace)      OPTION_STRACE=1;;
+       (--debug-sysv*) OPTION_DEBUG_SYSV=$1;;
        (--)            shift; break;;
        (*)             echo $"vserver: internal error; arg=='$1'" >&2; exit 1;;
     esac
@@ -152,7 +157,8 @@ SELF=( "$0" "${OPTION_ALL[@]}" )
 vserver=$1
 cmd=$2
 
-test "$cmd" != build || { shift 2; exec "$_VSERVER_BUILD" -n "$vserver" "$@"; }
+test "$cmd" != build || { shift 2; exec $_VNAMESPACE --new -- \
+    "$_VSERVER_BUILD" $OPTION_DEBUG -n "$vserver" "$@"; }
 
 
 allow_legacy=
@@ -171,6 +177,9 @@ if test -n "$allow_legacy"; then
     test -d "$VSERVER_DIR" -o ! -e "$__CONFDIR/$vserver.conf" || do_legacy=1
 
     test -z "$do_legacy" || {
+       if test "$cmd" = "convert"; then
+           exec $__PKGLIBDIR/vserver.convert "$vserver"
+       fi
        echo $"WARNING: can not find configuration, assuming legacy method" >&2
        exec "$_VSERVER_LEGACY" "$@"
     }
@@ -188,18 +197,24 @@ Possible solutions:
     exit 5
 } >&2
 
-if test -e "$VSERVER_DIR"/name; then
-    read VSERVER_NAME <"$VSERVER_DIR"/name
-else
-    VSERVER_NAME=$(basename "$VSERVER_DIR")
-fi
+_setVserverName
 
+# Create a new namespace when starting the guest
 test "$2" != start -o -n "$OPTION_NONAMESPACE" || isAvoidNamespace "$VSERVER_DIR" || \
     exec $_VNAMESPACE --new -- $_VSERVER ----nonamespace "${OPTIONS_ORIG[@]}"
 
+# Enter the namespace early so we can test for files inside the guest
+test "$2" != enter -a "$2" != stop || \
+    test -n "$OPTION_NONAMESPACE" || isAvoidNamespace "$VSERVER_DIR" || \
+    ! isVserverRunning "$VSERVER_DIR" || \
+    exec $_VNAMESPACE --enter "$VSERVER_DIR" -- $_VSERVER ----nonamespace "${OPTIONS_ORIG[@]}"
+
+set_init_cwd
+cd /
+
 . $__PKGLIBDIR/vserver.functions
 case "$2" in
-    (start|stop)
+    (start|stop|delete)
        shift 2
        . $__PKGLIBDIR/vserver.$cmd
        ;;
@@ -208,19 +223,21 @@ case "$2" in
        $cmd "$@"
        ;;
     (condrestart)
-       test ! isVserverRunning "$VSERVER_DIR" || restart
+       ! isVserverRunning "$VSERVER_DIR" || restart
        ;;
     (exec)
        shift 2
-       suexec root "$@"
+       suexec 0 "$@"
        ;;
     (chkconfig)
        shift 2
-       suexec root chkconfig "$@"
+       suexec 0 chkconfig "$@"
        ;;
     (enter)
+       useVlogin && \
+         OPTS_VCONTEXT_ENTER=( "${OPTS_VCONTEXT_ENTER[@]}" --vlogin )
        getEnterShell "$VSERVER_DIR"
-       suexec root "${ENTER_SHELL[@]}"
+       suexec 0 "${ENTER_SHELL[@]}"
        ;;
     (running)
        isVserverRunning "$VSERVER_DIR"
@@ -248,12 +265,14 @@ case "$2" in
        ;;
 
     (apt-get|apt-config|apt-cache)
-       export _APT_GET=$2
+       export APT_GET=$2
        shift 2
-       exec $_VAPT_GET -- "$@"
+       exec $_VAPT_GET "$VSERVER_DIR" -- "$@"
        ;;
+
     (rpm)
-       exec $_VRPM -- "$@"
+       shift 2
+       exec $_VRPM "$VSERVER_DIR" -- "$@"
        ;;
        
     (status)
@@ -270,8 +289,12 @@ case "$2" in
            exit 3
        fi
        ;;
+    (convert)
+       echo "Vserver '$vserver' is already converted"
+       exit 1
+       ;;
     (*)
-       echo $"Usage: $0 {start|stop|suexec|restart|condrestart|exec|enter|chkconfig|running|status}" >&2
+       echo $"Usage: $0 <vserver> {start|stop|suexec|restart|condrestart|exec|enter|chkconfig|running|status|delete}" >&2
        exit 2
        ;;
 esac