#!/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 (the file '$UTIL_VSERVER_VARS' would be expected); 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.... have_apt=1 pkgmgmt.isAptAvailable "$cfgdir" "$vdir" "$is_internalize" || have_apt= 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