check.d/50.updates: Maintain sets of packages, rather than lists.
[rcheck] / rcheck
diff --git a/rcheck b/rcheck
index cd40440..9849a39 100755 (executable)
--- a/rcheck
+++ b/rcheck
@@ -12,11 +12,34 @@ do
   prog=$(readlink "${prog##*/}")
 done
 
-for host in "$@"; do
+args=""
+usage () {
+  echo "usage: ${0##*/} [-[MIN-][MAX]] [HOST...]"
+}
+while :; do
+  case $# in 0) break ;; esac
+  case $1 in
+    -) break ;;
+    --) shift; break ;;
+    -*[!0-9]*-* | -*-*[!0-9]*) usage >&2; exit 1 ;;
+    -*-) a=${1#-}; a=${a%-}; args="$a" ;;
+    -*-*) a=${1#-}; b=${a#*-}; a=${a%-*}; args="$a $b" ;;
+    -*[!0-9]*) usage >&2; exit 1 ;;
+    -*) a=${1#-}; args="0 $a" ;;
+    *) break ;;
+  esac
+  shift
+done
+case $# in 0) set -- $(expand-list /etc/slaves :rcheck_hosts) ;; esac
 
-  { { { set +e
-       tar czf - check check.d |
-       ssh "$host" '
+exec 4>&1
+rc=0
+for host in "$@"; do
+  nrc=$(
+    exec 5>&1
+    { { { set +e
+         tar czf - check check.d |
+         ssh "$host" '
 set -e
 cd /tmp
 
@@ -33,22 +56,26 @@ trap "cd /; rm -rf /tmp/$tmpdir" INT TERM QUIT HUP EXIT
 cd $tmpdir
 
 tar xzf -
-./check'
-       rc=$?; set -e
-       case $rc in
-         0) ;;
-         *) echo >&2 "remote check process failed (rc = $rc)" ;;
-       esac
-      } 1>&3; } 2>&1 |
-    sed 's/^/!!! /'
-  } 3>&1 |
-  if read line; then
-    cat <<EOF
+./check'" $args"
+         rc=$?; set -e; echo $rc >&5
+         case $rc in
+           0) ;;
+           *) echo >&2 "remote check process failed (rc = $rc)" ;;
+         esac
+       } 1>&3; } 2>&1 |
+      sed 's/^/!!! /'
+    } 3>&1 |
+    if IFS= read -r line; then
+      cat <<EOF
 ###--------------------------------------------------------------------------
 ### $host
 
 $line
 EOF
-    cat
-  fi
+      cat
+    fi >&4
+  )
+  if [ $nrc -gt $rc ]; then rc=$nrc; fi
 done
+
+exit $rc