gentoo: use /var/run for new /run compatibility
[util-vserver.git] / scripts / functions
index 0edb7a3..2eac61f 100644 (file)
@@ -21,7 +21,6 @@ _VS_ERRFILE=
 _VS_NEWLINE='
 '
 declare -r _VS_NEWLINE=${_VS_NEWLINE:0-1}
-declare -r VS_ALLVSERVERS_ARGS=all,marked,unmarked,stopped,running
 
 function findObject
 {
@@ -92,7 +91,7 @@ function isDirectoryEmpty
        shopt -s nullglob || *
 
        ignore_lostfound=1
-       test -z "$2" -o "$2" = 0 || ignore_lostfound=
+       test -n "$2" -a "$2" != 0 || ignore_lostfound=
        
        for i in "$1"/*; do
            case "$i" in
@@ -282,7 +281,7 @@ function set_init_cwd
     export INIT_CWD
 }
 
-function _getVserverDir
+function _setVserverDir
 {
     local vserver="$1"
     case "$vserver" in
@@ -292,6 +291,11 @@ function _getVserverDir
     esac
 }
 
+function _setVserverName
+{
+    VSERVER_NAME=$(basename "$VSERVER_DIR")
+}
+
 function _pkgMountBindDir()
 {
     test "$1" != "$2" || return 0
@@ -350,8 +354,10 @@ function _pkgSetVarsBase
 function _pkgSetVarsRPM
 {
     if test -n "$PKGDIR"; then
-       findDir RPMETCDIR    $PKGDIR/rpmetc      $PKGDIR/base/rpm/etc       /etc/rpm
-       findDir RPMSTATEDIR  $PKGDIR/rpmstate    $PKGDIR/base/rpm/state
+       findDir RPMETCDIR    $PKGDIR/rpmetc        $PKGDIR/base/rpm/etc   \
+                            $PKGDIR/base/etc/rpm  /etc/rpm
+       findDir RPMSTATEDIR  $PKGDIR/rpmstate      $PKGDIR/base/rpm/state \
+                            $PKGDIR/base/var/lib/rpm
 
        findDir RPMLIBDIR    $PKGDIR/rpmlib      /
 
@@ -394,6 +400,17 @@ function _pkgSetVarsYum
     fi
 }
 
+function _pkgSetVarsUrpmi
+{
+    if test -n "$PKGDIR"; then
+       findDir URPMIETCDIR    $PKGDIR/urpmietc    $PKGDIR/base/etc/urpmi       /etc/urpmi
+       findDir URPMISTATEDIR  $PKGDIR/urpmistate  $PKGDIR/base/var/lib/urpmi
+    else
+       findDir URPMIETCDIR    "$VDIR"/etc/urpmi     /etc/urpmi
+       findDir URPMISTATEDIR  "$VDIR"/var/lib/urpmi /var/lib/urpmi
+    fi
+}
+
 
 function _pkgMountBase
 {
@@ -410,6 +427,11 @@ function _pkgMountYum
     :
 }
 
+function _pkgMountUrpmi
+{
+    _pkgMountBindDir "$RPMSTATEDIR" "$URPMISTATEDIR/../../../.rpmdb"
+}
+
 function _pkgMountRPM
 {
     _pkgMountBindDir "$RPMETCDIR" /etc/rpm
@@ -446,6 +468,11 @@ function _pkgSetEnvYum
     :
 }
 
+function _pkgSetEnvUrpmi
+{
+    :
+}
+
 function _pkgSetEnvRPM
 {
     CUR_VSERVER=$vserver
@@ -467,6 +494,7 @@ function pkgInit
            rpm)        _pkgSetVarsRPM;;
            apt)        _pkgSetVarsApt;;
            yum)        _pkgSetVarsYum;;
+           urpmi)      _pkgSetVarsUrpmi;;
            *)          echo "Unknown packaging flavor" >&2; exit 1;;
        esac
     done
@@ -477,6 +505,7 @@ function pkgInit
            rpm)        _pkgMountRPM;;
            apt)        _pkgMountApt;;
            yum)        _pkgMountYum;;
+           urpmi)      _pkgMountUrpmi;;
        esac
     done
 
@@ -486,6 +515,7 @@ function pkgInit
            rpm)        _pkgSetEnvRPM;;
            apt)        _pkgSetEnvApt;;
            yum)        _pkgSetEnvYum;;
+           urpmi)      _pkgSetEnvUrpmi;;
        esac
     done
 
@@ -510,6 +540,7 @@ function isNamespaceCleanup
 
     $_VSERVER_INFO - FEATURE namespace   || return 1
     cfgdir=$($_VSERVER_INFO "$1" CFGDIR) || 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
@@ -521,6 +552,10 @@ function getAllVservers
 {
     local _ga_i
     declare -a _ga_tmp=()
+    local _ga_IFS="$IFS"
+    IFS=,
+    local -a _ga_marks=( $3 )
+    IFS="$_ga_IFS"
 
     for _ga_i in $__CONFDIR/*; do
        isRegularFile "$_ga_i" -d   || continue
@@ -537,6 +572,19 @@ function getAllVservers
            (STOPPED)   ! $_VSERVER "$_ga_i" running &>/dev/null || _ga_doadd=;;
            (RUNNING)     $_VSERVER "$_ga_i" running &>/dev/null || _ga_doadd=;;
            (ALL)       ;;
+           (MARK)      local _ga_j
+                       local _ga_mark
+                       local _ga_f=false
+                       local _ga_invert=false
+                       for _ga_j in "${_ga_marks[@]}"; do
+                           _ga_mark="$(echo "$_ga_j" | $_SED 's/^[!~]//')"
+                           test "$_ga_j" = "$_ga_mark" || _ga_invert=true
+                           test -s "$_ga_markfile" && $_GREP -qx "$_ga_mark" "$_ga_markfile" && \
+                               _ga_f=true || :
+                       done
+                       test $_ga_f = $_ga_invert && \
+                           _ga_doadd=
+                       ;;
            (*)         panic $"Unknown vserver tagging '$2'";;
        esac
 
@@ -546,21 +594,62 @@ function getAllVservers
     eval $1='( "${_ga_tmp[@]}" )'
 }
 
+declare -r VS_ALLVSERVERS_ARGS=all,marked,unmarked,stopped,running,mark:
 ## Usage: getAllVserversByArg <var> <arg>
 function getAllVserversByArg
 {
     local _gav_mark=
-    
-    case $2 in
-       (--all)         _gav_mark=ALL;;
-       (--marked)      _gav_mark=MARKED;;
-       (--unmarked)    _gav_mark=UNMARKED;;
-       (--stopped)     _gav_mark=STOPPED;;
-       (--running)     _gav_mark=RUNNING;;
-       (*)             return 1;;
-    esac
+    local _gav_v="$1"
+    local _gav_first=1
+    local _gav_res=()
+    shift
+
+    while test "$#" -ge 1; do
+       local _gav_extra=
+        local _gav_tmp=()
+
+       case "$1" in
+           (--all)             _gav_mark=ALL;;
+           (--marked)          _gav_mark=MARKED;;
+           (--unmarked)        _gav_mark=UNMARKED;;
+           (--stopped)         _gav_mark=STOPPED;;
+           (--running)         _gav_mark=RUNNING;;
+           (--mark*)           _gav_mark=MARK
+                               _gav_extra=${_gav_i##*=}
+                               test -n "$_gav_extra" -a "$_gav_extra" != "--mark" || \
+                                   _gav_extra="$2"
+                               shift
+                               ;;
+           (--)                break;;
+           (*)                 set -- "$_gav_v" "$@"
+                               return 1;;
+       esac
 
-    getAllVservers "$1" "$_gav_mark"
+       getAllVservers _gav_tmp "$_gav_mark" $_gav_extra
+       if test -n "$_gav_first"; then
+           _gav_res=( "${_gav_tmp[@]}" )
+       else
+           local _gav_i=0
+           local _gav_n="${#_gav_res[@]}"
+           while test $_gav_i -lt $_gav_n; do
+               local _gav_found=0
+               for _gav_j in "${_gav_tmp[@]}"; do
+                   if test "$_gav_j" = "${_gav_res[$_gav_i]}"; then
+                       _gav_found=1
+                       break
+                   fi
+               done
+               if test "$_gav_found" = 0; then
+                   unset _gav_res[$_gav_i]
+               fi
+               let ++_gav_i
+           done
+           _gav_res=( "${_gav_res[@]}" )
+       fi
+       shift
+       _gav_first=
+    done
+    eval $_gav_v='( "${_gav_res[@]}" )'
 }
 
 ## Usage: _getProcNumberCount <ctx> <var>
@@ -591,10 +680,16 @@ function getVserverStatus
     read _gvs_ctx <"$1"/run
     eval "$2"=\$_gvs_ctx
 
-    test -n "$3"     || return 0
-    local _gvs_tmp
-    _getProcNumberCount "$_gvs_ctx" _gvs_tmp
-    eval "$3"=\$_gvs_tmp
+    if test "$1" = "$($_VUNAME -g --xid "$_gvs_ctx" context)"; then
+       test -n "$3" || return 0
+       local _gvs_tmp
+       _getProcNumberCount "$_gvs_ctx" _gvs_tmp
+       eval "$3"=\$_gvs_tmp
+    else
+       test -n "$3" || return 1
+       eval "$3"=0
+       _gvs_tmp=0
+    fi
 
     if test "$_gvs_tmp" = 0; then
        local runfile=$($_READLINK "$1/run")
@@ -713,8 +808,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>]
@@ -817,6 +916,27 @@ function pkgmgmt.isYumAvailable
     test -n "$have_yum" && return 0 || return 1
 }
 
+## Usage: pkgmgmt.isUrpmiAvailable <cfgdir> <vdir> [<is-internal>]
+function pkgmgmt.isUrpmiAvailable
+{
+    local cfgdir="$1"
+    local vdir="$2"
+    local is_internal="$3"
+    
+    local have_urpmi i
+    if test -n "$is_internal"; then
+       have_urpmi=1
+       test -d "$cfgdir"/base/var/lib/urpmi || have_urpmi=
+    else
+       have_urpmi=
+       for i in /bin /usr/bin /usr/local/bin; do
+           test ! -x "$vdir$i"/urpmi || { have_urpmi=1; break; }
+       done
+    fi
+
+    test -n "$have_urpmi" && return 0 || return 1
+}
+
 
 function vshelper.doSanityCheck
 {
@@ -980,7 +1100,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
     }
 
@@ -1064,6 +1188,12 @@ 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
 {
     local ctx=$1