New vsomething features.
authorDaniel Hokka Zakrisson <daniel@hozac.com>
Sat, 6 Nov 2010 21:32:25 +0000 (21:32 +0000)
committerDaniel Hokka Zakrisson <daniel@hozac.com>
Sat, 6 Nov 2010 21:32:25 +0000 (21:32 +0000)
git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@2923 94cd875c-1c1d-0410-91d2-eb244daf1a30

scripts/functions
scripts/vsomething

index c1be17f..32863d8 100644 (file)
@@ -543,6 +543,7 @@ function getAllVservers
            (STOPPED)   ! $_VSERVER "$_ga_i" running &>/dev/null || _ga_doadd=;;
            (RUNNING)     $_VSERVER "$_ga_i" running &>/dev/null || _ga_doadd=;;
            (ALL)       ;;
+           (MARK)      test -s "$_ga_markfile" && grep -qx "$3" "$_ga_markfile" || _ga_doadd=;;
            (*)         panic $"Unknown vserver tagging '$2'";;
        esac
 
@@ -556,17 +557,55 @@ function getAllVservers
 function getAllVserversByArg
 {
     local _gav_mark=
-    
-    case $2 in
-       (--all)         _gav_mark=ALL;;
-       (--marked)      _gav_mark=MARKED;;
-       (--unmarked)    _gav_mark=UNMARKED;;
-       (--stopped)     _gav_mark=STOPPED;;
-       (--running)     _gav_mark=RUNNING;;
-       (*)             return 1;;
-    esac
+    local _gav_v="$1"
+    local _gav_first=1
+    local _gav_res=()
+    shift
+
+    while test "$#" -ge 1; do
+       local _gav_extra=
+        local _gav_tmp=()
+
+       case "$1" in
+           (--all)             _gav_mark=ALL;;
+           (--marked)          _gav_mark=MARKED;;
+           (--unmarked)        _gav_mark=UNMARKED;;
+           (--stopped)         _gav_mark=STOPPED;;
+           (--running)         _gav_mark=RUNNING;;
+           (--mark*)           _gav_mark=MARK
+                               _gav_extra=${_gav_i##*=}
+                               test -n "$_gav_extra" -a "$_gav_extra" != "--mark" || \
+                                   _gav_extra="$2"
+                               shift
+                               ;;
+           (--)                break;;
+           (*)                 return 1;;
+       esac
 
-    getAllVservers "$1" "$_gav_mark"
+       getAllVservers _gav_tmp "$_gav_mark" $_gav_extra
+       if test -n "$_gav_first"; then
+           _gav_res=( "${_gav_tmp[@]}" )
+       else
+           local _gav_i=0
+           while test $_gav_i -lt "${#_gav_res[@]}"; do
+               local _gav_found=0
+               for _gav_j in "${_gav_tmp[@]}"; do
+                   if test "$_gav_j" = "${_gav_res[$_gav_i]}"; then
+                       _gav_found=1
+                       break
+                   fi
+               done
+               if test "$_gav_found" = 0; then
+                   unset _gav_res[$_gav_i]
+               fi
+               let ++_gav_i
+           done
+           _gav_res=( "${_gav_res[@]}" )
+       fi
+       shift
+       _gav_first=
+    done
+    eval $_gav_v='( "${_gav_res[@]}" )'
 }
 
 ## Usage: _getProcNumberCount <ctx> <var>
index 40185e5..c65c3ee 100755 (executable)
@@ -29,7 +29,14 @@ test -e "$UTIL_VSERVER_VARS" || {
 function showHelp()
 {
     echo \
-$"Usage: $0 [--quiet|-q] [--debug] <cmd> [--] <vserver-name>* [--all] -- <params>+
+$"Usage: $0 [--quiet|-q] [--debug] <cmd> [--] <vserver-name>* [<filter>] -- <params>+
+where <filter> is any combination of:
+--all        All guests
+--running    All running guests
+--stopped    All stopped guests
+--marked     All guests with a mark set
+--unmarked   All guests without a mark set
+--mark <m>   All guests with mark <m> set
 
 Execute <cmd> <vserver> <params>* foreach vserver.
 
@@ -75,17 +82,24 @@ cmd=$1
 title=${VSOMETHING_TITLE:-$cmd}
 shift
 
-while test "$#" -ge 1; do
-    if getAllVserversByArg tmp "$1"; then
-       vservers=( "${vservers[@]}" "${tmp[@]}" )
-    else
+test "$1" != "--" || \
+   shift
+
+if getAllVserversByArg tmp "$@"; then
+    vservers=( "${vservers[@]}" "${tmp[@]}" )
+    while test "$1" != "--"; do
+        shift
+    done
+    shift
+else
+    while test "$#" -ge 1; do
        case "$1" in
            (--) shift; break;;
            (*)  vservers=( "${vservers[@]}" "$1" )
        esac
-    fi
-    shift
-done
+       shift
+    done
+fi
 
 
 test "${#vservers[@]}" -ne 1 || is_quiet=1