#! /bin/sh ### ### Run everyday health checks on remote systems. set -e prog=$0 while case "$prog" in */*) ;; *) prog=./$prog ;; esac cd "${prog%/*}" [ -L "${prog##*/}" ] do prog=$(readlink "${prog##*/}") done 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 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 i=0 while :; do tmpdir=check.$$.$i if mkdir -m700 $tmpdir >/dev/null 2>&1; then break; fi case $i in 500) echo >&2 "failed to create temporary directory"; exit 125 ;; esac i=$((i + 1)) done trap "cd /; rm -rf /tmp/$tmpdir" INT TERM QUIT HUP EXIT cd $tmpdir tar xzf - ./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 <&4 ) if [ $nrc -gt $rc ]; then rc=$nrc; fi done exit $rc