#!/bin/sh # Wrapper to update/install package in many vservers at once USR_LIB_VSERVER=/usr/lib/vserver ETC_VSERVERS=/etc/vservers 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" } 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 $ETC_VSERVERS && ls *.conf | sed s/.conf//` 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 eval `$USR_LIB_VSERVER/printconf.sh --quote $serv` /usr/sbin/chcontext --silent $CTXOPT rpm --root $VSERVERDIR $* 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 $USR_LIB_VSERVER/vunify --excldir /etc --excldir /var/log $SERVERS -- $PACKAGES fi fi fi