support both internal and external packagemanagement
[util-vserver.git] / util-vserver / scripts / functions
index f9215f7..c4d873b 100644 (file)
@@ -78,7 +78,7 @@ function _pkgMountBindDir()
 function _pkgSetVarsBase
 {
     case "$vserver" in
-       /*)
+       ./*|/*)
            if test -d "$vserver/vdir"; then
                BASEDIR=$vserver
                VDIR=$(getPhysicalDir "$vserver/vdir")
@@ -87,7 +87,7 @@ function _pkgSetVarsBase
                test -d "$PKGDIR" || {
                    echo "Can not find configuration-directory for package-managment tools"
                    exit 1
-               }
+               } >&2
                findDir EXECDIR      $PKGDIR/execdir     /
            else
                VDIR=$(getPhysicalDir "$vserver")
@@ -99,17 +99,17 @@ function _pkgSetVarsBase
            test -d "$BASEDIR" || {
                echo "Can not find configuration-directory"
                exit 1
-           }
+           } >&2
            
            VDIR=$BASEDIR/vdir
-           test -d "$VDIR"   || VDIR=/vservers/$vserver
+           test -d "$VDIR"   || VDIR=$DEFAULT_VSERVERDIR/$vserver
            VDIR=$(getPhysicalDir "$VDIR")
            
            PKGDIR=$BASEDIR/apps/pkgmgmt
            test -d "$PKGDIR" || {
                echo "Can not find configuration-directory for package-managment tools"
                exit 1
-           }
+           } >&2
 
            findDir EXECDIR      $PKGDIR/execdir     /
 
@@ -154,6 +154,9 @@ function _pkgSetVarsApt
        findDir APTCACHEDIR  "$VDIR"/var/cache/apt
        findDir APTARCHIVDIR "$VDIR"/var/cache/apt/archives /var/cache/apt/archives
     fi
+
+    findFile APT_CONFIG "$APTETCDIR"/apt.conf ""
+    test -z "$APT_CONFIG" || export APT_CONFIG
 }
 
 function _pkgMountBase
@@ -173,6 +176,9 @@ function _pkgMountRPM
 
     "$_SECURE_MOUNT" --chroot "$VDIR" -n --secure --bind "$RPMSTATEDIR" "$_rpmdb_mntpoint"
     test -z "$WORKAROUND_106057" || mount -n --bind "$RPMSTATEDIR" "$_rpmdb_mntpoint"
+
+    test -e "$VDIR"/proc/self/status || \
+       "$_SECURE_MOUNT" --chroot "$VDIR" -n --secure -t proc none /proc
 }
 
 function _pkgSetEnvBase
@@ -210,7 +216,7 @@ function pkgInit
        case "$i" in
            rpm)        _pkgSetVarsRPM;;
            apt)        _pkgSetVarsApt;;
-           *)          echo "Unknown packaging flavor"; exit 1;;
+           *)          echo "Unknown packaging flavor" >&2; exit 1;;
        esac
     done
 
@@ -234,39 +240,67 @@ function pkgInit
     _PKG_VSERVER=$vserver
 }
 
+function isAvoidNamespace
+{
+    local cfgdir
+
+    $_VSERVER_INFO - FEATURE namespace   || return 0
+    cfgdir=$($_VSERVER_INFO "$1" CFGDIR) || return 0
+    test ! -e "$cfgdir"/namespace        || return 1
+    test -e "$CONFDIR"/.defaults/nonamespace -o \
+         -e "$cfgdir"/nonamespace
+}
+
 function getAllVservers
 {
     local i
-    declare -a tmp=()
+    declare -a _tmp=()
 
     for i in $CONFDIR/*; do
        test   -d "$i"          || continue
        test ! -e "$i"/disabled || continue
        test   -d "$i"/vdir     || continue
+       case "$i" in
+           *.~*~) continue;;
+       esac
 
-       tmp=( "${tmp[@]}" "${i##$CONFDIR/}")
+       _tmp=( "${_tmp[@]}" "${i##$CONFDIR/}")
     done
 
-    eval $1=\$tmp
+    eval $1='( "${_tmp[@]}" )'
 }
 
 ## Usage: getVserverCtx <vdir> <result-varname> [<procnumber-varname> [<do-cleanup>]]
+## Returns: 0 iff vserver is running
 function getVserverStatus
 {
     test -r "$1"/run || return 1
-    eval read "$2" <"$1"/run
+
+    local _ctx
+    read _ctx <"$1"/run
+    eval "$2"=\$_ctx
 
     test "$3"        || return 0
-    local _tmp=$($_VPS ax | $_AWK '{print $2}' | $_GREP -x "$ctx" | $_WC -l )
+    local _tmp=$($_VPS ax | $_AWK '{print $2}' | $_GREP -x "$_ctx" | $_WC -l )
+    let _tmp=_tmp+0
     eval "$3"=\$_tmp
 
-    test "$4" -a $_tmp = 0 || return 0
-    _tmp=$(readlink "$1/run")
-    test "$_tmp"           || return 1
-    rm -f "$_tmp"
+    if test "$_tmp" = 0; then
+       local runfile=$($_READLINK "$1/run")
+       test -z "$4" || rm -f "$runfile"
+       return 1
+    fi
+
     return 0
 }
 
+## Usage: isCtxRunning <ctx>
+function isCtxRunning
+{
+    local _tmp=$($_VPS ax | $_AWK '{print $2}' | $_GREP -x "$1" | $_WC -l )
+    test $_tmp -gt 0
+}
+
 ## Usage: isVserverRunning <vdir> [<ctx-varname>]
 function isVserverRunning
 {
@@ -293,3 +327,93 @@ function getFileArray
     local IFS=$_VS_NEWLINE
     eval "$1"='( $(< "$2") )'
 }
+
+function checkComponents
+{
+    local      i
+    local      msg=$1
+    local      x_failed=
+
+    shift
+    
+    for i; do
+       local failed=
+       case "$i" in
+           core)       test -x "$_CHBIND"           || failed=1;;
+           build)      test -x "$_VSERVER_BUILD"    || failed=1;;
+           sysv)       test -x "$INITRDDIR/vserver" || failed=1;;
+           devel)      test -d "$INCLUDEDIR/vserver.h" || failed=1;;
+           *)          echo "Unknown component '$i'" >&2
+                       return false
+                       ;;
+       esac
+
+       test -z "$failed" || {
+           echo "$msg: $i"
+           x_failed=1
+       } >&2
+    done
+
+    test -z "$x_failed"
+}
+
+## Usage: isKernelAPI <ver> [<cmp-modifier>]
+function isKernelAPI
+{
+    local api=$($_VSERVER_INFO - APIVER) || api=0
+    test $[ $api ] -${2:-ge} $[ $1 ]
+}
+
+## Usage: callInNamespace <vserver> <command> <args>*
+function callInNamespace
+{
+    local ctx=
+    
+    isAvoidNamespace "$1" || \
+    ctx=$( $_VSERVER_INFO "$1" CONTEXT t ) || ctx=
+
+    shift
+    if test "$ctx"; then
+       $_VNAMESPACE --enter "$ctx" -- "$@"
+    else
+       "$@"
+    fi
+}
+
+## Usage: pkgmgmt.guessStyle <vserver> <resultvar>
+function pkgmgmt.guessStyle()
+{
+    local vdir=$($_VSERVER_INFO "$1" VDIR) || {
+       echo $"Can not determine vserver-root" >&2
+       return 1
+    }
+    local cfgdir=$($_VSERVER_INFO "$1" APPDIR pkgmgmt) || :
+
+    if test "$cfgdir" -a -e "$cfgdir"/style; then
+       read style <"$cfgdir"/style
+    elif test -e "$vdir"/etc/redhat-release -o -e "$vdir"/etc/fedora-release; then
+       style=redhat
+    elif test -e "$vdir"/etc/mandrake-release; then
+       style=mandrake
+    elif test -e "$vdir"/etc/debian_version; then
+       style=debian
+    else
+       echo $"Can not determine packagemanagement style" >&2
+       return 1
+    fi
+
+    eval $2=\$style
+    return 0
+}
+
+## Usage: pkgmgmt.isInternal <vserver>
+## returns true iff <vserver> is configured for internal packagemanagement
+## A typical application is
+## | is_external=
+## | pkgmgmt.isInternal "$vserver" || is_external=1
+function pkgmgmt.isInternal
+{
+    local cfgdir=$($_VSERVER_INFO "$1" APPDIR pkgmgmt) || :
+
+    test -z "$cfgdir" -o ! -d "$cfgdir" -o -e "$cfgdir"/internal
+}