X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fscripts%2Fvrpm;h=2a2094320646c12afc7143f01ba32d4d78288dda;hb=c574f33e210c3438945209d685c218c51f74cbaa;hp=8c5e8d5278bd1e4072aa93c3fad0192d34108ded;hpb=da691fd4bad5e187b307b7fd86bf5fd61e47c3fc;p=util-vserver.git diff --git a/util-vserver/scripts/vrpm b/util-vserver/scripts/vrpm index 8c5e8d5..2a20943 100755 --- a/util-vserver/scripts/vrpm +++ b/util-vserver/scripts/vrpm @@ -1,12 +1,11 @@ -#!/bin/sh +#! /bin/bash +# $Id$ # Copyright (C) 2003 Enrico Scholz -# based on vrpm by Jacques Gelinas # # 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. +# 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 @@ -17,89 +16,77 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# Wrapper to update/install package in many vservers at once - -: ${UTIL_VSERVER_VARS:=$(dirname $0)/util-vserver-vars} +: ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars} test -e "$UTIL_VSERVER_VARS" || { - echo "Can not find util-vserver installation; aborting..." + 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 * [--all] [--help] [--version] [--unify] -- + + +Report bugs to <$PACKAGE_BUGREPORT>." + + exit $1 +} + +function showVersion() +{ + echo \ +$"vrpm $PACKAGE_VERSION -- rpm for vservers +This program is part of $PACKAGE_STRING -usage(){ - echo vrpm: Install/Updates packages in several vservers at once - echo vrpm vservers ... -- rpm options and packages - echo vrpm \[--unify\] ALL -- rpm options and packages - echo vrpm \[--unify\] server1 server2 -- -Uvh package.rpm - echo - echo vrpm is executed in the root server - echo "--unify run vunify on the vserver for the updated packages" +Copyright (C) 2003 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 $1 } -UNIFY=no -if [ "$1" = "--unify" ] ; then - UNIFY=yes - shift -fi -if [ $# = 0 ] ; then - usage -else - SERVERS= - while [ $# -gt 0 -a "$1" != "--" ] - do - if [ "$1" = "ALL" ] ; then - SERVERS=`cd /vservers && ls` - else - SERVERS="$SERVERS $1" - fi - shift - done - if [ "$1" != "--" ] ; then - usage - elif [ "$SERVERS" = "" ] ; then - echo no server specified - echo - usage - else - shift - for serv in $SERVERS - do - # We try to run the rpm command in the same security - # context than the vserver, if running. - # This way, process operations will be done in the proper - # context - # If the vserver is not running, chcontext will - # pick an unused one. - CTXOPT="" - CTXFILE=/var/run/vservers/$serv.ctx - if [ -f $CTXFILE ] ; then - source $CTXFILE - CTXOPT="--ctx $S_CONTEXT" - fi - #echo rpm --root /vservers/$serv $* - echo Updating server $serv - /usr/sbin/chcontext --silent $CTXOPT rpm --root /vservers/$serv $* - done - if [ "$UNIFY" = "yes" ] ; then - PACKAGES= - for pkg in $* - do - case $pkg in - -*) - # RPM options ? - ;; - --*) - # RPM options ? - ;; - *) - pkg=`rpm -qp $pkg --queryformat %{name}` - PACKAGES="$PACKAGES $pkg" - ;; - esac - done - echo Unification - $PKGLIBDIR/vunify --excldir /var/log $SERVERS -- $PACKAGES - fi - fi -fi - +do_unify= +declare -a vservers=() + +while test "$#" -ge 1; do + case "$1" in + --all) + getAllVservers tmp + vservers=( "${vservers[@]}" "${tmp[@]}" ) + ;; + --unify) + do_unify=1 + ;; + --) + shift; break;; + --help) + showHelp 0;; + --version) + showVersion 0;; + *) vservers=( "${vservers[@]}" "$1" ) + esac + shift +done + +test "$#" -ge 1 || showHelp 1 >&2 + +cnt=0 +res=255 +for i in "${vservers[@]}"; do + cnt=$[ cnt + 1 ] + + if pkgmgmt.isInternal "$i"; then + $_VSERVER "$i" exec rpm "$@" + else + callInNamespace "$i" \ + "$_VNAMESPACE" --new -- "$_VRPM_WORKER" "$i" "$@" + fi + + res=$? +done + +test -z "$do_unify" || echo "unify currently unsupported" >&2 +test "$cnt" -ge 0 || echo "No vservers specified" >&2 +exit $res