
#!/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
#(0.5),240215	: Add WEBUPD
#(0.6),240219	: Added -S
PGM=`basename $0|cut -d\. -f1`
VER="0.6"
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"
WEBUPD=""
FONTSIZE1="6"

MAILTO="maarten.deboer@atos.net"
MAIL=""
SUBJECT=":${HOSTNAME}: System Ping result"

BASEDIR=""
WEBDIR="/var/www/html/techlab/systems"
HTML="${BASEDIR}/${WEBDIR}/index.html"
EXTURL="http://10.90.32.23/techlab/systems/"
TITLE="TechLab: Systems Ping page"

#HOSTS="${HOME}/etc/${PGM}.hosts"
HOSTS="${HOME}/etc/system.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 "    -S|--subject  : change mail Subject (${SUBJECT})"
  echo "    -w|--webupd   : do Webupd"
  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 ;;
    -w | --webupd) WEBUPD=1 ;;
    --mailto) MAILTO="${2}"; MAIL=1; shift ;;
    -S | --subject) SUBJECT="${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 "  BASEDIR=${BASEDIR}"
echo "  CSV=${CSV}"
echo "  CHECK=${CHECK}"
echo "  DATAFILE=${DATAFILE}"
echo "  EXCL_FILE=${EXCL_FILE}"
echo "  EXTURL=${EXTURL}"
echo "  HTML=${HTML}"
echo "  HOSTS=${HOSTS}"
echo "  MAIL=${MAIL}"
echo "  MAILTO=${MAILTO}"
echo "  REPORT=${REPORT}"
echo "  RCFILE=${RCFILE}"
echo "  SUBJECT=${SUBJECT}"
echo "  TITLE=${TITLE}"
echo "  TMP=${TMP}"
echo "  WEBDIR=${WEBDIR}"
echo "  WEBUPD=${WEBUPD}"
sleep 1

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

# Empty DATAFILE
touch ${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 [ ${WEBUPD} ]; then
  echo "<!DOCTYPE html>" > ${HTML}
  echo "<HTML>" >> ${HTML}
  echo "<HEAD>" >> ${HTML}
  echo "<META charset='UTF-8'>" >> ${HTML}
  echo "<META content=Maarten de Boer name=AUTHOR>" >> ${HTML}
  echo "<TITLE> ${TITLE} </TITLE>" >> ${HTML}
  echo "<basefont face='verdana'>" >> ${HTML}
  echo "</HEAD>" >> ${HTML}
  echo "<BODY aLink=red bgColor=#D3D0D3 link=red text=#000000 vLink=#ff0000>" >> ${HTML}

  echo "<TABLE BORDER=0 WIDTH='100%' cellspacing='0'>" >> ${HTML}
  echo "<TR WIDTH=100% HEIGHT=40px>" >> ${HTML}
  echo "  <TD bgColor=#0066A1>" >> ${HTML}
  echo "    <FONT COLOR=white face='verdana' SIZE=${FONTSIZE1}> ${TITLE} <BR> </FONT>" >> ${HTML}
  echo "    <DIV align=right>" >> ${HTML}
  echo "      <FONT COLOR=white face='verdana' size='-3'> For internal use. (c) Atos `date +%Y` </B> </FONT>" >> ${HTML}
  echo "    </DIV>" >> ${HTML}
  echo "  </TD>" >> ${HTML}
  echo "</TR>" >> ${HTML}
  echo "</TABLE>" >> ${HTML}
fi  # WEBUPD



if [ ${CHECK} ]; then
  echo "    CHECKing systems ..."|tee -a ${LOG}

  if [ ${WEBUPD} ]; then
    echo "<TABLE BORDER=1 WIDTH='100%' cellspacing='0'>" >> ${HTML}

#  "${IP_ADDR};${NAME};${RESULT} (${EC1});${PREV_STATE};"
    echo "  <TR WIDTH=100% >" >> ${HTML}
    echo "    <TH><FONT SIZE=${FONTSIZE1}> IP_ADDR: </TH>" >> ${HTML}
    echo "    <TH><FONT SIZE=${FONTSIZE1}> NAME: </TH>" >> ${HTML}
    echo "    <TH><FONT SIZE=${FONTSIZE1}> RESULT (EC): </TH>" >> ${HTML}
    echo "    <TH><FONT SIZE=${FONTSIZE1}> PREV_STATE: </TH>" >> ${HTML}
    echo "  </TR>" >> ${HTML}
  fi  # WEBUPD

  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 ${IP_ADDR}
    EC1=${?}
    EC_BGC=""
    if [ ${EC1} -eq 0 ]; then
      RESULT="OK"
      EC_BGC="lightgreen"
    else
      RESULT="NOT ok"
      EC_BGC="orange"
      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."
          EC_BGC="yellow"
        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}

    if [ ${WEBUPD} ]; then
      echo "  <TR WIDTH=100% >" >> ${HTML}
      echo "    <TD BGCOLOR=${EC_BGC}><FONT SIZE=${FONTSIZE1}> ${IP_ADDR} </TD>" >> ${HTML}
      echo "    <TD BGCOLOR=${EC_BGC}><FONT SIZE=${FONTSIZE1}> ${NAME} </TD>" >> ${HTML}
      echo "    <TD BGCOLOR=${EC_BGC}><FONT SIZE=${FONTSIZE1}> ${RESULT} (${EC1}) </TD>" >> ${HTML}
      echo "    <TD ><FONT SIZE=${FONTSIZE1}> ${PREV_STATE} </TD>" >> ${HTML}
      echo "  </TR>" >> ${HTML}
    fi  # WEBUPD

    echo "${IP_ADDR};${RESULT};" >> ${DATAFILE}
  done  # HOSTS

  if [ ${WEBUPD} ]; then
    echo "</TABLE>" >> ${HTML}
  fi  # WEBUPD

