1 #! /usr/lib/util-vserver/sigexec /bin/bash
3 # Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; version 2 of the License.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 ## Usage: vshelper <xid> <action> <args>
20 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
21 test -e "$UTIL_VSERVER_VARS" || {
22 echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2
25 . "$UTIL_VSERVER_VARS"
31 Usage: vshelper <xid> <event> <args>*
33 Report bugs to <$PACKAGE_BUGREPORT>."
40 vshelper $PACKAGE_VERSION -- userspace reboot helper
41 This program is part of $PACKAGE_STRING
43 Copyright (C) 2004 Enrico Scholz
44 This program is free software; you may redistribute it under the terms of
45 the GNU General Public License. This program has absolutely no warranty."
49 function doInternalMethod
56 logging $"Restarting vserver '$VSERVER'"
59 vshelper.initStopSync sync_dir
61 spawn $_VSERVER --defaulttty "$VSERVER" restart &
64 vshelper.waitForStopSync "$sync_dir"
67 logging $"Stopping vserver '$VSERVER'"
70 vshelper.initStopSync sync_dir
72 spawn $_VSERVER --defaulttty "$VSERVER" stop &
75 vshelper.waitForStopSync "$sync_dir"
76 spawn killContext "$XID"
79 ## TODO: any senseful action here? Perhaps shutdown scheduler for it?
84 logging $"Cleaning up after vserver '$VSERVER'"
85 spawn $_VSERVER --defaulttty "$VSERVER" stop
88 warning $"Unknown action '$ACTION' for vserver '$VSERVER'"
94 spawn killContext "$XID"
98 local f=${METHOD_ARGS[0]}
100 panic $"Insufficent arguments for method '$method' and vserver '$VSERVER'"
103 panic $"File '$f' which is required for synchronisation of vserver '$VSERVER' is not a pipe"
105 spawn killContext "$XID"
111 findObject -x script "$__CONFDIR"/.defaults/apps/vshelper-methods/"$method" "$__PKGLIBDIR"/vshelper-methods/"$method" ''
113 test -n '$script' || {
114 warning $"No handler for internal method '$method' found"
119 execute "$script" "${ARGS[@]}"
123 function doDefaultMethod
127 vshelper.getHandler handler "$VSERVER" "$ACTION" || {
128 warning $"No handler configured for action '$ACTION' on vserver '$VSERVER'"
133 (/*) execute "$handler" "${ARGS[@]}";;
134 (:*) doInternalMethod "${handler##:}" "$@";;
140 test "$1" != '--version' || showVersion
141 test "$1" != '--help' || showHelp
144 findObject -e _VS_LOGFILE "$__CONFDIR"/.defaults/apps/vshelper/logfile /dev/null
145 findObject -e _VS_ERRFILE "$__CONFDIR"/.defaults/apps/vshelper/logfile /dev/null
152 logging "$(date): vshelper $*"
155 panic $"vshelper called with missing arguments; try '--help' for more information"
158 vshelper.isEnabled || exit 0
159 ! vshelper.isDebug || set -x
163 if $_VSERVER_INFO - FEATURE vshelper0; then
166 elif $_VSERVER_INFO - FEATURE vshelper; then
170 panic $"vshelper functionality not supported by kernel"
173 findObject -x delegate "$__CONFDIR"/.defaults/apps/vshelper-delegate/"$ACTION" "$__PKGLIBDIR"/vshelper-delegate/"$ACTION" ''
174 test -e "$delegate" && exec -a "$ACTION" "$delegate" "$@"
176 this_xid=$($_VSERVER_INFO - XID)
180 pxid=$($_VSERVER_INFO "$responsible_xid" PXID) || break
181 test "$pxid" -ne "$this_xid" || break
182 responsible_xid=$pxid
185 vserver_id=$($_VSERVER_INFO "$responsible_xid" ID) || test "$ACTION" = "shutdown" ||
186 panic $"No responsible vserver found for xid '$responsible_xid' ($XID); aborting..."
188 test "$XID" = "$responsible_xid" || {
189 logging "Giving 'vshelper' task for '$XID' to parent vserver '$vserver_id' ($responsible_xid)"
190 execute $_VSERVER "$vserver_id" exec $_VSHELPER "$@"
198 getFileArray state "$__VSHELPERSTATEDIR/$XID" && test ${#state[@]} -ge 2 || {
199 logging "'vshelper' not configured for xid '$XID'"
203 declare -r VSERVER=${state[0]}
205 cfg_xid=$($_VSERVER_INFO "${state[0]}" CONTEXT false) ||
206 panic $"Configured vserver '$VSERVER' does not seem to run; aborting..."
208 test "$cfg_xid" = "$XID" ||
209 panic $"Configured ($cfg_xid) and actual ($XID) xid for vserver '$VSERVER' are mismatching; aborting..."
211 cur_xid=$($_VSERVER_INFO "$VSERVER" CONTEXT false) ||
212 panic $"Vserver '$VSERVER' with '$XID' does not seem to run; strange..."
214 test "$cur_xid" = "$XID" ||
215 panic $"Expected ($XID) and actual ($cur_xid) xid for vserver '$VSERVER' are mismatching; strange..."
219 if test "${#state[@]}" -gt 2; then
220 unset state[0] state[1]
221 declare -ra METHOD_ARGS=( "${state[@]}" )
223 declare -ra METHOD_ARGS=()
227 (default) doDefaultMethod "$@";;
228 (sync|async) doInternalMethod "$method" "$@";;
229 (*) panic $"Unknown method '$method' used by vserver '$VSERVER'";;