Annotation of badi/public_scripts/canardien/canardien, revision 1.4
1.1 adi 1: #!/bin/bash
2:
1.4 ! adi 3: # canardien 0.0.4
! 4: # (c) 2005-2019 under GPL by Adrian Zaugg
1.1 adi 5:
6:
1.4 ! adi 7: # canardien [<host> [<host> ...]]
! 8:
! 9: # canardiens pings a machine, originally ente.limmat.ch thus its name,
! 10: # to determine wether she is gone diving.
! 11:
1.1 adi 12:
13: ## Settings
14: #
15:
1.4 ! adi 16: # Hosts to ping. use a space separated list for multiple targets. All
! 17: # hosts of the list are checked and their results reported individually.
! 18: # Hosts given on the command line overwrite this setting.
! 19: HOSTS=""
1.1 adi 20:
21: # eMail Alerts
22: # Send alert email messages to the following address(es). Leave empty
23: # for no alert. For multiple destinations use a comma separated list.
1.3 adi 24: ALERT_TO="root"
1.1 adi 25:
26: # Subject of alert email
1.4 ! adi 27: ALERT_SUBJECT='"Attention: no answer from $HOST anymore!"'
1.1 adi 28:
1.4 ! adi 29: # Text of Message (Put variables in 'single quotes' to protect them. They
! 30: # should get expanded at the time the message is sent!)
1.3 adi 31: ALERT_TEXT='"\n[$TIME_STAMP]\n\nALERT!!\n\n\t$HOST is down!\n\nYou should probably do something, please.\n\nKind regards, $PINGHOST."'
1.1 adi 32:
1.4 ! adi 33: # Path to fping
! 34: PING=""
1.1 adi 35:
1.4 ! adi 36: # Answer of fping to reachable hosts
1.1 adi 37: ALIVE_ANSWER="is alive"
38:
1.4 ! adi 39: # Max number of pakets to send before giving up. Time increases exponentially,
! 40: # use a number < 7.
! 41: RETRIES=4
! 42:
1.1 adi 43: # Temporary file path
44: TMPDIR="/tmp"
45:
46: # This hosts name
1.4 ! adi 47: PINGHOST="$(uname -n)"
1.1 adi 48:
1.4 ! adi 49: # Set to an empty string to avoid debug output,
1.1 adi 50: # to "low" for a few, output and to anything else
51: # for verbose output
1.4 ! adi 52: DEBUG=verbose
1.1 adi 53:
1.4 ! adi 54: # For silent (non-error) operation set to anything,
1.1 adi 55: # comment out to enable text output
1.4 ! adi 56: #SILENT=shshsh
1.1 adi 57:
58:
59: # -----------functions-----------
60:
1.4 ! adi 61: # Initialize.
! 62: function init() {
! 63:
! 64: # check fping existence
! 65: if [ -z "$PING" ]; then
! 66: PING="$(which fping)"
! 67: fi
1.1 adi 68: if [ ${#PING} -eq 0 ]; then
1.4 ! adi 69: echo "Error: fping external program not found or not set. Exitting." >&2
! 70: exit 1
! 71: fi
! 72: if [ ! -x "$PING" ]; then
! 73: echo "Error: Can't execute the program set to use as fping. Please enter the correct path to \"fping\"." >&2
1.1 adi 74: exit 1
75: fi
1.3 adi 76:
1.4 ! adi 77: # get hostset
! 78: if [ -n "$*" ]; then
! 79: HOSTS="$*"
! 80: fi
! 81: if [ -z "$HOSTS" ]; then
! 82: echo "Error: No host to ping." >&2
! 83: exit 0
! 84: fi
1.1 adi 85: }
86:
1.4 ! adi 87:
! 88: # If a host responds to pings, it is considered up.
! 89: function checkconnection() {
! 90:
! 91: while read -r HOST; do
! 92: unset UP
! 93:
! 94: # ping host
! 95: PING_ANSWER="$($PING -R -B 2 -r $RETRIES -p 50 "$HOST" 2>&1)"
! 96: PING_ERRNUM=$?
! 97: if [ $PING_ERRNUM -gt 2 ]; then
! 98: echo "Error: Got error $PING_ERRNUM from fping $(head -1 "$PING_ANSWER"). Disregarding $HOST." >&2
! 99: continue;
! 100: fi
! 101:
! 102: # parse answer
! 103: if [ $(echo "$PING_ANSWER" | grep -c "$ALIVE_ANSWER") -gt 0 ]; then
! 104: UP=true
! 105: fi
! 106: TIME_STAMP="$(date +"%a %e.%m.%y %H:%M:%S")"
! 107: if [ -n "$UP" ]; then
! 108: if [ ! "$DEBUG" = "low" ] && [ -n "$DEBUG" ]; then
! 109: shout "The connection to $HOST is up."
! 110: fi
! 111: else
! 112: if [ -n "$DEBUG" ]; then
! 113: shout "The connection to $HOST is down."
! 114: fi
! 115: fi
! 116:
! 117: # remember a hosts state
! 118: rememberstate
! 119:
! 120: done <<< "$(echo "$HOSTS" | tr ' ' '\n')"
! 121: }
! 122:
! 123:
! 124: # Rember recent state of host, trigger alert
! 125: function rememberstate() {
! 126: # Put a simple time stamp in a tmp file, when host is detected as down for the first time
! 127: if [ -z "$UP" ]; then
1.3 adi 128: if [ ! -e "$TMPDIR/.canardien-$PINGHOST-$HOST" ]; then
1.4 ! adi 129: # set time stamp
! 130: echo -ne "$TIME_STAMP" > "$TMPDIR/.canardien-$PINGHOST-$HOST"
! 131: # send alert
! 132: sendalert
! 133: elif [ -n "$DEBUG" ]; then
! 134: shout "Down since `cat $TMPDIR/.canardien-$PINGHOST-$HOST`."
! 135: fi
! 136: else
! 137: # Host is up
! 138: if [ -e "$TMPDIR/.canardien-$PINGHOST-$HOST" ]; then
! 139: if [ -n "$DEBUG" ]; then
! 140: shout "$HOST is up again."
! 141: fi
1.3 adi 142: # send alert
1.4 ! adi 143: ALERT_SUBJECT="The host $HOST answers again!!"
! 144: ALERT_TEXT='"[$(date +"%a %e.%m.%y %H:%M:%S")]\n\n\n$HOST is up again.\n--------------------------------------\n(downtime began $(cat "$TMPDIR/.canardien-$PINGHOST-$HOST"))\n\n\n Kind regards, $PINGHOST."'
! 145: sendalert
! 146: # delete tmp file
! 147: rm "$TMPDIR/.canardien-$PINGHOST-$HOST"
! 148: else
! 149: # still running
! 150: if [ ! "$DEBUG" = "low" ] && [ -n "$DEBUG" ]; then
! 151: shout "$HOST is up."
! 152: fi
! 153: fi
! 154: fi
1.1 adi 155: }
156:
1.4 ! adi 157:
1.1 adi 158: # Send an email alert
1.4 ! adi 159: function sendalert() {
! 160: # send mail
1.1 adi 161: if [ ! -z "$ALERT_TO" ]; then
1.4 ! adi 162: eval alert_subject=\$$ALERT_SUBJECT
! 163: eval MSG=\$$ALERT_TEXT
! 164: echo -e -n "$MSG" | mail -s "$alert_subject" "$ALERT_TO"
! 165: if [ -n "$DEBUG" ]; then
! 166: shout "Alert sent to $ALERT_TO."
! 167: fi
1.1 adi 168: fi
169: }
170:
1.4 ! adi 171:
1.1 adi 172: # To avoid any output in case of a silent operation,
173: # shout instead of echo.
1.4 ! adi 174: function shout() {
! 175: if [ -z "$SILENT" ]; then
! 176: echo -e "$1"
! 177: fi
1.1 adi 178: }
179:
180:
181: # -----------main-----------
182:
1.4 ! adi 183: init "$*"
1.1 adi 184: checkconnection
185: exit 0
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>