X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=scripts%2Ffunctions;h=2eac61f94e6e53312c165cd3ad13023a6db4ce47;hb=HEAD;hp=a2b4362341a34c7aff1ff8410e02e913ea6d8562;hpb=fb1b131fb3e0ba481a7868359f8a2c91eb91def2;p=util-vserver.git diff --git a/scripts/functions b/scripts/functions index a2b4362..2eac61f 100644 --- a/scripts/functions +++ b/scripts/functions @@ -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 @@ -268,16 +267,35 @@ function unlock _VS_LOCKS="$@" } -function _getVserverDir +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=`pwd`/$vserver ;; - /*) VSERVER_DIR=$vserver ;; - *) VSERVER_DIR=$__CONFDIR/$vserver;; + ./*) VSERVER_DIR="`get_init_cwd`/$vserver";; + /*) VSERVER_DIR="$vserver" ;; + *) VSERVER_DIR="$__CONFDIR/$vserver" ;; esac } +function _setVserverName +{ + VSERVER_NAME=$(basename "$VSERVER_DIR") +} + function _pkgMountBindDir() { test "$1" != "$2" || return 0 @@ -336,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 / @@ -380,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 { @@ -396,6 +427,11 @@ function _pkgMountYum : } +function _pkgMountUrpmi +{ + _pkgMountBindDir "$RPMSTATEDIR" "$URPMISTATEDIR/../../../.rpmdb" +} + function _pkgMountRPM { _pkgMountBindDir "$RPMETCDIR" /etc/rpm @@ -432,6 +468,11 @@ function _pkgSetEnvYum : } +function _pkgSetEnvUrpmi +{ + : +} + function _pkgSetEnvRPM { CUR_VSERVER=$vserver @@ -453,6 +494,7 @@ function pkgInit rpm) _pkgSetVarsRPM;; apt) _pkgSetVarsApt;; yum) _pkgSetVarsYum;; + urpmi) _pkgSetVarsUrpmi;; *) echo "Unknown packaging flavor" >&2; exit 1;; esac done @@ -463,6 +505,7 @@ function pkgInit rpm) _pkgMountRPM;; apt) _pkgMountApt;; yum) _pkgMountYum;; + urpmi) _pkgMountUrpmi;; esac done @@ -472,6 +515,7 @@ function pkgInit rpm) _pkgSetEnvRPM;; apt) _pkgSetEnvApt;; yum) _pkgSetEnvYum;; + urpmi) _pkgSetEnvUrpmi;; esac done @@ -496,10 +540,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 [*] @@ -507,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 @@ -523,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 @@ -532,21 +594,62 @@ function getAllVservers eval $1='( "${_ga_tmp[@]}" )' } +declare -r VS_ALLVSERVERS_ARGS=all,marked,unmarked,stopped,running,mark: ## Usage: getAllVserversByArg 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 @@ -557,7 +660,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 ) @@ -577,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") @@ -622,13 +731,17 @@ function getFileValue eval read "$_gfv_var" <"$_gfv_file" } -## Called as 'getFileArray ' +## Called as 'getFileArray +' 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 @@ -695,8 +808,12 @@ function setDefaultTTY "$__CONFDIR/.defaults/apps/init/tty" \ $2 /dev/null - exec <$ttyname - exec &>$ttyname + if test -f "$ttyname"; then + exec >$ttyname 2>&1 } ## Usage: killContext [] @@ -799,6 +916,27 @@ function pkgmgmt.isYumAvailable test -n "$have_yum" && return 0 || return 1 } +## Usage: pkgmgmt.isUrpmiAvailable [] +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 { @@ -826,9 +964,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 @@ -960,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 } @@ -1044,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