chiark / gitweb /
rcheck: Supply a default list of hosts if none are given.
[rcheck] / rcheck
1 #! /bin/sh
2 ###
3 ### Run everyday health checks on remote systems.
4
5 set -e
6 prog=$0
7 while
8   case "$prog" in */*) ;; *) prog=./$prog ;; esac
9   cd "${prog%/*}"
10   [ -L "${prog##*/}" ]
11 do
12   prog=$(readlink "${prog##*/}")
13 done
14
15 case $# in 0) set -- $(expand-list /etc/slaves :rcheck_hosts) ;; esac
16
17 exec 4>&1
18 rc=0
19 for host in "$@"; do
20
21   nrc=$(
22     exec 5>&1
23     { { { set +e
24           tar czf - check check.d |
25           ssh "$host" '
26 set -e
27 cd /tmp
28
29 i=0
30 while :; do
31   tmpdir=check.$$.$i
32   if mkdir -m700 $tmpdir >/dev/null 2>&1; then break; fi
33   case $i in
34     500) echo >&2 "failed to create temporary directory"; exit 125 ;;
35   esac
36   i=$((i + 1))
37 done
38 trap "cd /; rm -rf /tmp/$tmpdir" INT TERM QUIT HUP EXIT
39 cd $tmpdir
40
41 tar xzf -
42 ./check'
43           rc=$?; set -e; echo $rc >&5
44           case $rc in
45             0) ;;
46             *) echo >&2 "remote check process failed (rc = $rc)" ;;
47           esac
48         } 1>&3; } 2>&1 |
49       sed 's/^/!!! /'
50     } 3>&1 |
51     if IFS= read -r line; then
52       cat <<EOF
53 ###--------------------------------------------------------------------------
54 ### $host
55
56 $line
57 EOF
58       cat
59     fi >&4
60   )
61   if [ $nrc -gt $rc ]; then rc=$nrc; fi
62 done
63
64 exit $rc