-#! /bin/bash
+#! /usr/lib/util-vserver/sigexec /bin/bash
# Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
#
: ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
test -e "$UTIL_VSERVER_VARS" || {
- echo "Can not find util-vserver installation; aborting..." >&2
+ echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2
exit 1
}
. "$UTIL_VSERVER_VARS"
case "$ACTION" in
(restart)
logging $"Restarting vserver '$VSERVER'"
- execute $_VSERVER "$VSERVER" restart
+ spawn killContext "$XID"
+ execute $_VSERVER --defaulttty "$VSERVER" restart
;;
(halt|poweroff)
logging $"Stopping vserver '$VSERVER'"
- execute $_VSERVER "$VSERVER" stop
+ spawn killContext "$XID"
+ execute $_VSERVER --defaulttty "$VSERVER" stop
;;
(swsusp)
## TODO: any senseful action here? Perhaps shutdown scheduler for it?
exit 1
esac
;;
+
+ (async)
+ spawn killContext "$XID"
+ ;;
(sync)
local f=${METHOD_ARGS[0]}
- test "$f" ||
+ test -n "$f" ||
panic $"Insufficent arguments for method '$method' and vserver '$VSERVER'"
test -p "$f" ||
panic $"File '$f' which is required for synchronisation of vserver '$VSERVER' is not a pipe"
+ spawn killContext "$XID"
echo "$ACTION" >"$f"
;;
(*)
local script
- findObject -x script "$CONFDIR"/.defaults/apps/vshelper-methods/"$method" "$PKGLIBDIR"/vshelper-methods/"$method" ''
+ findObject -x script "$__CONFDIR"/.defaults/apps/vshelper-methods/"$method" "$__PKGLIBDIR"/vshelper-methods/"$method" ''
- test '$script' || {
+ test -n '$script' || {
warning $"No handler for internal method '$method' found"
exit 1
}
#===========
+test "$1" != '--version' || showVersion
+test "$1" != '--help' || showHelp
+
if ! tty -s; then
- findObject -e _VS_LOGFILE "$CONFDIR"/.defaults/apps/vshelper/logfile /dev/null
- findObject -e _VS_ERRFILE "$CONFDIR"/.defaults/apps/vshelper/logfile /dev/null
+ findObject -e _VS_LOGFILE "$__CONFDIR"/.defaults/apps/vshelper/logfile /dev/null
+ findObject -e _VS_ERRFILE "$__CONFDIR"/.defaults/apps/vshelper/logfile /dev/null
+ exec </dev/null
exec >>$_VS_LOGFILE
exec 2>>$_VS_ERRFILE
fi
-
-logging "$(date): vshelper $*"
-test "$1" != '--version' || showVersion
-test "$1" != '--help' || showHelp
+logging "$(date): vshelper $*"
+
test "$#" -ge 2 ||
panic $"vshelper called with missing arguments; try '--help' for more information"
+
vshelper.isEnabled || exit 0
+! vshelper.isDebug || set -x
set -eu
-declare -r XID=$1
-declare -r ACTION=$2
+if $_VSERVER_INFO - FEATURE vshelper0; then
+ declare -r XID=$1
+ declare -r ACTION=$2
+elif $_VSERVER_INFO - FEATURE vshelper; then
+ declare -r ACTION=$1
+ declare -r XID=$2
+else
+ panic $"vshelper functionality not supported by kernel"
+fi
+findObject -x delegate "$__CONFDIR"/.defaults/apps/vshelper-delegate/"$ACTION" "$__PKGLIBDIR"/vshelper-delegate/"$ACTION" ''
+test -e "$delegate" && exec -a "$ACTION" "$delegate" "$@"
this_xid=$($_VSERVER_INFO - XID)
pxid=
+responsible_xid=$XID
while true; do
- pxid=$($_VSERVER_INFO "$XID" PXID) || break
- test "$pxid" -ne "$this_xid" || break
- xid=$pxid
+ pxid=$($_VSERVER_INFO "$responsible_xid" PXID) || break
+ test "$pxid" -ne "$this_xid" || break
+ responsible_xid=$pxid
done
-vserver_id=$($_VSERVER_INFO "$XID" ID) ||
- panic $"No responsible vserver found for xid '$1' ($XID); aborting..."
+vserver_id=$($_VSERVER_INFO "$responsible_xid" ID) ||
+ panic $"No responsible vserver found for xid '$responsible_xid' ($XID); aborting..."
-test "$1" = "$XID" || {
- logging "Giving 'vshelper' task for '$1' to parent vserver '$vserver_id' ($XID)"
+test "$XID" = "$responsible_xid" || {
+ logging "Giving 'vshelper' task for '$XID' to parent vserver '$vserver_id' ($responsible_xid)"
execute $_VSERVER "$vserver_id" exec $_VSHELPER "$@"
}
ARGS=( "$@" )
declare -a state
-getFileArray state "$VSHELPERSTATEDIR/$XID" && test ${#state[@]} -ge 2 || {
+getFileArray state "$__VSHELPERSTATEDIR/$XID" && test ${#state[@]} -ge 2 || {
logging "'vshelper' not configured for xid '$XID'"
exit 0
}
fi
case "$method" in
- (default) doDefaultMethod "$@";;
- (sync) doInternalMethod "$method" "$@";;
- (*) panic $"Unknown method '$method' used by vserver '$VSERVER'";;
+ (default) doDefaultMethod "$@";;
+ (sync|async) doInternalMethod "$method" "$@";;
+ (*) panic $"Unknown method '$method' used by vserver '$VSERVER'";;
esac