X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=scripts%2Fvserver;h=c9f9f24edce8f7d6a22113463aa021d25da62cab;hb=HEAD;hp=9eb72490327cf39d5afff6feacfe5dad60662adc;hpb=ec17b0fea7ed4c5724abd5db7ce6efb9c500bae5;p=util-vserver.git diff --git a/scripts/vserver b/scripts/vserver index 9eb7249..c9f9f24 100755 --- a/scripts/vserver +++ b/scripts/vserver @@ -31,21 +31,22 @@ test -e "$UTIL_VSERVER_VARS" || { function showHelp() { echo \ -$"Usage: $(basename $0) [-s|--sync] [-v|--verbose] [--silent] +$"Usage: $(basename $0) [-s|--sync] [-v|--verbose] [--silent] [--debug] [--] * is the name of a vserver. Possible commands are: - start [--rescue] [ *] + start [--rescue [--rescue-init] *]] ... starts the specified vserver - stop ... stops the specified vserver + stop [--rescue-init] + ... 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 - suexec + suexec ... executes a command as the specified user in the vserver - exec + exec ... executes a command as root in the vserver enter ... executes the configured shell in the vserver chkconfig @@ -56,11 +57,12 @@ Possible commands are: the vserver, and succeeds iff the vserver is running build * - ... builds a new vserver from scratch + ... builds a new vserver from scratch, see + vserver ... build --help for details delete ... remove a vserver - unify [-R] - ... (de)unify vserver + unify [-R] * + ... (de)unify the vserver with its reference vserver(s). pkg install ... installs package(s) in the vserver @@ -77,8 +79,8 @@ Possible commands are: while 'internalize' means that data and programs from the vserver will be used. - unify * - ... unify the vserver with its reference vserver(s). + hashify + ... hashify the guest. Please report bugs to $PACKAGE_BUGREPORT" @@ -119,7 +121,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= @@ -129,6 +131,8 @@ OPTION_DEBUG= OPTION_NONAMESPACE= OPTION_INSECURE= OPTION_DEFAULTTTY= +OPTION_STRACE= +OPTION_DEBUG_SYSV= while true; do case "$1" in @@ -141,6 +145,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 @@ -153,30 +159,34 @@ 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= +vserver="${vserver%%/}" case "$vserver" in - (./*) VSERVER_DIR=`pwd`/$vserver;; - (/*) VSERVER_DIR=$vserver;; - (*) VSERVER_DIR=$__CONFDIR/$vserver - allow_legacy=1 - ;; + (./*) VSERVER_DIR="`pwd`/$vserver";; + (/*) VSERVER_DIR="$vserver";; + (*) # Check if this is a context id + context=$(vuname --get --xid "$vserver" 2>/dev/null) + if test -d "$context"; then + VSERVER_DIR="$context" + else + VSERVER_DIR="$__CONFDIR/$vserver" + do_legacy= + test ! -e "$VSERVER_DIR/legacy" || do_legacy=1 + 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" >&2 + exec "$_VSERVER_LEGACY" "$@" + } + fi + ;; esac -if test -n "$allow_legacy"; then - do_legacy= - test ! -e "$VSERVER_DIR/legacy" || do_legacy=1 - 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" >&2 - exec "$_VSERVER_LEGACY" "$@" - } -fi - test -d "$VSERVER_DIR" || { echo $"\ Can not find a vserver-setup at '$VSERVER_DIR/'. @@ -189,15 +199,21 @@ 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 -test "$2" != start -o -n "$OPTION_NONAMESPACE" || isAvoidNamespace "$VSERVER_DIR" || \ +# Create a new namespace when starting the guest +test "$cmd" != 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 "$cmd" != enter -a "$cmd" != 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|delete) @@ -213,16 +229,17 @@ case "$2" in ;; (exec) shift 2 - suexec root "$@" + suexec 0 "$@" ;; (chkconfig) shift 2 - suexec root chkconfig "$@" + suexec 0 chkconfig "$@" ;; (enter) - OPTS_VCONTEXT_ENTER=( "${OPTS_VCONTEXT_ENTER[@]}" --vlogin ) + useVlogin && \ + OPTS_VCONTEXT_ENTER=( "${OPTS_VCONTEXT_ENTER[@]}" --vlogin ) getEnterShell "$VSERVER_DIR" - suexec root "${ENTER_SHELL[@]}" + suexec 0 "${ENTER_SHELL[@]}" ;; (running) isVserverRunning "$VSERVER_DIR" @@ -250,12 +267,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)