X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fscripts%2Fvserver;h=9803a2e36894fa94ab5fad7443ae5e11edec1473;hb=7bd540af89c36e0fc25d167f6c4893451b3331a3;hp=ffa325817dc5f987261052a7a57530dda466246c;hpb=8eaf9307938a686e650f26b09a24f1d88309f567;p=util-vserver.git diff --git a/util-vserver/scripts/vserver b/util-vserver/scripts/vserver index ffa3258..9803a2e 100755 --- a/util-vserver/scripts/vserver +++ b/util-vserver/scripts/vserver @@ -16,27 +16,178 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -: ${UTIL_VSERVER_VARS:=$(dirname $0)/util-vserver-vars} +# set -e + +: ${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 (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) [-s|--sync] [-v|--verbose] [--silent] + [--] * + + is the name of a vserver. + +Possible commands are: + start [--nodeps] * + ... starts the specified vserver + stop [--nodeps] * + ... 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 + ... executes a command as the specified user in the vserver + exec + ... executes a command as root in the vserver + enter ... executes the configured shell in the vserver + chkconfig + ... modifies the init-system; currently, only Red Hat's + chkconfig is supported + running ... succeeds iff the vserver is running + status ... gives out some human readable status information about + the vserver, and succeeds iff the vserver is running + + build * + ... builds a new vserver from scratch + + unify [-R] + ... (de)unify vserver + + pkg install + ... installs package(s) in the vserver + + apt-get,apt-config,apt-cache * + ... execute the apt-* command for the given vserver + rpm * + ... execute the rpm command for the given vserver + + pkgmgmt externalize|internalize [-y] + ... externalize or internalize the package-management for the + given vserver. 'Externalize' means that package metadata + and management tools (apt-get,rpm) are living in the host, + while 'internalize' means that data and programs from the + vserver will be used. + + unify * + ... unify the vserver with its reference vserver(s). + + +Please report bugs to $PACKAGE_BUGREPORT" + exit 0 +} + +function showVersion() +{ + echo \ +$"vserver $PACKAGE_VERSION -- manages the state of vservers +This program is part of $PACKAGE_STRING + +Copyright (C) 2003 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 suexec() +{ + . $PKGLIBDIR/vserver.suexec +} + +function restart() +{ + "${SELF[@]}" --sync "$vserver" stop + exec "${SELF[@]}" "$vserver" start +} + +function msg() +{ + test -z "$OPTION_SILENT" || return 0 + echo "$@" +} + +### main starts here + +set +e + +OPTIONS_ORIG=( "$@" ) +tmp=$(getopt -o +sv --long nonamespace,--nonamespace,--insecure,defaulttty,help,debug,version,sync,verbose,silent -n "$0" -- "$@") || exit 1 +eval set -- "$tmp" + +OPTION_FORCE_SYNC= +OPTION_VERBOSE= +OPTION_SILENT= +OPTION_DEBUG= +OPTION_NONAMESPACE= +OPTION_INSECURE= +OPTION_DEFAULTTTY= + +while true; do + case "$1" in + (--help) showHelp $0 ;; + (--version) showVersion ;; + (--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;; + (--defaulttty) OPTION_DEFAULTTTY=$1;; + (----insecure) OPTION_INSECURE=1;; + (--) shift; break;; + (*) echo $"vserver: internal error; arg=='$1'" >&2; exit 1;; + esac + shift +done + +OPTION_ALL=( $OPTION_SILENT $OPTION_VERBOSE $OPTION_DEBUG $OPTION_DEFAULTTTY ) +SELF=( "$0" "${OPTION_ALL[@]}" ) + vserver=$1 cmd=$2 +test "$cmd" != build || { shift 2; exec "$_VSERVER_BUILD" -n "$vserver" "$@"; } + + +allow_legacy= + case "$vserver" in - ./*) VSERVER_DIR=`pwd`/$vserver;; - /*) VSERVER_DIR=$vserver;; - *) VSERVER_DIR=$CONFDIR/$vserver;; + (./*) VSERVER_DIR=`pwd`/$vserver;; + (/*) VSERVER_DIR=$vserver;; + (*) VSERVER_DIR=$CONFDIR/$vserver + allow_legacy=1 + ;; 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 vserver-setup" - exit 1 -} + echo $"\ +Can not find a vserver-setup at '$VSERVER_DIR/'. + +Possible solutions: +* fix the spelling of the '$vserver' vserver name +* read 'vserver $vserver build --help' about ways to create a new vserver +* see 'vserver --help' for the syntax of this command +" + exit 5 +} >&2 if test -e "$VSERVER_DIR"/name; then read VSERVER_NAME <"$VSERVER_DIR"/name @@ -44,8 +195,79 @@ else VSERVER_NAME=$(basename "$VSERVER_DIR") fi +test "$2" != start -o -n "$OPTION_NONAMESPACE" || isAvoidNamespace "$VSERVER_DIR" || \ + exec $_VNAMESPACE --new -- $_VSERVER ----nonamespace "${OPTIONS_ORIG[@]}" + +. $PKGLIBDIR/vserver.functions case "$2" in - start) - . $PKGLIBDIR/vserver.$2 + (start|stop) + shift 2 + . $PKGLIBDIR/vserver.$cmd + ;; + (suexec|restart) + shift 2 + $cmd "$@" + ;; + (condrestart) + test ! isVserverRunning "$VSERVER_DIR" || restart + ;; + (exec) + shift 2 + suexec root "$@" + ;; + (chkconfig) + shift 2 + suexec root chkconfig "$@" + ;; + (enter) + getEnterShell "$VSERVER_DIR" + suexec root "${ENTER_SHELL[@]}" ;; -esac \ No newline at end of file + (running) + isVserverRunning "$VSERVER_DIR" + ;; + + (unify) + shift 2 + exec $_VUNIFY "$@" "$vserver" + ;; + + (pkg) + shift 2 + exec $_VPKG "$vserver" "$@" + ;; + + (pkgmgmt) + op=$3 + shift 3 + exec $_VNAMESPACE --new -- $_PKGMGMT ${op:+--$op} "$@" -- "$vserver" + ;; + + (apt-get|apt-config|apt-cache) + export _APT_GET=$2 + shift 2 + exec $_VAPT_GET -- "$@" + ;; + (rpm) + exec $_VRPM -- "$@" + ;; + + (status) + if getVserverStatus "$VSERVER_DIR" ctx procnum; then + msg $"Vserver '$vserver' is running at context '$ctx'" + + if test "$2" = status; then + msg $"Number of processes: " $procnum + msg $"Uptime: " $("$_FILETIME" "$VSERVER_DIR/run") + fi + exit 0 + else + msg $"Vserver '$vserver' is stopped" + exit 3 + fi + ;; + (*) + echo $"Usage: $0 {start|stop|suexec|restart|condrestart|exec|enter|chkconfig|running|status}" >&2 + exit 2 + ;; +esac