From 3d3c9e96f398fe4eddd4c73bcc50386ca8a8812e Mon Sep 17 00:00:00 2001 From: Enrico Scholz Date: Thu, 18 Mar 2004 05:29:25 +0000 Subject: [PATCH] initial checkin git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@1293 94cd875c-1c1d-0410-91d2-eb244daf1a30 --- util-vserver/scripts/pkgmgmt | 349 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 349 insertions(+) create mode 100755 util-vserver/scripts/pkgmgmt diff --git a/util-vserver/scripts/pkgmgmt b/util-vserver/scripts/pkgmgmt new file mode 100755 index 0000000..1ab232a --- /dev/null +++ b/util-vserver/scripts/pkgmgmt @@ -0,0 +1,349 @@ +#!/bin/bash +# $Id$ + +# Copyright (C) 2004 Enrico Scholz +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +: ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars} +test -e "$UTIL_VSERVER_VARS" || { + echo "Can not find util-vserver installation; aborting..." >&2 + exit 1 +} +. "$UTIL_VSERVER_VARS" +. "$_LIB_FUNCTIONS" +. "$_LIB_VSERVER_BUILD_FUNCTIONS_PKGMGMT" + +function showHelp() +{ + echo \ +$"Usage: $0 --externalize|--internalize [-y] [--] + +Report bugs to <$PACKAGE_BUGREPORT>." + exit 0 +} + +function showVersion() +{ + echo $"\ +vpkg $PACKAGE_VERSION -- shows information about packages in vservers +This program is part of $PACKAGE_STRING + +Copyright (C) 2004 Enrico Scholz +This program is free software; you may redistribute it under the terms of +the GNU General Public License. This program has absolutely no warranty." + exit 0 +} + +function init() +{ + if test -z "$WORKAROUND_106057"; then + rpmdb_mntpoint=/dev + else + rpmdb_mntpoint=/.rpmdb + fi + pkgmgmt.initVariables +} + +function _createDirs() +{ + for i; do + test "$i" || continue + mkdir -p -m755 "$i" + done +} + +function _copySecure() +{ + local chroot=$1 + local srcdir=$2 + local dstdir=$3 + + + ( cd "$srcdir" && tar chf - '.' ) | \ + ( cd "$chroot" && $_EXEC_CD "$dstdir" $_TAR xf - ) +} + +function _copySecureRev() +{ + local chroot=$1 + local srcdir=$2 + local dstdir=$3 + + ( cd "$chroot" && $_EXEC_CD "$srcdir" $_TAR cf - '.' ) | \ + ( cd "$dstdir" && tar xf - ) +} + +function _hashAuto() +{ + local hash=$2 + local dir=$(dirname "$1") + local file=$(basename "$1") + + $_EXEC_CD "$dir" "$(which test)" "$file" || return 0 + + local tmp=$(mktemp /tmp/apt.conf.XXXXXX) + trap "rm -f $tmp" EXIT + + $_EXEC_CD "$dir" /bin/cat "$file" | \ + sed -e "s|^\([^$hash].*@autogenerated@\)|$hash$hash\1|" >$tmp + + cat $tmp | $_EXEC_CD "$dir" "$(which cmp)" -s - "$file" || \ + $_CHROOT_CAT "$1" <$tmp + + rm -f $tmp +} + +function _unhashAuto() +{ + test -e "$1" || return 0 + + local hash=$2 + local tmp=$(mktemp /tmp/apt.conf.XXXXXX) + trap "rm -f $tmp" EXIT + + sed -e "s|^$hash$hash\(.*@autogenerated@\)|\1|" "$1" >$tmp + cmp -s "$tmp" "$1" || \ + cat "$tmp" >"$1" + + rm -f $tmp +} + +function processVserver_RH() +{ + local vserver=$1 + local is_internalize=$2 + local have_apt + local cfgdir + local i + + cfgdir=$($_VSERVER_INFO "$vserver" APPDIR pkgmgmt) || \ + cfgdir=$($_VSERVER_INFO "$vserver" APPDIR)/pkgmgmt + + ## Figure out the environment.... + if test "$is_internalize"; 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 + + local APTETCDIR= + local APTSTATEDIR= + local APTCACHEDIR= + local APTARCHIVDIR= + local RPMETCDIR= + local RPMSTATEDIR= + + ## Create directories and assign variables where configuration + ## can/will be found on the host + if test "$is_internalize"; then + pushd "$vdir" >/dev/null + + test ! -L var/lib/rpm || { + $_EXEC_CD /var/lib /bin/rm rpm && + $_EXEC_CD /var/lib /bin/mkdir -m755 rpm && + $_EXEC_CD /var/lib /bin/chown rpm:rpm rpm || + : + } /dev/null + + for i in var/cache/apt/{,archives/{,partial},genpkglist,gensrclist} \ + var/state/{,apt/{,lists/{,partial}}} \ + etc/apt etc/rpm; do + test -d "$i" || + $_EXEC_CD /$(dirname "$i") /bin/mkdir -m755 $(basename "$i") || : + done #2>/dev/null + + popd >/dev/null + + if test "$have_apt"; then + findDir APTETCDIR "$cfgdir"/aptetc "$cfgdir"/base/apt/etc /etc/apt / + fi + + findDir RPMETCDIR "$cfgdir"/rpmetc "$cfgdir"/base/rpm/etc /etc/rpm / + findDir RPMSTATEDIR "$cfgdir"/rpmstate "$cfgdir"/base/rpm/state + else + mkdir -m755 -p "$cfgdir" + local need_base= + + if test "$have_apt"; then + findDir APTETCDIR "$cfgdir"/aptetc "$cfgdir"/base/apt/etc / + findDir APTSTATEDIR "$cfgdir"/aptstate "$cfgdir"/base/apt/state / + findDir APTCACHEDIR "$cfgdir"/aptcache "$cfgdir"/base/apt/cache / + findDir APTARCHIVDIR "$cfgdir"/aptarchives "$cfgdir"/base/apt/archives / + + test "$APTETCDIR" != / || APTETCDIR=$cfgdir/base/apt/etc + test "$APTSTATEDIR" != / || APTSTATEDIR=$cfgdir/base/apt/state + test "$APTCACHEDIR" != / || APTCACHEDIR=$cfgdir/base/apt/cache + test "$APTARCHIVDIR" != / || APTARCHIVDIR=$cfgdir/base/apt/archive + + test -d "$cfgdir"/aptetc -a -d "$cfgdir"/aptstate -a \ + -d "$cfgdir"/aptcache -a -d "$cfgdir"/aptarchives || need_base=1 + fi + + findDir RPMETCDIR "$cfgdir"/rpmetc "$cfgdir"/base/rpm/etc / + findDir RPMSTATEDIR "$cfgdir"/rpmstate "$cfgdir"/base/rpm/state / + + test "$RPMETCDIR" != / || RPMETCDIR=$cfgdir/base/rpm/etc + test "$RPMSTATEDIR" != / || RPMSTATEDIR=$cfgdir/base/rpm/state + + test -d "$cfgdir"/rpmetc -a -d "$cfgdir"/rpmstate || need_base=1 + test ! -e "$cfgdir"/base || need_base= + + test -z "$need_base" || ln -s "$PKGCFGDIR" "$cfgdir"/base + + mkdir -m755 -p "$PKGCFGDIR" + _createDirs "$APTETCDIR" "$APTSTATEDIR" "$APTCACHEDIR" "$APTARCHIVDIR" \ + "$RPMETCDIR" "$RPMSTATEDIR" + fi + + ## Copy the files... + if test "$is_internalize"; then + if test "$have_apt"; then + _copySecure "$vdir" "$APTETCDIR" /etc/apt + pushd "$vdir" >/dev/null + _hashAuto /etc/apt/apt.conf '/' + popd >/dev/null + fi + + _copySecure "$vdir" "$RPMETCDIR" /etc/rpm + _copySecure "$vdir" "$RPMSTATEDIR" /var/lib/rpm + + else + if test "$have_apt"; then + _copySecureRev "$vdir" /etc/apt "$APTETCDIR" + _unhashAuto "$APTETCDIR"/apt.conf '/' + fi + + _copySecureRev "$vdir" /etc/rpm "$RPMETCDIR" + _copySecureRev "$vdir" /var/lib/rpm "$RPMSTATEDIR" + fi + + ## Cleanups... + if test "$is_internalize"; then + : + else + tmpdir=$(mktemp -d /var/tmp/pgmgmt.XXXXXX) + trap "rm -rf $tmpdir" EXIT + pushd "$vdir" >/dev/null + $_EXEC_CD /var/lib /bin/mv rpm $tmpdir/ + $_EXEC_CD /var/lib /bin/ln -s "$rpmdb_mntpoint" rpm + rm -rf $tmpdir + fi + + ## Finish it... + if test "$is_internalize"; then + touch "$cfgdir"/internal + else + rm -f "$cfgdir"/internal + fi +} + +function processVserver_Debian() +{ + local vserver=$1 + local is_internalize=$2 + + if test "$is_internalize"; then + echo $"Debian vservers should be internalized everytime; do not know how to handle '$vserver'" >&2 + else + echo $"External packagemanagement is not supported for Debian vserver" >&2 + fi + + return 1 +} + +function processVserver() +{ + local vserver=$1 + local is_external= + local skip=1 + local vdir + + ! $_VSERVER_INFO -q "$vserver" RUNNING || { + echo $"Can not operate on running vservers; please stop '$vserver' and retry again..." + return 1 + } >&2 + + vdir=$($_VSERVER_INFO "$vserver" VDIR) && test -d "$vdir" || { + echo $"Vserver '$vserver' does not seem to exist; skipping it..." + return 1 + } >&2 + + pkgmgmt.isInternal "$vserver" || is_external=1 + + case "$is_external"X"$IS_INTERNALIZE"X"$IS_EXTERNALIZE" in + (*X1X1) echo $"Can not externalize and internalize at the same time";; + (*XX) echo $"No operation specified; try '--help' for more information";; + (1XX1) echo $"Vserver '$vserver' has already external packagemanagment; skipping it...";; + (X1X) echo $"Vserver '$vserver' has already internal packagemanagment; skipping it...";; + (*) skip= + esac >&2 + + test -z "$skip" || return 1 + + local style + pkgmgmt.guessStyle "$vserver" style || return 1 + + case "$style" in + (redhat|mandrake) processVserver_RH "$vserver" "$IS_INTERNALIZE";; + (debian) processVserver_Debian "$vserver" "$IS_INTERNALIZE";; + (*) + echo $"Vserver style '$style' is not supported for packagemanagment" >&2 + return 1 + esac +} + +tmp=$(getopt -o y --long debug,externalize,internalize,help,version -n "$0" -- "$@") || exit 1 +eval set -- "$tmp" + +IS_EXTERNALIZE= +IS_INTERNALIZE= +IS_YES= + +while true; do + case "$1" in + (--help) showHelp $0;; + (--version) showVersion;; + (--debug) set -x;; + (--externalize) IS_EXTERNALIZE=1;; + (--internalize) IS_INTERNALIZE=1;; + (-y) IS_YES=1;; + (--) shift; break;; + (*) echo $"vserver: internal error; arg=='$1'" >&2; exit 1;; + esac + shift +done + +test "$1" || { + echo $"No vserver specified; try '--help' for more information" + exit 1 +} >&2 + + +set -e +init + +ok=1 +passed= +for i; do + processVserver "$i" && passed=1 || ok= +done + +test -z "$ok" || exit 0 +test -z "$passed" || exit 1 +exit 2 -- 1.8.1.5