sendKillSequence(): added
[util-vserver.git] / util-vserver / scripts / vserver.functions
index 7a6fd87..6c9645b 100644 (file)
@@ -24,7 +24,6 @@ declare -a CHBIND_OPTS=()
 declare -a CAP_OPTS=()
 declare -a CHCONTEXT_INIT_OPTS=()
 declare -a CHCONTEXT_FLAG_OPTS=()
-declare -a CHCONTEXT_DISCONNECT=()
 declare -a CHCONTEXT_OPTS=()
 declare -a CAPCHROOT_OPTS=()
 declare -a INTERFACES=()
@@ -38,6 +37,8 @@ declare -a INITKILL_SEQ=()
 declare -a ENTER_SHELL=()
 
 INTERFACE_CMDS_IDX=0
+_HAVE_INTERFACE_OPTIONS=
+_HAVE_CHBIND_OPTIONS=
 
 INITSTYLE=sysv
 
@@ -59,6 +60,8 @@ function _generateChbindOptions
     local i
     local bcast=
 
+    test "$_HAVE_INTERFACE_OPTIONS" || _generateInterfaceOptions "$vdir"
+
     local f=$vdir/interfaces/bcast
     getFileValue bcast "$f"
     
@@ -67,6 +70,8 @@ function _generateChbindOptions
     for i in "${INTERFACES[@]}"; do
        CHBIND_OPTS=( "${CHBIND_OPTS[@]}" --ip "$i" )
     done
+
+    _HAVE_CHBIND_OPTIONS=1
 }
 
 function _generateNiceCommand
@@ -122,6 +127,23 @@ function getEnterShell
     }
 }
 
+## Usage: sendKillSequence <ctx> <signal> [<wait> <signal>]*
+function sendKillSequence
+{
+    local ctx=$1
+    local wait=
+    shift
+
+    while isCtxRunning "$ctx"; do
+       test -z "$wait" || sleep "$wait"
+       
+       $_VKILL -c "$ctx" ${1:+-s "$1"}
+       test "$2" || break
+       wait="$2"
+       shift 2
+    done
+}
+
 function _generateInitOptions
 {
     local vdir=$1
@@ -144,7 +166,7 @@ function _generateInitOptions
     getFileValue runlevel_start "$cfgdir"/runlevel
     getFileValue runlevel_start "$cfgdir"/runlevel.start
     getFileValue runlevel_stop  "$cfgdir"/runlevel.stop
-    getFileArray INITKILL_SEQ   "$cfgdir"/killseq
+    getFileArray INITKILL_SEQ  "$cfgdir"/killseq
 
     case x"$INITSTYLE" in
        xsysv)
@@ -162,8 +184,7 @@ function _generateInitOptions
        xplain)
            INITCMD_START=( /sbin/init )
            INITCMD_STOP=(  /sbin/init )
-           CHCONTEXT_INIT_OPTS=(  --flag fakeinit )
-           CHCONTEXT_DISCONNECT=( --disconnect )
+           CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
            test -z "$runlevel_start" || INITCMD_START=( "${INITCMD_START[@]}" "$runlevel_start" )
            test -z "$runlevel_stop"  || INITCMD_STOP=(  "${INITCMD_STOP[@]}"  "$runlevel_stop"  )
            ;;
@@ -171,8 +192,7 @@ function _generateInitOptions
        xminit)
            INITCMD_START=( /sbin/minit-start )
            INITCMD_STOP=(  /sbin/minit-stop  )
-           CHCONTEXT_INIT_OPTS=(  --flag fakeinit )
-           CHCONTEXT_DISCONNECT=( --disconnect )
+           CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
            INITCMD_START_SYNC=( "$_INITSYNC_MINIT_START" "$vdir" )
            INITCMD_STOP_SYNC=(  "$_INITSYNC_MINIT_STOP"  "$vdir" )
            test -z "$runlevel_start" || INITCMD_START=( "${INITCMD_START[@]}" "$runlevel_start" )
@@ -210,8 +230,7 @@ function _generateFlagOptions
            x|x#)               ;;
            dummy)              ;;
            fakeinit)
-               CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}" --flag fakeinit )
-               CHCONTEXT_DISCONNECT=( --disconnect )
+               CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
                ;;
            *)
                CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}"
@@ -229,9 +248,9 @@ function _generateChcontextOptions
     local flag
 
     {
-       read ctx        <"$vdir"/context
-       read hostname   <"$vdir"/hostname
-       read domainname <"$vdir"/domainname
+       read ctx        <"$vdir"/context     || :
+       read hostname   <"$vdir"/hostname    || :
+       read domainname <"$vdir"/domainname  || :
     } 2>/dev/null
 
     test -z "$S_CONTEXT" || ctx=$S_CONTEXT
@@ -241,7 +260,6 @@ function _generateChcontextOptions
 
     CHCONTEXT_OPTS=( $SILENT_OPT \
                      "${CHCONTEXT_FLAG_OPTS[@]}" \
-                    "${CHCONTEXT_INIT_OPTS[@]}" \
                     "${CAP_OPTS[@]}" \
                     --secure
                     ${ctx:+--ctx "$ctx"} \
@@ -345,6 +363,7 @@ function _generateInterfaceOptions
     
         _processSingleInterface "$iface"
     done
+    _HAVE_INTERFACE_OPTIONS=1
 }
 
 function enableInterfaces
@@ -371,11 +390,13 @@ function enableInterfaces
 
 function disableInterfaces
 {
+    test "$_HAVE_INTERFACE_OPTIONS" || _generateInterfaceOptions "$1"
+
     local i=$INTERFACE_CMDS_IDX
     declare -a var
 
     while test $i -gt 0; do
-       let --i
+       let --i || :
 
        eval var='( "${INTERFACE_CMDS_'$i'[@]}" )'
        local type=${var[0]}
@@ -410,7 +431,7 @@ function prepareInit
 function generateOptions
 {
     _generateInterfaceOptions  "$1"
-    _generateChbindOptions     "$1"
+    test "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$1" 
     _generateNiceCommand       "$1"
     _generateInitOptions       "$1"
     _generateChcontextOptions  "$1"
@@ -424,12 +445,13 @@ function mountVserver
 
     test -e "$cfgdir"/fstab || return 0
 
-    findObject -r mtab_src "$CONFDIR"/.defaults/init/mtab "$vdir"/apps/init/mtab /dev/null
+    findObject -r mtab_src "$vdir"/apps/init/mtab "$CONFDIR"/.defaults/init/mtab /dev/null
     
     pushd "$vdir" >/dev/null
     $_CHROOT_CAT /etc/mtab <"$mtab_src"
     popd >/dev/null
 
+    test "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
     $_CHBIND "${CHBIND_OPTS[@]}" \
        $_SECURE_MOUNT -a --chroot "$vdir" --fstab "$cfgdir"/fstab
 }
@@ -442,6 +464,7 @@ function umountVserver
     is_ok=1
 
     test -e "$cfgdir"/fstab || return 0
+    test "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
     
     pushd "$vdir/" >/dev/null
     tac "$cfgdir"/fstab | while read src dst tmp; do
@@ -450,8 +473,8 @@ function umountVserver
            x#*)        continue;;
        esac
 
-       $_CHBIND "${CHBIND_OPTS[@]}" \
-           $_SECURE_UMOUNT "$dst" || is_ok=
+       $_CHBIND "${CHBIND_OPTS[@]}" $_EXEC_CD "$dst" \
+           $_UMOUNT -lfn . || is_ok=
     done
     popd >/dev/null