logging(),warning(),panic(),execute(): added
authorEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Fri, 26 Mar 2004 07:30:33 +0000 (07:30 +0000)
committerEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Fri, 26 Mar 2004 07:30:33 +0000 (07:30 +0000)
pkgmgmt.isAptAvailable(): added
vshelper.*(): added
getFileArray(): fail, when file does not exist

git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@1367 94cd875c-1c1d-0410-91d2-eb244daf1a30

util-vserver/scripts/functions

index d315f6c..eb8e863 100644 (file)
@@ -15,6 +15,9 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
+_VS_LOGFILE=
+_VS_ERRFILE=
+
 _VS_NEWLINE='
 '
 declare -r _VS_NEWLINE=${_VS_NEWLINE:0-1}
@@ -68,6 +71,43 @@ function getPhysicalDir
     ( set -P && cd "$1" && pwd )
 }
 
+function logging
+{
+    if test "$_VS_LOGFILE"; then
+       echo "$@" >>"$_VS_LOGFILE"
+    else
+       echo "$@"
+    fi
+}
+
+function warning
+{
+    if test "$_VS_ERRFILE"; then
+       echo "$@" >>"$_VS_ERRFILE"
+    else
+       echo "$@" >&2
+    fi
+}
+
+function panic
+{
+    if test "$_VS_ERRFILE"; then
+       echo "$@" >>"$_VS_ERRFILE"
+    else
+       echo "$@" >&2
+    fi
+
+    exit 1
+}
+
+function execute
+{
+    test -z "${DEBUG_EXEC:-}"       || echo "$@"
+    test "${DEBUG_EXEC:-}" = noexec || exec "$@"
+    exit 0
+}
+
+
 function _pkgMountBindDir()
 {
     test "$1" != "$2" || return 0
@@ -322,7 +362,7 @@ function getFileValue
 ## Called as 'getFileArray <varname> <filename>'
 function getFileArray
 {
-    test -r "$2" || return 0
+    test -r "$2" || return 1
     
     local IFS=$_VS_NEWLINE
     eval "$1"='( $(< "$2") )'
@@ -419,3 +459,225 @@ function pkgmgmt.isInternal
 
     test -z "$cfgdir" -o ! -d "$cfgdir" -o -e "$cfgdir"/internal
 }
+
+## Usage: pkgmgmt.isAptAvailable <cfgdir> <vdir> [<is-internal>]
+function pkgmgmt.isAptAvailable
+{
+    local cfgdir="$1"
+    local vdir="$2"
+    local is_internal="$3"
+    
+    local have_apt i
+    if test "$is_internal"; then
+       have_apt=1
+       test -d "$cfgdir"/base/apt -o -d "$cfgdir"/aptetc || have_apt=
+    else
+       have_apt=
+       for i in /bin /usr/bin /usr/local/bin; do
+           test ! -x "$vdir$i"/apt-get || { have_apt=1; break; }
+       done
+    fi
+
+    test "$have_apt" && return 0 || return 1
+}
+
+function vshelper.doSanityCheck
+{
+    local vshelper this_xid i
+    declare -a warnings=()
+    local solution_disable=
+    local solution_sysctl=
+
+    vshelper.isEnabled && vshelper.isEnabled warning || return 0
+    
+    this_xid=$($_VSERVER_INFO - XID) ||
+       panic $"Failed to determine current context; aborting..."
+
+    ## Do nothing in other xid's; the helper will be executed in xid 0 only
+    test "$this_xid" = 0 || return 0
+
+    local proc_file=/proc/sys/kernel/vshelper
+
+    if ! test -r "$proc_file"; then
+       vshelper=
+       warnings=( "${warnings[@]}"
+                  $"File '$proc_file' does not exists but is required for vshelper setup" )
+        solution_disable=1
+    else
+       vshelper=$(cat "$proc_file")
+
+       cmp -s "$vshelper" "$_VSHELPER" || {
+           warnings=( "${warnings[@]}"
+                      $"The configured vshelper '$vshelper' does not match the 'vshelper'
+  script of the util-vserver package"
+                    )
+           solution_disable=1
+           solution_sysctl=1
+       }
+    fi
+
+    test -d "$VSHELPERSTATEDIR" || {
+       warnings=( "${warnings[@]}"
+                  $"\
+The vshelper state-directory '$VSHELPERSTATEDIR' does not exist;
+  since it is created by 'make install', this indicates a serious
+  problem with your util-vserver installation" )
+       solution_disable=1
+    }
+
+    test "${#warnings[@]}" -eq 0 || {
+       warning $"\
+The following problem(s) were encountered while verifying vshelper
+functionality:"
+
+       for i in "${warnings[@]}"; do
+           warning "* $i"
+       done
+
+       warning $"\
+       
+To fix this, you can:"
+
+       test -z "$solution_disable" || warning $"\
+* disable vshelper entirely by executing
+  | touch \"$CONFDIR/.defaults/apps/vshelper/disabled\"
+* disable only this message by executing
+  | touch \"$CONFDIR/.defaults/apps/vshelper/warning-disabled\""
+
+       test -x "$solution_sysctl" || warning $"\
+* configure the util-vserver vshelper script, e.g. by adding
+  | kernel.vshelper = \"$_VSHELPER\"
+  to /etc/sysctl.conf and rebooting the machine, or by executing
+  | echo \"$_VSHELPER\" >$proc_file"
+
+       warning ""
+
+       return 1
+    }
+
+    return 0
+}
+
+## Usage: vshelper.isEnabled [<style>] [<vserver>]
+function vshelper.isEnabled
+{
+    local f=${1:+$1-}disabled
+    test ! -e "$CONFDIR"/.defaults/apps/vshelper/"$f"       || return 1
+    $_VSERVER_INFO - FEATURE vshelper                       || return 1
+    if test "$2"; then
+       local appdir=$($_VSERVER_INFO "$2" APPDIR vshelper) || return 0
+       test -z "$2" -o ! -e "$appdir/$f"                   || return 1
+    fi
+
+    return 0
+}
+
+function vshelper._getHandlerInternal
+{
+    local var=$1
+    local tmp
+    shift
+    shift      ## HACK: see below the note about the 'set -u' mode
+    
+    while test "$#" -ge 2; do
+       local mod=$1
+       local obj=$2
+       shift 2
+
+       test "$mod" "$obj" || continue
+       case "$mod" in
+           (-x)
+               eval $var=\$obj
+               ;;
+           (-e)
+               read tmp <"$obj"
+               eval $var=:\$tmp
+               ;;
+           (*) panic $"Internal error, unexpected modifier '$mod'"
+       esac
+       return 0
+    done
+    
+    return 1
+}
+
+## Usage: vshelper.getHandler <result-var> <vserver> <action>
+function vshelper.getHandler
+{
+    local appdir=$($_VSERVER_INFO "$2" APPDIR vshelper) || appdir=
+    local script
+    declare -a search_list=( X )
+    ## HACK: when we are in 'set -u' mode, empty lists are causing errors
+
+    test -z "$appdir" || search_list=( "${search_list[@]}" -x "$appdir/$3" )
+    test -z "$appdir" || search_list=( "${search_list[@]}" -e "$appdir/action" )
+    search_list=( "${search_list[@]}" -x "$CONFDIR"/.defaults/apps/vshelper/"$3" )
+    search_list=( "${search_list[@]}" -e "$CONFDIR"/.defaults/apps/vshelper/action )
+
+    ! vshelper._getHandlerInternal "$1" "${search_list[@]}" || return 0
+    eval $1=':restart'
+}
+
+## Usage: vshelper.init <vserver> [<method> <args>*]
+function vshelper.doInit
+{
+    vshelper.isEnabled || return 0
+    
+    local xid=$($_VSERVER_INFO "$1" CONTEXT false) || {
+       warning $"vshelper.init: can not determine xid of vserver '$vserver'"
+       return 1
+    }
+
+    local f="$VSHELPERSTATEDIR/$xid"
+    
+    set -C
+    rm -f "$f"
+    echo "$1" >"$f"
+    set +C
+    
+    if test "$2"; then
+       shift 1
+       local i
+       for i; do
+           echo "$i" 
+       done
+    else
+       echo "default"
+    fi >>"$f"
+
+    return 0
+}
+
+## Usage: vshelper.doDestroy <vserver> <xid>
+function vshelper.doDestroy
+{
+    vshelper.isEnabled || return 0
+
+    rm -f "$VSHELPERSTATEDIR/$2"
+}
+
+## Usage: vshelper.initSync <vserver> <pipe-varname>
+function vshelper.initSync
+{
+    local tmpdir=$(mktemp -d /tmp/vserver-stop.XXXXXX) || {
+       warning $"Failed to generate temporary directory for vshelper sync"
+       return 1
+    }
+
+    local fifo="$tmpdir"/pipe
+    mkfifo -m700 "$fifo"
+    vshelper.doInit "$VSERVER_DIR" sync "$fifo"
+    eval $2=\$fifo
+}
+
+## Usage: vshelper.getSyncTimeout <vserver> <varname>
+function vshelper.getSyncTimeout
+{
+    local appdir=$($_VSERVER_INFO "$1" APPDIR vshelper) || appdir=
+    local file tmp
+
+    findFile file ${appdir:+"$appdir"/sync-timeout} "$CONFDIR"/.defaults/apps/vshelper/sync-timeout ''
+    test "$file" || return 1
+    read tmp <"$file"
+    eval $2=\$tmp
+}