X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fscripts%2Ffunctions;h=eb8e863e2619213e8a30d92bff09c3c5b7b2d2cd;hb=a8d292acbadef48cd3f2062015a72fc0f267e96a;hp=189f462bb9c268dd15aa5ce10979ec56f817731a;hpb=5ff92b84743739274ba5081f94489a6daace1006;p=util-vserver.git diff --git a/util-vserver/scripts/functions b/util-vserver/scripts/functions index 189f462..eb8e863 100644 --- a/util-vserver/scripts/functions +++ b/util-vserver/scripts/functions @@ -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 @@ -78,7 +118,7 @@ function _pkgMountBindDir() function _pkgSetVarsBase { case "$vserver" in - /*) + ./*|/*) if test -d "$vserver/vdir"; then BASEDIR=$vserver VDIR=$(getPhysicalDir "$vserver/vdir") @@ -87,7 +127,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 +139,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 +194,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 +216,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 +256,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,6 +280,17 @@ 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 @@ -243,6 +300,9 @@ function getAllVservers test -d "$i" || continue test ! -e "$i"/disabled || continue test -d "$i"/vdir || continue + case "$i" in + *.~*~) continue;; + esac _tmp=( "${_tmp[@]}" "${i##$CONFDIR/}") done @@ -251,22 +311,36 @@ function getAllVservers } ## Usage: getVserverCtx [ []] +## 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 +function isCtxRunning +{ + local _tmp=$($_VPS ax | $_AWK '{print $2}' | $_GREP -x "$1" | $_WC -l ) + test $_tmp -gt 0 +} + ## Usage: isVserverRunning [] function isVserverRunning { @@ -288,7 +362,7 @@ function getFileValue ## Called as 'getFileArray ' function getFileArray { - test -r "$2" || return 0 + test -r "$2" || return 1 local IFS=$_VS_NEWLINE eval "$1"='( $(< "$2") )' @@ -309,7 +383,7 @@ function checkComponents 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'" + *) echo "Unknown component '$i'" >&2 return false ;; esac @@ -317,8 +391,293 @@ function checkComponents test -z "$failed" || { echo "$msg: $i" x_failed=1 - } + } >&2 done test -z "$x_failed" } + +## Usage: isKernelAPI [] +function isKernelAPI +{ + local api=$($_VSERVER_INFO - APIVER) || api=0 + test $[ $api ] -${2:-ge} $[ $1 ] +} + +## Usage: callInNamespace * +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 +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 + elif test -e "$vdir"/etc/SuSE-release; then + style=suse + else + echo $"Can not determine packagemanagement style" >&2 + return 1 + fi + + eval $2=\$style + return 0 +} + +## Usage: pkgmgmt.isInternal +## returns true iff 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 +} + +## Usage: pkgmgmt.isAptAvailable [] +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 [