X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=scripts%2Fvrpm;fp=scripts%2Fvrpm;h=1ae226ab3e6eb10386b86b499519cc43b56b2ca4;hb=8cf13bb177d92c93eb73dc8939777150536c2d00;hp=86d2214533ed01d0eda8d9a4338f1df30c0219ec;hpb=6bf3f95de36c804c97716b2d0bdf10680c559044;p=util-vserver.git diff --git a/scripts/vrpm b/scripts/vrpm index 86d2214..1ae226a 100755 --- a/scripts/vrpm +++ b/scripts/vrpm @@ -1,12 +1,11 @@ -#!/bin/sh +#! /bin/bash +# $Id: vrpm,v 1.13 2005/01/27 21:24:44 ensc Exp $ # 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,95 @@ # 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" -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" +function showHelp() +{ + echo \ +$"Usage: $0 * [--all] [--quiet|-q] [--help] [--version] [--unify] -- + + +Report bugs to <$PACKAGE_BUGREPORT>." + + 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 $VROOTDIR && 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 $VROOTDIR/$serv $* - echo Updating server $serv - $SBINDIR/chcontext --silent $CTXOPT rpm --root $VROOTDIR/$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 - +function showVersion() +{ + echo \ +$"vrpm $PACKAGE_VERSION -- rpm for vservers +This program is part of $PACKAGE_STRING + +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 +} + +do_unify= +is_quiet= +declare -a vservers=() + +while test "$#" -ge 1; do + case "$1" in + --quiet|-q) + is_quiet=1 + ;; + --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 +test "${#vservers[@]}" -ne 1 || is_quiet=1 + +cnt=0 +res=255 + +for i in "${vservers[@]}"; do + cnt=$[ cnt + 1 ] + + test -n "$is_quiet" || { + colorize bold echo -n "vrpm: operating on vserver " + colorize bold colorize emph echo "$i" + xtermTitle "vrpm: operating on vserver '$i' [$cnt/${#vservers[@]}]" + } + + if pkgmgmt.isInternal "$i"; then + $_VSERVER "$i" exec rpm "$@" + else + callInNamespace "$i" \ + "$_VNAMESPACE" --new -- "$_VRPM_WORKER" "$i" "$@" + fi + res=$? + + test $res -eq 0 -o "$is_quiet" || { + colorize error echo -n $"vrpm failed on vserver '$i' with errorcode $res" + echo + } + + test -n "$is_quiet" || echo +done + +test -z "$do_unify" || echo "unify currently unsupported" >&2 +test "$cnt" -ge 0 || echo "No vservers specified" >&2 +exit $res