use $(LIBENSCVECTOR) instead of libensc_vector.a
[util-vserver.git] / util-vserver / scripts / vshelper
index f642aa5..7fd7059 100755 (executable)
@@ -1,4 +1,4 @@
-#! /bin/bash
+#! /usr/lib/util-vserver/sigexec /bin/bash
 
 # Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
 #  
@@ -19,7 +19,7 @@
 
 : ${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"
@@ -52,17 +52,19 @@ function doInternalMethod
     case "$method" in
        (restart)
            case "$ACTION" in
-               (restart*)
+               (restart)
                    logging $"Restarting vserver '$VSERVER'"
-                   execute $_VSERVER "$VSERVER" restart
+                   execute $_VSERVER --defaulttty "$VSERVER" restart
                    ;;
                (halt|poweroff)
                    logging $"Stopping vserver '$VSERVER'"
-                   execute $_VSERVER "$VSERVER" stop
+                   execute $_VSERVER --defaulttty "$VSERVER" stop
                    ;;
                (swsusp)
                    ## TODO: any senseful action here? Perhaps shutdown scheduler for it?
                    exit 0
+                   ;;
+               (restart2)      ;;
                (*)
                    warning $"Unknown action '$ACTION' for vserver '$VSERVER'"
                    exit 1
@@ -71,7 +73,7 @@ function doInternalMethod
            
        (sync)
            local f=${METHOD_ARGS[0]}
-           test "$f" ||
+           test -n "$f" ||
                panic $"Insufficent arguments for method '$method' and vserver '$VSERVER'"
 
            test -p "$f" ||
@@ -82,9 +84,9 @@ function doInternalMethod
 
        (*)
            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
            }
@@ -111,34 +113,56 @@ function doDefaultMethod
 
 #===========
 
-
 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
+
+    exec   </dev/null
+    exec  >>$_VS_LOGFILE
+    exec 2>>$_VS_ERRFILE
+fi
+
+logging "$(date): vshelper $*"
+    
 test "$#" -ge 2 ||
     panic $"vshelper called with missing arguments; try '--help' for more information"
 
+    
 vshelper.isEnabled || exit 0
-logging "$(date): vshelper $*"
+! 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 "$@"
 }
 
@@ -147,7 +171,7 @@ test "$1" = "$XID" || {
 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
 }