#!/bin/bash
# $Id: vpkg,v 1.11 2005/03/18 00:23:02 ensc Exp $

# Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
#  
# 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; either version 2, or (at your option)
# any later version.
#  
# 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"

function showHelp()
{
    echo \
$"Usage: $0 <vserver-name> <tag>

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
}


case "$1" in
    (--help)	showHelp $(basename $0);;
    (--version)	showVersion ;;
esac

test "$1" -a "$2" || {
    echo $"No vserver and/or tag given; use '--help' for more information" >&2
    exit 1
}

vserver=$1
tag=$2
shift 2

case "$tag" in
    get-conffiles|install)	;;
    *)		echo $"Unsupport tag '$tag'" >&2; exit 1;;
esac

cfgdir=$($_VSERVER_INFO "$vserver" APPDIR pkgmgmt) || :
vdir=$($_VSERVER_INFO "$1" VDIR) || :

style=
is_external=
pkgmgmt.guessStyle "$vserver" style || exit 2
pkgmgmt.isInternal "$vserver"       || is_external=1

cmd=()

case "$style" in
    (redhat|mandrake)
	rpm_param=
	apt_param=
	case "$tag" in
	    ## rpm outputs sometimes '(contains no files)', so return
	    ## only the valid output
	    (get-conffiles)
		rpm_param=( -qac --pipe "$_SED '\!^/!p;d'" );;
	    (install)
		rpm_param=( -Uvh "$@" )
		apt_param=( install "$@" )
		;;
	esac
	
	if test -n "$is_external"; 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
	
	if test -n "$is_external"; then
	    if test "$have_apt" -a "$apt_param"; then
		cmd=( "$_VAPT_GET" "$vserver" -- "${apt_param[@]}" )
	    else
		cmd=( "$_VRPM" "$vserver" -- "${rpm_param[@]}" )
	    fi
	else
	    if test "$have_apt" -a "$apt_param"; then
		cmd=( "$_VSERVER" --silent "$vserver" exec apt-get "${apt_param[@]}" )
	    else
		cmd=( "$_VSERVER" --silent "$vserver" exec rpm "${rpm_param[@]}" )
	    fi
	fi
	;;
    (debian)
	case "$tag" in
	    (get-conffiles)
		cmd=( sh -c "cat /var/lib/dpkg/info/*.conffiles 2>/dev/null" )
		;;
	    (install)
		cmd=( apt-get install "$@" )
		;;
	esac

	if test -n "$is_external"; then
	    echo $"'external' packagemanagement is not supported for Debian" >&2
	    exit 1
	else
	    cmd=( "$_VSERVER" --silent "$vserver" exec "${cmd[@]}" )
	fi
	;;
    (*)
	echo $"Packagemanagement is not supported for '$style' style" >&2
	exit 2
	;;
esac

export LANG=C
exec "${cmd[@]}"
