vsomething (3821B)
1 #! /bin/bash 2 # $Id$ 3 4 # Copyright (C) 2005 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> 5 # 6 # This program is free software; you can redistribute it and/or modify 7 # it under the terms of the GNU General Public License as published by 8 # the Free Software Foundation; version 2 of the License. 9 # 10 # This program is distributed in the hope that it will be useful, 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 # GNU General Public License for more details. 14 # 15 # You should have received a copy of the GNU General Public License 16 # along with this program; if not, write to the Free Software 17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 19 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars} 20 test -e "$UTIL_VSERVER_VARS" || { 21 echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2 22 exit 1 23 } 24 . "$UTIL_VSERVER_VARS" 25 . "$_LIB_FUNCTIONS" 26 . "$_LIB_VSERVER_FUNCTIONS" 27 28 29 function showHelp() 30 { 31 echo \ 32 $"Usage: $0 [--quiet|-q] [--debug] <cmd> [--] <vserver-name>* [<filter>] -- <params>+ 33 where <filter> is any combination of: 34 --all All guests 35 --running All running guests 36 --stopped All stopped guests 37 --marked All guests with a mark set 38 --unmarked All guests without a mark set 39 --mark <m> All guests with mark <m> set 40 41 Execute <cmd> <vserver> <params>* foreach vserver. 42 43 Report bugs to <$PACKAGE_BUGREPORT>." 44 exit 0 45 } 46 47 function showVersion() 48 { 49 echo \ 50 $"vsomething $PACKAGE_VERSION -- execute something for a set of vservers 51 This program is part of $PACKAGE_STRING 52 53 Copyright (C) 2005 Enrico Scholz 54 This program is free software; you may redistribute it under the terms of 55 the GNU General Public License. This program has absolutely no warranty." 56 exit 0 57 } 58 59 60 is_quiet= 61 declare -a vservers=() 62 63 tmp=$(getopt -o +q --long help,version,debug,quiet -n "$0" -- "$@") || exit 1 64 eval set -- "$tmp" 65 66 while true; do 67 case "$1" in 68 (--help) showHelp $0 ;; 69 (--version) showVersion ;; 70 (--debug) set -x;; 71 (--quiet|-q) is_quiet=1 ;; 72 (--) shift; break;; 73 (*) echo $"vserver: internal error; arg=='$1'" >&2; exit 1;; 74 esac 75 shift 76 done 77 78 test "$#" -ge 1 || \ 79 panic $"vsomething: no operation specified; try '--help' for more information" 80 81 cmd=$1 82 title=${VSOMETHING_TITLE:-$cmd} 83 shift 84 85 test "$1" != "--" || \ 86 shift 87 88 if getAllVserversByArg tmp "$@"; then 89 vservers=( "${vservers[@]}" "${tmp[@]}" ) 90 while test "$#" -ge 1 -a "$1" != "--"; do 91 shift 92 done 93 shift 94 else 95 while test "$#" -ge 1; do 96 case "$1" in 97 (--) shift; break;; 98 (*) vservers=( "${vservers[@]}" "$1" ) 99 esac 100 shift 101 done 102 fi 103 104 105 test "${#vservers[@]}" -ne 1 || is_quiet=1 106 107 108 cnt=0 109 res=255 110 for i in "${vservers[@]}"; do 111 cnt=$[ cnt + 1 ] 112 113 test -n "$is_quiet" || { 114 colorize bold echo -n "$title: operating on vserver " 115 colorize bold colorize emph echo "$i" 116 xtermTitle "$title: operating on vserver '$i' [$cnt/${#vservers[@]}]" 117 } 118 119 if test -n "$VSOMETHING_PKGMGMT"; then 120 if pkgmgmt.isInternal "$i"; then 121 $_VSERVER "$i" exec "$cmd" "$@" 122 else 123 _setVserverDir "$i" 124 # subshell so we don't have to clean up 125 ( _generateChbindOptions "$VSERVER_DIR" 126 _generateSpaceOptions "$VSERVER_DIR" 127 $_VSERVER "$i" status &> /dev/null || \ 128 CHBIND_CMD=() 129 callInNamespace "$i" \ 130 $_VNAMESPACE --new -- \ 131 "${CHBIND_CMD[@]}" \ 132 "$VSOMETHING_WORKER" "$i" "$@" ) 133 fi 134 else 135 "$cmd" "$i" "$@" 136 fi 137 138 res=$? 139 140 test $res -eq 0 -o -n "$is_quiet" || { 141 colorize error echo -n $"$title failed on vserver '$i' with errorcode $res" 142 echo 143 } 144 145 test -n "$is_quiet" || echo 146 done 147 148 test "$cnt" -ge 0 || warning $"No vservers specified" 149 exit $res