fi  # CHECK



if [ ${WEBUPD} ]; then
  echo "<TABLE BORDER=0 WIDTH='100%' cellspacing='0'>" >> ${HTML}
  echo "<TR WIDTH=100% > " >> ${HTML}
  echo "  <TD bgColor=#0066A1 > " >> ${HTML}
  echo "    <FONT COLOR=white face='Verdana' size='1'>" >> ${HTML}
  echo "      <CENTER>" >> ${HTML}
  echo "Contact: |Content Owner: <A HREF="mailto:Maarten.deBoer@Atos.net">Maarten de Boer</A> |Last Update: `date`|[${PGM} v${VER}]<BR>" >> ${HTML}
  echo "For internal use (c) Atos S.A. `date +%Y` all rights reserved. Reproduction in whole or in part is prohibited without the written consent of Atos SA." >> ${HTML}
  echo "      </CENTER>" >> ${HTML}
  echo "    </FONT>" >> ${HTML}
  echo "  </TD>" >> ${HTML}
  echo "</TR>" >> ${HTML}
  echo "</TABLE>" >> ${HTML}

  echo "</BODY>" >> ${HTML}
  echo "</HTML>" >> ${HTML}
fi  # WEBUPD


if [ ${MAIL} ] && [ "${MAILTO}" != "" ]; then
  CNT_NOK=0
  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
    CNT_NOK=`expr ${CNT_NOK}`
#    echo "" >> ${TMP}.mail
  done  # LINE
  echo "" >> ${TMP}.mail
  echo "${CNT_NOK} counted NOT ok" >> ${TMP}.mail
  echo "----" >> ${TMP}.mail
  echo "`date` ${PGM} v${VER} @${HOSTNAME}" >> ${TMP}.mail
  cat ${TMP} >> ${CSV}
  cat ${TMP}.mail | mailx -s "${SUBJECT} (${CNT_NOK} NOT ok) [${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

