File:  [Local Repository] / badi / public_scripts / canardien / canardien
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Dec 1 04:36:47 2009 UTC (14 years, 5 months ago) by adi
Branches: MAIN
CVS tags: HEAD
Initial revision

#!/bin/bash

# canardien 0.0.2
# (c) 2005 under GPL by Adrian Zaugg

# canardiens pings ente.limmat.ch to determine wether she is gone diving.

# ToDo: multi host, multi eMail

## Settings
#

# Host to ping. It's ente.limmat.ch
HOST="ente.limmat.ch"

# eMail Alerts
# Send alert email messages to the following address(es). Leave empty
# for no alert. For multiple destinations use a comma separated list.
ALERT_TO=""

# Subject of alert email
ALERT_SUBJECT="Achtung: $HOST antwortet nicht mehr!"

# Text of Message (But in 'single quotes' to protect variables. They should get
# expanded at the time the message is sent!)
ALERT_TEXT='"\n[$TIME_STAMP]\n\nALERT!!\n\n\t$HOST is down!\n\nYou should probably do something, please.\nKind regards, $PINGHOST."'

# path to fping
PING=`which fping`

# answer of fping to reachable hosts
ALIVE_ANSWER="is alive"

# Temporary file path
TMPDIR="/tmp"

# This hosts name
PINGHOST=`uname -n`

# set to an empty string to avoid debug output,
# to "low" for a few, output and to anything else
# for verbose output
DEBUG=loud

# for silent (non-error) operation set to anything,
# comment out to enable text output
# (migration to use shout is in progress)
SILENT=shshsh


# -----------functions-----------

# If ente.limmat.ch responds to pings, she is considered up.
function checkconnection {
   unset UP
	if [ ${#PING} -eq 0 ]; then
		echo "Error: fping external program not in path. Exitting."
		exit 1
	fi
   
   PING_ANSWER="$($PING "$HOST")"
   PING_ERRNUM=$?
   if [ $PING_ERRNUM -gt 2 ]; then
   		echo "Error $PING_ERRNUM in fping $(head -1 "$PING_ANSWER") . Exitting."
   		exit 1
   fi
   
   if [ `echo "$PING_ANSWER" | grep -c "$ALIVE_ANSWER"` -gt 0 ]; then
      UP=true
   fi
   TIME_STAMP=`date +"%a %e.%m.%y %H:%M:%S"`
   if [ -n "$UP" ]; then
      if [ ! "$DEBUG" = "low" ] && [ -n "$DEBUG"  ]; then
         shout "The connection is up."
      fi
   else 
      if [ -n "$DEBUG" ]; then
         shout "The connection is down."
      fi
   fi
}

# Rember recent state of ente.limmat.ch, trigger alert
function rememberstate {
   # Put a simple time stamp in a tmp file, when host gets down
   if [ -z "$UP" ]; then
		if [ ! -e "$TMPDIR/.canardien-$PINGHOST-$HOST" ]; then 
      		# set time stamp
      		echo -ne "$TIME_STAMP" > "$TMPDIR/.canardien-$PINGHOST-$HOST"
      		# send alert
      		sendalert
      	elif [ -n "$DEBUG" ]; then
         	shout "Down since `cat $TMPDIR/.canardien-$PINGHOST-$HOST`."
      	fi
   else 
     # Host is up
      if [ -e "$TMPDIR/.canardien-$PINGHOST-$HOST" ]; then
         if [ -n "$DEBUG" ]; then
            shout "$HOST is up again."
         fi
		  # send alert
          ALERT_SUBJECT="$HOST antwortet wieder!"
          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."'
          sendalert
         # delete tmp file
         rm "$TMPDIR/.canardien-$PINGHOST-$HOST"
      else 
         # still running
         if [ ! "$DEBUG" = "low" ] && [ -n "$DEBUG"  ]; then
            shout "$HOST is still up."
         fi
      fi
   fi
}

# Send an email alert
function sendalert {
   # send mail
	if [ ! -z "$ALERT_TO" ]; then
   		eval MSG=\$$ALERT_TEXT
   		echo -e -n "$MSG" | mail -s "$ALERT_SUBJECT" "$ALERT_TO"
   		if [ -n "$DEBUG" ]; then
    		shout "Alert sent to $ALERT_TO."
   		fi
	fi
}

# To avoid any output in case of a silent operation,
# shout instead of echo.
function shout()
{
   if [ -z "$SILENT" ]; then
      echo -e "$1"
   fi
}


# -----------main-----------

checkconnection
rememberstate
exit 0


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>