74709cc1c29419345741bfb3f8fd7099bb60db17
[util-vserver.git] / util-vserver / scripts / vserver
1 #! /bin/bash
2 # $Id$
3
4 # Copyright (C) 2003 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; aborting..."
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]
35              [--] <vserver> <command> <args>*
36
37 <vserver> is the name of a vserver.
38
39 Possible commands are:
40     start [--nodeps] <start-vservers-opts>*
41                 ... starts the specified vserver
42     stop [--nodeps] <start-vservers-opts>*
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> <shell-command> <args*>
48                 ... executes a command as the specified user in the vserver
49     exec <shell-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
61
62     unify [-R]
63                 ... (de)unify vserver
64                 
65     pkg install <pkg>
66                 ... installs package(s) in the vserver
67                 
68     apt-get,apt-config,apt-cache <apt-opts>*
69                 ... execute the apt-* command for the given vserver
70     rpm <rpm-opts>*
71                 ... execute the rpm command for the given vserver
72
73     pkgmgmt externalize|internalize [-y]
74                 ... externalize or internalize the package-management for the
75                     given vserver. 'Externalize' means that package metadata
76                     and management tools (apt-get,rpm) are living in the host,
77                     while 'internalize' means that data and programs from the
78                     vserver will be used.
79
80     unify <vunify-opts>*
81                 ... unify the vserver with its reference vserver(s).
82                     
83
84 Please report bugs to $PACKAGE_BUGREPORT"
85     exit 0
86 }
87
88 function showVersion()
89 {
90     echo \
91 $"vserver $PACKAGE_VERSION -- manages the state of vservers
92 This program is part of $PACKAGE_STRING
93
94 Copyright (C) 2003 Enrico Scholz
95 This program is free software; you may redistribute it under the terms of
96 the GNU General Public License.  This program has absolutely no warranty."
97     exit 0
98 }
99
100 function suexec()
101 {
102     . $PKGLIBDIR/vserver.suexec
103 }
104
105 function restart()
106 {
107     "${SELF[@]}" --sync "$vserver" stop
108     exec "${SELF[@]}" "$vserver" start
109 }
110
111 ### main starts here
112
113 set +e
114
115 tmp=$(getopt -o +sv --long help,debug,version,sync,verbose,silent -n "$0" -- "$@") || exit 1
116 eval set -- "$tmp"
117
118 OPTION_FORCE_SYNC=
119 OPTION_VERBOSE=
120 OPTION_SILENT=
121 OPTION_DEBUG=
122
123 while true; do
124     case "$1" in
125         --help)         showHelp $0 ;;
126         --version)      showVersion ;;
127         --debug)        OPTION_DEBUG=$1; set -x; shift;;
128         -v|--verbose)   OPTION_VERBOSE=$1;    shift;;
129         -s|--sync)      OPTION_FORCE_SYNC=$1; shift;;
130         --silent)       OPTION_SILENT=$1;     shift;;
131         --)             shift; break;;
132         *)              echo $"vserver: internal error; arg=='$1'"; exit 1;;
133     esac
134 done
135
136 OPTION_ALL=( $OPTION_SILENT $OPTION_VERBOSE $OPTION_DEBUG )
137 SELF=( "$0" "${OPTION_ALL[@]}" )
138
139 vserver=$1
140 cmd=$2
141
142 test "$cmd" != build || { shift 2; exec "$_VSERVER_BUILD" -n "$vserver" "$@"; }
143
144
145 allow_legacy=
146
147 case "$vserver" in
148     ./*) VSERVER_DIR=`pwd`/$vserver;;
149     /*)  VSERVER_DIR=$vserver;;
150     *)   VSERVER_DIR=$CONFDIR/$vserver
151          allow_legacy=1
152          ;;
153 esac
154
155 if test "$allow_legacy"; then
156     do_legacy=
157     test ! -e "$VSERVER_DIR/legacy" || do_legacy=1
158     test -d "$VSERVER_DIR" -o ! -e "$CONFDIR/$vserver.conf" || do_legacy=1
159
160     test -z "$do_legacy" || {
161         echo $"WARNING: can not find configuration, assuming legacy method"
162         exec "$_VSERVER_LEGACY" "$@"
163     }
164 fi
165
166 test -d "$VSERVER_DIR" || {
167     echo "Can not find vserver-setup"
168     exit 1
169 }
170
171 if test -e "$VSERVER_DIR"/name; then
172     read VSERVER_NAME <"$VSERVER_DIR"/name
173 else
174     VSERVER_NAME=$(basename "$VSERVER_DIR")
175 fi
176
177 . $PKGLIBDIR/vserver.functions
178 case "$2" in
179     start|stop)
180         shift 2
181         . $PKGLIBDIR/vserver.$cmd
182         ;;
183     suexec|restart)
184         shift 2
185         $cmd "$@"
186         ;;
187     condrestart)
188         test ! isVserverRunning "$VSERVER_DIR" || restart
189         ;;
190     exec)
191         shift 2
192         suexec root "$@"
193         ;;
194     chkconfig)
195         shift 2
196         suexec root chkconfig "$@"
197         ;;
198     enter)
199         getEnterShell "$VSERVER_DIR"
200         suexec root "${ENTER_SHELL[@]}"
201         ;;
202     running)
203         isVserverRunning "$VSERVER_DIR"
204         ;;
205
206     unify)
207         shift 2
208         exec $_VUNIFY "$@" "$vserver"
209         ;;
210         
211     pkg)
212         shift 2
213         exec $_VPKG "$vserver" "$@"
214         ;;
215
216     apt-get|apt-config|apt-cache)
217         export _APT_GET=$2
218         shift 2
219         exec $_VAPT_GET -- "$@"
220         ;;
221     rpm)
222         exec $_VRPM -- "$@"
223         ;;
224         
225     status)
226         if getVserverStatus "$VSERVER_DIR" ctx procnum; then
227             echo $"Vserver '$vserver' is running at context '$ctx'"
228
229             if test "$2" = status; then
230                 echo    $"Number of processes:" $procnum
231                 echo -n $"Uptime:              "
232                 "$_FILETIME" "$VSERVER_DIR/run"
233             fi
234             exit 0
235         else
236             echo $"Vserver '$vserver' is not running"
237             exit 1
238         fi
239         ;;
240     *)
241         echo $"Usage: $0 {start|stop|suexec|restart|condrestart|exec|enter|chkconfig|running|status}"
242         exit 2
243         ;;
244 esac