# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+_VS_NEWLINE='
+'
+declare -r _VS_NEWLINE=${_VS_NEWLINE:0-1}
+
function findObject
{
local mod=$1
findObject -d "$@"
}
+function findAndCopy
+{
+ local dst=$1
+ test ! -s "$dst" || return 0
+
+ local tmp
+ shift
+ findFile tmp "$@"
+
+ test "$tmp" -a -s "$tmp" || return 0
+ cp -af "$tmp" "$dst"
+}
+
function getPhysicalDir
{
( set -P && cd "$1" && pwd )
function _pkgSetVarsBase
{
case "$vserver" in
- /*)
- echo "not supported yet"
- exit 1
+ ./*|/*)
+ if test -d "$vserver/vdir"; then
+ BASEDIR=$vserver
+ VDIR=$(getPhysicalDir "$vserver/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 /
+ else
+ VDIR=$(getPhysicalDir "$vserver")
+ PKGDIR=
+ fi
;;
*)
BASEDIR=$CONFDIR/$vserver
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 /
function _pkgSetVarsRPM
{
- case "$vserver" in
- /*)
- echo "not supported yet"
- exit 1
- ;;
-
- *)
- findDir RPMETCDIR $PKGDIR/rpmetc $PKGDIR/base/rpm/etc /etc/rpm
- findDir RPMSTATEDIR $PKGDIR/rpmstate $PKGDIR/base/rpm/state
+ if test "$PKGDIR"; then
+ findDir RPMETCDIR $PKGDIR/rpmetc $PKGDIR/base/rpm/etc /etc/rpm
+ findDir RPMSTATEDIR $PKGDIR/rpmstate $PKGDIR/base/rpm/state
- findDir RPMLIBDIR $PKGDIR/rpmlib /
+ findDir RPMLIBDIR $PKGDIR/rpmlib /
- RPMSTATEDIR=$(getPhysicalDir "$RPMSTATEDIR")
- RPMETCDIR=$(getPhysicalDir "$RPMETCDIR")
- ;;
- esac
+ else
+ findDir RPMETCDIR "$VDIR"/etc/rpm /etc/rpm
+ findDir RPMSTATEDIR "$VDIR"/var/lib/rpm
+ RPMLIBDIR=/
+ fi
+
+ RPMSTATEDIR=$(getPhysicalDir "$RPMSTATEDIR")
+ RPMETCDIR=$(getPhysicalDir "$RPMETCDIR")
}
function _pkgSetVarsApt
{
- case "$vserver" in
- /*)
- echo "not supported yet"
- exit 1
- ;;
-
- *)
- findDir APTETCDIR $PKGDIR/aptetc $PKGDIR/base/apt/etc /etc/apt
- findDir APTSTATEDIR $PKGDIR/aptstate $PKGDIR/base/apt/state
- findDir APTCACHEDIR $PKGDIR/aptcache $PKGDIR/base/apt/cache
- findDir APTARCHIVDIR $PKGDIR/aptarchives $PKGDIR/base/apt/archives /var/cache/apt/archives
- ;;
- esac
+ if test "$PKGDIR"; then
+ findDir APTETCDIR $PKGDIR/aptetc $PKGDIR/base/apt/etc /etc/apt
+ findDir APTSTATEDIR $PKGDIR/aptstate $PKGDIR/base/apt/state
+ findDir APTCACHEDIR $PKGDIR/aptcache $PKGDIR/base/apt/cache
+ findDir APTARCHIVDIR $PKGDIR/aptarchives $PKGDIR/base/apt/archives /var/cache/apt/archives
+ else
+ findDir APTETCDIR "$VDIR"/etc/apt /etc/apt
+ findDir APTSTATEDIR "$VDIR"/var/state/apt
+ 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
"$_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
case "$i" in
rpm) _pkgSetVarsRPM;;
apt) _pkgSetVarsApt;;
- *) echo "Unknown packaging flavor"; exit 1;;
+ *) echo "Unknown packaging flavor" >&2; exit 1;;
esac
done
_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
- local var=$1
+ 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
- eval "$var=\"$var ${i##$CONFDIR/}\""
+ _tmp=( "${_tmp[@]}" "${i##$CONFDIR/}")
done
+
+ 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
+
+ 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 )
+ let _tmp=_tmp+0
+ eval "$3"=\$_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
{
- local vdir=$1
- test -r "$vdir/run" || return 1
+ local ctx procnum
+
+ getVserverStatus "$1" ctx procnum 1 || return 1
+ test $procnum != 0 || return 1
+ test -z "$2" || eval "$2"=\$ctx
+ return 0
+}
+
+## Called as 'getFileValue <varname> <filename>'
+function getFileValue
+{
+ test -r "$2" || return 0
+ eval read "$1" <"$2"
+}
+
+## Called as 'getFileArray <varname> <filename>'
+function getFileArray
+{
+ test -r "$2" || return 0
+
+ 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 ]
+}
- local ctx
- read ctx <"$vdir"/run || { echo "Failed to read ctx information" >&2; return 0; }
+## Usage: callInNamespace <vserver> <command> <args>*
+function callInNamespace
+{
+ local ctx=
- local cnt=$($_VPS ax | $_AWK '{print $2}' | $_GREP -x "$ctx" | $_WC -l )
+ isAvoidNamespace "$1" || \
+ ctx=$( $_VSERVER_INFO "$1" CONTEXT t ) || ctx=
+
+ shift
+ if test "$ctx"; then
+ $_VNAMESPACE --enter "$ctx" -- "$@"
+ else
+ "$@"
+ fi
+}
- if test $cnt = 0; then
- ## Remove old lock-file
- rm -f $(readlink "$vdir/run")
+## 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
- return 0
+ 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
}