Make it easier to add rsync arguments.
[util-vserver.git] / scripts / functions
index f3bb242..2273cc4 100644 (file)
@@ -268,6 +268,39 @@ function unlock
     _VS_LOCKS="$@"
 }
 
+function get_init_cwd
+{
+    if test -n "$INIT_CWD"; then
+       echo "$INIT_CWD"
+    else
+       pwd
+    fi
+}
+function set_init_cwd
+{
+    INIT_CWD="`pwd`"
+    export INIT_CWD
+}
+
+function _setVserverDir
+{
+    local vserver="$1"
+    case "$vserver" in
+       ./*) VSERVER_DIR="`get_init_cwd`/$vserver";;
+       /*)  VSERVER_DIR="$vserver"               ;;
+       *)   VSERVER_DIR="$__CONFDIR/$vserver"    ;;
+    esac
+}
+
+function _setVserverName
+{
+    if test -e "$VSERVER_DIR"/name; then
+       read VSERVER_NAME <"$VSERVER_DIR"/name
+    else
+       VSERVER_NAME=$(basename "$VSERVER_DIR")
+    fi
+}
+
 function _pkgMountBindDir()
 {
     test "$1" != "$2" || return 0
@@ -486,10 +519,11 @@ function isNamespaceCleanup
 
     $_VSERVER_INFO - FEATURE namespace   || return 1
     cfgdir=$($_VSERVER_INFO "$1" CFGDIR) || return 1
-    test -e "$cfgdir"/nonamespace-cleanup && return 1
-    test -e "$__CONFDIR"/.defaults/namespace-cleanup -o \
-         -e "$cfgdir"/namespace-cleanup && return 0
-    return 1
+    isAvoidNamespace "$1"                && return 1
+    test -e "$cfgdir"/namespace-cleanup  && return 0
+    test -e "$cfgdir"/nonamespace-cleanup -o \
+         -e "$__CONFDIR"/.defaults/nonamespace-cleanup && return 1
+    return 0
 }
 
 ## Usage: getAllVservers <var> [<KIND>*]
@@ -547,7 +581,7 @@ function _getProcNumberCount
 
     # Use /proc/virtual from kernel 2.6 when possible
     if test -d "/proc/virtual"; then
-       set -- $($_GREP '^PROC:' "/proc/virtual/$1/limit" 2>/dev/null)
+       set -- $($_GREP '^Tasks:' "/proc/virtual/$1/status" 2>/dev/null)
        _gp_procnr_cnt=$2
     else
        _gp_procnr_cnt=$($_VPS ax | $_AWK '{print $2}' | $_GREP -x "$1" | $_WC -l )
@@ -612,13 +646,17 @@ function getFileValue
     eval read "$_gfv_var" <"$_gfv_file"
 }
 
-## Called as 'getFileArray <varname> <filename>'
+## Called as 'getFileArray <varname> <filename>+'
 function getFileArray
 {
-    test -r "$2" || return 1
-    
+    local _gfa_var=$1
+    local _gfa_file
+    shift
+
+    findFile _gfa_file "$@" ''
+    test -n "$_gfa_file" -a -r "$_gfa_file" || return 0
     local IFS=$_VS_NEWLINE
-    eval "$1"='( $(< "$2") )'
+    eval "$_gfa_var"='( $(< "$_gfa_file") )'
 }
 
 function checkComponents
@@ -685,8 +723,12 @@ function setDefaultTTY
        "$__CONFDIR/.defaults/apps/init/tty" \
        $2 /dev/null
 
-    exec   <$ttyname
-    exec  &>$ttyname
+    if test -f "$ttyname"; then
+       exec </dev/null
+    else
+       exec <$ttyname
+    fi
+    exec    >>$ttyname 2>&1
 }
 
 ## Usage: killContext <XID> [<SIG>]
@@ -701,6 +743,11 @@ function killContext
     #$_VKILL -s CONT   --xid "$1" 1 &>/dev/null || :
 }
 
+function useVlogin
+{
+    test ! -e "$__CONFDIR/.defaults/apps/vlogin/disable"
+}
+
 ## Usage: pkgmgmt.guessStyle <vserver> <resultvar>
 function pkgmgmt.guessStyle()
 {
@@ -811,9 +858,11 @@ function vshelper.doSanityCheck
        vshelper=$(cat "$proc_file")
 
        $_CMP -s "$vshelper" "$_VSHELPER" || {
+           local readable=""
+           test -r "$vshelper" && readable=1
            warnings=( "${warnings[@]}"
                       $"The configured vshelper '$vshelper' does not match the 'vshelper'
-  script of the util-vserver package"
+  script of the util-vserver package.${readable:+ Maybe you have two versions installed?}"
                     )
            solution_disable=1
            solution_sysctl=1
@@ -945,7 +994,11 @@ function vshelper.doInit
     
     local xid
     xid=$($_VSERVER_INFO "$1" CONTEXT false) && test -n "$xid" || {
-       warning $"vshelper.init: can not determine xid of vserver '$vserver'; returned value was '$xid'"
+       warning $"vshelper.init: can not determine xid of vserver '$vserver'; returned value was '$xid'
+
+This usually means that you're using an init-less init-style, but the
+guest isn't configured to start any service. Try enabling a service,
+changing the init-style, or making the contexts persistent."
        return 1
     }
 
@@ -1004,6 +1057,36 @@ function vshelper.getSyncTimeout
     eval $2=\$_vgst_tmp
 }
 
+function vshelper.initStopSync
+{
+       local _iss_sync_dir=$($_MKTEMPDIR vshelper-stop-sync.XXXXXX) || {
+               warning $"Failed to generate directory for vshelper sync"
+               exit 1
+       }
+       $_MKFIFO -m700 "$_iss_sync_dir/pipe"
+
+       eval "$1"=\$_iss_sync_dir
+       VSHELPER_STOP_SYNC="$_iss_sync_dir/pipe"
+       export VSHELPER_STOP_SYNC
+}
+
+function vshelper.waitForStopSync
+{
+       local sync_dir=$1
+       cat "$sync_dir/pipe" &> /dev/null
+       rm -fr "$sync_dir"
+}
+
+function vshelper.doStopSync
+{
+       test ! -p "$VSHELPER_STOP_SYNC" || echo stopped > "$VSHELPER_STOP_SYNC"
+}
+
+function vshelper.isStopSync
+{
+       test -p "$VSHELPER_STOP_SYNC" || return 1
+       return 0
+}
 
 function _rpmFake.getCapFlags
 {