vserver (8164B)
1 #! /bin/bash 2 # $Id$ 3 4 # Copyright (C) 2003,2004,2005 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> 5 # 6 # This program is free software; you can redistribute it and/or modify 7 # it under the terms of the GNU General Public License as published by 8 # the Free Software Foundation; version 2 of the License. 9 # 10 # This program is distributed in the hope that it will be useful, 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 # GNU General Public License for more details. 14 # 15 # You should have received a copy of the GNU General Public License 16 # along with this program; if not, write to the Free Software 17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 19 # set -e 20 21 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars} 22 test -e "$UTIL_VSERVER_VARS" || { 23 echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2 24 exit 1 25 } 26 . "$UTIL_VSERVER_VARS" 27 . "$_LIB_FUNCTIONS" 28 29 ### Some local functions 30 31 function showHelp() 32 { 33 echo \ 34 $"Usage: $(basename $0) [-s|--sync] [-v|--verbose] [--silent] [--debug] 35 [--] <vserver> <command> <args>* 36 37 <vserver> is the name of a vserver. 38 39 Possible commands are: 40 start [--rescue [--rescue-init] <rescue-cmd> <args>*]] 41 ... starts the specified vserver 42 stop [--rescue-init] 43 ... stops the specified vserver 44 restart ... restarts the specified vserver; this is the subsequent 45 execution of a synchronized 'stop' and a 'start' 46 condrestart ... restarts the vserver when it is running already 47 suexec <user> <command> <args*> 48 ... executes a command as the specified user in the vserver 49 exec <command> <args*> 50 ... executes a command as root in the vserver 51 enter ... executes the configured shell in the vserver 52 chkconfig <chkconfig-options*> 53 ... modifies the init-system; currently, only Red Hat's 54 chkconfig is supported 55 running ... succeeds iff the vserver is running 56 status ... gives out some human readable status information about 57 the vserver, and succeeds iff the vserver is running 58 59 build <buildopts>* 60 ... builds a new vserver from scratch, see 61 vserver ... build --help for details 62 delete ... remove a vserver 63 64 unify [-R] <vunify-opts>* 65 ... (de)unify the vserver with its reference vserver(s). 66 67 pkg install <pkg> 68 ... installs package(s) in the vserver 69 70 apt-get,apt-config,apt-cache <apt-opts>* 71 ... execute the apt-* command for the given vserver 72 rpm <rpm-opts>* 73 ... execute the rpm command for the given vserver 74 75 pkgmgmt externalize|internalize [-y] 76 ... externalize or internalize the package-management for the 77 given vserver. 'Externalize' means that package metadata 78 and management tools (apt-get,rpm) are living in the host, 79 while 'internalize' means that data and programs from the 80 vserver will be used. 81 82 hashify 83 ... hashify the guest. 84 85 86 Please report bugs to $PACKAGE_BUGREPORT" 87 exit 0 88 } 89 90 function showVersion() 91 { 92 echo \ 93 $"vserver $PACKAGE_VERSION -- manages the state of vservers 94 This program is part of $PACKAGE_STRING 95 96 Copyright (C) 2003,2004,2005 Enrico Scholz 97 This program is free software; you may redistribute it under the terms of 98 the GNU General Public License. This program has absolutely no warranty." 99 exit 0 100 } 101 102 function suexec() 103 { 104 . $__PKGDATADIR/vserver.suexec 105 } 106 107 function restart() 108 { 109 "${SELF[@]}" --sync "$vserver" stop 110 exec "${SELF[@]}" "$vserver" start 111 } 112 113 function msg() 114 { 115 test -z "$OPTION_SILENT" || return 0 116 echo "$@" 117 } 118 119 ### main starts here 120 121 set +e 122 123 OPTIONS_ORIG=( "$@" ) 124 tmp=$(getopt -o +sv --long nonamespace,--nonamespace,--insecure,defaulttty,help,debug,strace,debug-sysv,version,sync,verbose,silent -n "$0" -- "$@") || exit 1 125 eval set -- "$tmp" 126 127 OPTION_FORCE_SYNC= 128 OPTION_VERBOSE= 129 OPTION_SILENT= 130 OPTION_DEBUG= 131 OPTION_NONAMESPACE= 132 OPTION_INSECURE= 133 OPTION_DEFAULTTTY= 134 OPTION_STRACE= 135 OPTION_DEBUG_SYSV= 136 137 while true; do 138 case "$1" in 139 (--help) showHelp $0 ;; 140 (--version) showVersion ;; 141 (--debug) OPTION_DEBUG=$1; set -x;; 142 (-v|--verbose) OPTION_VERBOSE=$1;; 143 (-s|--sync) OPTION_FORCE_SYNC=$1;; 144 (--silent) OPTION_SILENT=$1;; 145 (----nonamespace)OPTION_NONAMESPACE=$1;; 146 (--defaulttty) OPTION_DEFAULTTTY=$1;; 147 (----insecure) OPTION_INSECURE=1;; 148 (--strace) OPTION_STRACE=1;; 149 (--debug-sysv*) OPTION_DEBUG_SYSV=$1;; 150 (--) shift; break;; 151 (*) echo $"vserver: internal error; arg=='$1'" >&2; exit 1;; 152 esac 153 shift 154 done 155 156 OPTION_ALL=( $OPTION_SILENT $OPTION_VERBOSE $OPTION_DEBUG $OPTION_DEFAULTTTY ) 157 SELF=( "$0" "${OPTION_ALL[@]}" ) 158 159 vserver=$1 160 cmd=$2 161 162 test "$cmd" != build || { shift 2; exec $_VNAMESPACE --new -- \ 163 "$_VSERVER_BUILD" $OPTION_DEBUG -n "$vserver" "$@"; } 164 165 166 allow_legacy= 167 168 vserver="${vserver%%/}" 169 case "$vserver" in 170 (./*) VSERVER_DIR="`pwd`/$vserver";; 171 (/*) VSERVER_DIR="$vserver";; 172 (*) # Check if this is a context id 173 context=$(vuname --get --xid "$vserver" 2>/dev/null) 174 if test -d "$context"; then 175 VSERVER_DIR="$context" 176 else 177 VSERVER_DIR="$__CONFDIR/$vserver" 178 do_legacy= 179 test ! -e "$VSERVER_DIR/legacy" || do_legacy=1 180 test -d "$VSERVER_DIR" -o ! -e "$__CONFDIR/$vserver.conf" || do_legacy=1 181 182 test -z "$do_legacy" || { 183 echo $"WARNING: can not find configuration, assuming legacy method" >&2 184 exec "$_VSERVER_LEGACY" "$@" 185 } 186 fi 187 ;; 188 esac 189 190 test -d "$VSERVER_DIR" || { 191 echo $"\ 192 Can not find a vserver-setup at '$VSERVER_DIR/'. 193 194 Possible solutions: 195 * fix the spelling of the '$vserver' vserver name 196 * read 'vserver $vserver build --help' about ways to create a new vserver 197 * see 'vserver --help' for the syntax of this command 198 " 199 exit 5 200 } >&2 201 202 _setVserverName 203 204 if test "$cmd" = start -a -z "$OPTION_NONAMESPACE" && ! isAvoidNamespace "$VSERVER_DIR"; then 205 # trigger automount and ignore errors (the later, real mounting 206 # will be more exact) 207 mountTriggerAutomount "$VSERVER_DIR" || : 208 209 # Create a new namespace when starting the guest 210 exec $_VNAMESPACE --new -- $_VSERVER ----nonamespace "${OPTIONS_ORIG[@]}" 211 fi 212 213 # Enter the namespace early so we can test for files inside the guest 214 test "$cmd" != enter -a "$cmd" != stop || \ 215 test -n "$OPTION_NONAMESPACE" || isAvoidNamespace "$VSERVER_DIR" || \ 216 ! isVserverRunning "$VSERVER_DIR" || \ 217 exec $_VSPACE --mount --fs --enter "$VSERVER_DIR" -- \ 218 $_VSERVER ----nonamespace "${OPTIONS_ORIG[@]}" 219 220 set_init_cwd 221 cd / 222 223 . "$_LIB_VSERVER_FUNCTIONS" 224 case "$2" in 225 (start|stop|delete) 226 shift 2 227 . $__PKGDATADIR/vserver.$cmd 228 ;; 229 (suexec|restart) 230 shift 2 231 $cmd "$@" 232 ;; 233 (condrestart) 234 ! isVserverRunning "$VSERVER_DIR" || restart 235 ;; 236 (exec) 237 shift 2 238 suexec 0 "$@" 239 ;; 240 (chkconfig) 241 shift 2 242 suexec 0 chkconfig "$@" 243 ;; 244 (enter) 245 useVlogin && \ 246 OPTS_VCONTEXT_ENTER=( "${OPTS_VCONTEXT_ENTER[@]}" --vlogin ) 247 getEnterShell "$VSERVER_DIR" 248 suexec 0 "${ENTER_SHELL[@]}" 249 ;; 250 (running) 251 isVserverRunning "$VSERVER_DIR" 252 ;; 253 254 (unify) 255 shift 2 256 exec $_VUNIFY "$@" "$vserver" 257 ;; 258 259 (hashify) 260 shift 2 261 exec $_VHASHIFY "$@" "$vserver" 262 ;; 263 264 (pkg) 265 shift 2 266 exec $_VPKG "$vserver" "$@" 267 ;; 268 269 (pkgmgmt) 270 op=$3 271 shift 3 272 exec $_VNAMESPACE --new -- $_PKGMGMT ${op:+--$op} "$@" -- "$vserver" 273 ;; 274 275 (apt-get|apt-config|apt-cache) 276 export APT_GET=$2 277 shift 2 278 exec $_VAPT_GET "$VSERVER_DIR" -- "$@" 279 ;; 280 281 (rpm) 282 shift 2 283 exec $_VRPM "$VSERVER_DIR" -- "$@" 284 ;; 285 286 (status) 287 if getVserverStatus "$VSERVER_DIR" ctx procnum; then 288 msg $"Vserver '$vserver' is running at context '$ctx'" 289 290 if test "$2" = status; then 291 msg $"Number of processes: " $procnum 292 msg $"Uptime: " $("$_FILETIME" "$VSERVER_DIR/run") 293 fi 294 exit 0 295 else 296 msg $"Vserver '$vserver' is stopped" 297 exit 3 298 fi 299 ;; 300 (*) 301 echo $"Usage: $0 <vserver> {start|stop|suexec|restart|condrestart|exec|enter|chkconfig|running|status|delete}" >&2 302 exit 2 303 ;; 304 esac