
#!/bin/sh
# File	: system_ping.sh
# By	: Maarten.deBoer@Atos.net, 240212
# Subject	: Script to ping systems for check, report & alert
#(0.2),240212	: Added EXCL_FILE
#(0.3),240212	: Added Prev. restult (in DATAFILE)
#(0.4),240213	: Added No OK  in Mail
PGM=`basename $0|cut -d\. -f1`
VER="0.4"
TMP="/tmp/${PGM}.$$"
LOG="${HOME}/log/${PGM}.log"
RCFILE="${HOME}/etc/${PGM}.rc"
CSV="/tmp/${PGM}.csv"
HOSTNAME=`hostname|cut -d\. -f1`
DATAFILE="${HOME}/data/${PGM}.csv"

MAILTO="maarten.deboer@atos.net"
MAIL=""

HOSTS="${HOME}/etc/${PGM}.hosts"
EXCL_FILE="${HOME}/etc/${PGM}.excl"
CHECK=""
REPORT=""
ALERT=""

USAGE()
{
  echo "Usage: ${PGM} <options>"
  echo "  Version: ${VER}"
  echo "  options         :"
  echo "    -c|--chk      : Check systems (from HOSTS (${HOSTS}))"
  echo "    -h|--help     : this Help"
  echo "    -m|--mail     : do send Mail"
  echo "    -V            : show Version"
  echo "    -x            : set -x"
  echo "    --mailto      : change MAILTO address & do send mail (${MAILTO})"
}
if [ -f ${RCFILE} ]; then
  echo "RCFILE (${RCFILE} found. Reading it"|tee -a ${LOG}
  . ${RCFILE}
fi  # RCFILE
## MAIN
# Check options
if [ $# -eq 0 ]; then
  echo "No option(s) given. So not to know what to do. Exiting..."; echo; USAGE; exit 1
fi
while [ $# -gt 0 ]
  do
  case $1 in
    -c | --chk | --check) CHECK=1 ;;
    -r | --rpt | --report) REPORT=1 ;;
    -a | --alert) ALERT=1 ;;
    -m | --mail) MAIL=1 ;;
    --mailto) MAILTO=$2; MAIL=1; shift ;;
    -h | --help) USAGE; exit 1 ;;
    -V) echo "${PGM}: v${VER}"; exit 3 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known. Exiting..."; echo; USAGE; exit 1 ;;
  esac
    shift
done

echo "`date` ${PGM} v${VER} started."|tee -a ${LOG}
echo "  ALERT=${ALERT}"
echo "  CSV=${CSV}"
echo "  CHECK=${CHECK}"
echo "  DATAFILE=${DATAFILE}"
echo "  EXCL_FILE=${EXCL_FILE}"
echo "  HOSTS=${HOSTS}"
echo "  MAIL=${MAIL}"
echo "  MAILTO=${MAILTO}"
echo "  REPORT=${REPORT}"
echo "  RCFILE=${RCFILE}"
echo "  TMP=${TMP}"
sleep 1

if [ ! -f ${HOSTS} ]; then
  echo "    NO HOSTS (${HOSTS}) fond. Exiting ..."|tee -a ${LOG}
  exit 4
fi  # HOSTS

# Empty DATAFILE
cp ${DATAFILE} ${TMP}.datafile
cp /dev/null ${DATAFILE}
EC=${?}
if [ ${EC} -ne 0 ]; then
  echo "    Making DATAFILE (${DATAFILE}) empty, went not OK (${EC}). Exiting ..."|tee -a ${LOG}
  exit 5
fi  # EC <>0

touch ${TMP}
echo "# IP_ADDRess;NAME;RESULT (ExitCode);Previous state;"|tee ${CSV}

if [ ${CHECK} ]; then
  echo "    CHECKing systems ..."|tee -a ${LOG}
  cat ${HOSTS}|grep -v ^#|while read LINE
  do
    IP_ADDR=`echo ${LINE}|awk '{print $1}'`
    NAME=`echo ${LINE}|awk '{print $2}'`
    echo "    NAME=${NAME} IP_ADDR=${IP_ADDR}"

    /usr/bin/ping -W 2 -c 1 -W 1 ${IP_ADDR}
    EC1=${?}
    if [ ${EC1} -eq 0 ]; then
      RESULT="OK"
    else
      RESULT="NOT ok"
      if [ -f ${EXCL_FILE} ]; then
        ANSW=`grep "${IP_ADDR}" ${EXCL_FILE}` 1>/dev/null 2>&1
        EC2=${?}
        if [ ${EC2} -eq 0 ]; then
          RESULT="not ok, but EXCLuded."
        fi  # EC2=0
        echo "EC2=${EC} ANSW=${ANSW}"
      fi  # EXCL_FILE
    fi  # EC1=0
# Get PREV    
    PREV_STATE=`grep "${IP_ADDR};" ${TMP}.datafile|awk -F\; '{print $2}'|head -1`
    echo "${IP_ADDR};${NAME};${RESULT} (${EC1});${PREV_STATE};"|tee -a ${TMP}
    echo "${IP_ADDR};${RESULT};" >> ${DATAFILE}

  done  # HOSTS

fi  # CHECK

if [ ${MAIL} ] && [ "${MAILTO}" != "" ]; then
  cat ${TMP}|grep -v "OK"|while read LINE
  do
    M_IP_ADDR=`echo ${LINE}|awk -F\; '{print $1}'`
    M_NAME=`echo ${LINE}|awk -F\; '{print $2}'`
    M_RESULT=`echo ${LINE}|awk -F\; '{print $3}'`
    echo "${M_IP_ADDR} ${M_NAME} ${M_RESULT} " >> ${TMP}.mail
#    echo "" >> ${TMP}.mail
  done  # LINE
  echo "----" >> ${TMP}.mail
  echo "`date` ${PGM} v${VER} @${HOSTNAME}" >> ${TMP}.mail
  cat ${TMP} >> ${CSV}
  cat ${TMP}.mail | mailx -s ":${HOSTNAME}: System Ping result [${PGM} v${VER}]" -a ${CSV} ${MAILTO}
  echo "  Mailed CSV (${CSV}) to ${MAILTO}"|tee -a ${LOG}
fi

rm ${TMP} ${TMP}.datafile
echo "`date` ${PGM} v${VER} finished."|tee -a ${LOG}
exit 0

