
#!/bin/sh
# File  : network-check_ping-nslookup.sh
# Old	: (ping_netw-nslookup.sh)
# By    : MaartenDeBoer.nl, 090611, 110124
# Subject       : Ping IP-address and nslookup 
#(0.2)	: Added nslookup
#(0.3),170511	: Some mod's
#(0.4),170512	: Added ${1}
#(0.5),170918	: Added web-page update + USAGE
#(0.6),170918	: Added colors
#(0.7),180705	: Mod nslookup | head -1
#
#(0.8b?),190311	: Added PREV result
#(0.9b),190311	: Added PREV with color
#(0.10),190312	: Mod; when nothing to see, print nothing
#(0.11),190314	: Mod. Is in DNS. str", added SSH
#(0.12),190401	: Mod; no nslookup, added RC-file
#(0.13),190409	: Mod; HTMLDIR & HTML. Added PRINTEMPTYLINES, HEADER... & FOOTER...
#(0.14),200116	: Mod; added netw-file
#(0.15),200120	: Renamed to network-check_ping-nslookup.sh
#(0.16),200122	: Mod; when -n (NETW) , the NOT from file
#(0.17),200122	: Mod; updated [TAB] ( <TITLE> )
#(0.18),200310	: Add; -r report (exceptions; ORANGE & Yellow)
#(0.19),201014	: Add; at -w (WEBUPD) # Yello, Orange & Green
#(0.20),210923	: Mod TABLE with cellspacing='0'
#(0.21),240117	: VAR mod's
#(0.22),240118	: Add name lookup in /etc/hosts
#(0.23),240122	: Add HOSTS_FILE
#(0.24).240221	: Add FS1 (FontSize)
PGM="`basename $0|cut -d\. -f1`"
VER="0.24"
TMP="/tmp/${PGM}.$$.csv"
LOG="${HOME}/log/${PGM}.log"
HOSTNAME="`hostname|cut -d\. -f1`"
MAIL=""
MAILTO="maarten.deboer@atos.net"
NETW="192.168.1"
NETWEND=254
PART=1
WEBUPD=""
HTMLBASEDIR="/var/www/html/techlab/netw"
HTMLDIR="${HTMLBASEDIR}"
HTML="${HTMLDIR}/index.html"
DATADIR="${HOME}/data"
DATAFILE="${DATADIR}/ping-netw-lookup_${NETW}.${NETWEND}_.csv"
PREVRESULT=""
CHKSSH=""
SSH="/usr/bin/ssh -n"
NSLOOKUP=""
RCFILE="${HOME}/etc/${PGM}.rc"
PRINTEMPTYLINES=""
#NETWFILE="${HOME}/etc/${PGM}.netw"
NETWFILE="${HOME}/data/techlab-netw-check.netw"
TMPRPT="${TMP}-rpt.csv"
DOREPORT=""
HOSTS_FILE="/etc/hosts"

HEADERCOLOR="black"
HEADERBGCOLOR=""
HEADERTEXT="${PGM}"
FOOTERCOLOR="black"
FOOTERBGCOLOR=""
FOOTERTEXT1="Contact + Content Owner: <A HREF=mailto:maarten@agrarix.nl>Maarten de Boer</A> Last Update: `date` [${PGM} v${VER}]" 
FOOTERTEXT2="For (c)INTERNAL USE ONLY"


USAGE()
{
  echo "Usage: ${PGM} <options>"
  echo "  Version: ${VER}"
  echo "  options         :"
  echo "    -c|--chkssh   : Chk hostname with SSH (hostname) (${NETWEND})"
  echo "    -e|--end      : End of network (${NETWEND})"
  echo "    -f|--file     : use netw(ork)File (${NETWFILE})"
  echo "    -h|--help     : this Help"
  echo "    -l|--nslookup : with nsLookup"
  echo "    -m|--mail     : do send Mail"
  echo "    -n|--netw     : Netw (part) (${NETW})"
  echo "    -p|--pel      : PrintEmptyLines"
  echo "    -r|--rpt      : RePorT (exceptions)"
  echo "    -w|--webupd   : Update Web page (${HTML})"
  echo "    -V            : show Version"
  echo "    -x            : set -x"
  echo "    --mailto      : change MAILTO address & do send mail (${MAILTO})"
}



CHECK_NETW()
{
while [ ${PART} -le ${NETWEND} ]
do
  echo "  IP=${NETW}.${PART}"

  IPCOL=""
  PINGCOL=""
  PINGSTR=""
  NSLCOL=""
  REMARKS=""
  PREVRESULT=""
  PREVCOL=""
  REMCOL=""
  SSHANSW=""

  NSL=""
  if [ ${NSLOOKUP} ]; then
    NSL=`nslookup ${NETW}.${PART}|grep name|cut -d\= -f2|head -1`
# when no nslookup found, look into hostfile
    if [ "${NSL}" = "" ]; then
      HOSTS_L=`grep "^${NETW}.${PART} " ${HOSTS_FILE} |grep -v ^#| awk '{print $2}'|sort -u`
      if [ "${HOSTS_L}" != "" ]; then
        NSL=`echo "(${HOSTS_L})"`
      else
        NSL=""
      fi
      echo "    NSL=${NSL}|"
    fi
  fi

  ping -W 2 -c 1 -W 1 ${NETW}.${PART}
  EC=${?}
  if [ ${EC} -eq 0 ]; then
    echo "${NETW}.${PART};OK;${NSL};" | tee -a ${TMP}
    PINGSTR="OK"
  else
    echo "${NETW}.${PART};no ping;;" | tee -a ${TMP}
    PINGSTR="no ping"
  fi

  if [ ! ${NSLOOKUP} ] && [ "${PINGSTR}" = "OK" ]; then
    IPCOL="lightgreen"
    PINGCOL="lightgreen"
    REMARKS="ping OK"
    REMCOL="lightgreen"
  fi
  if [ "${PINGSTR}" = "OK" ] && [ "${NSL}" != "" ]; then
    IPCOL="lightgreen"
    PINGCOL="lightgreen"
    NSLCOL="lightgreen"
    REMARKS="All OK"
    REMCOL="lightgreen"
  fi

  if [ ${NSLOOKUP} ] && [ "${PINGSTR}" = "OK" ] && [ "${NSL}" = "" ]; then
    IPCOL="yellow"
    PINGCOL="yellow"
    NSLCOL="yellow"
    REMARKS="Need to be added in DNS?"
    REMCOL="yellow"
    if [ ${CHKSSH} ]; then
      SSHANSW=`${SSH} ${NETW}.${PART} hostname`
      NSL="hostname: ${SSHANSW}"
    fi
    echo "${NETW}.${PART};${PINGSTR};${NSL};${REMARKS};${PREVRESULT};" | tee -a ${TMPRPT}
  fi
  if [ "${PINGSTR}" != "OK" ] && [ "${NSL}" != "" ]; then
    IPCOL="orange"
    PINGCOL="orange"
    NSLCOL="orange"
    REMARKS="Is in DNS (or /etc/hosts). But NO answer"
    REMCOL="orange"
    echo "${NETW}.${PART};${PINGSTR};${NSL};${REMARKS};${PREVRESULT};" | tee -a ${TMPRPT}
  fi

# Search for PREV
  if [ -f ${DATAFILE} ]; then
    PREVRESULT=`grep "${NETW}.${PART};" ${DATAFILE}|awk -F\; '{print $2}'`
    if [ "${PINGSTR}" = "OK" ] && [ "${PINGSTR}" = "${PREVRESULT}" ]; then
      PREVCOL="lightgreen"
    fi
    if [ "${PREVRESULT}" = "OK" ] && [ "${PINGSTR}" != "${PREVRESULT}" ]; then
      PREVCOL="yellow"
      echo "${NETW}.${PART};${PINGSTR};${NSL};${REMARKS};${PREVRESULT};" | tee -a ${TMPRPT}
    fi
#echo "  PREVRESULT=${PREVRESULT}  PREVCOL=${PREVCOL}"
  fi

  if [ ${PRINTEMPTYLINES} ] || [ "${REMCOL}" != "" ]; then
    echo "<TR>" >> ${TMP}.2
    echo "  <TD BGCOLOR=${IPCOL}> ${NETW}.${PART} </TD>" >> ${TMP}.2
    echo "  <TD BGCOLOR=${PINGCOL}> ${PINGSTR} </TD>" >> ${TMP}.2
    echo "  <TD BGCOLOR=${NSLCOL}> ${NSL} </TD>" >>  ${TMP}.2
    echo "  <TD BGCOLOR=${REMCOL}> ${REMARKS} </TD>" >>  ${TMP}.2
    echo "  <TD BGCOLOR=${PREVCOL}> ${PREVRESULT} </TD>" >> ${TMP}.2
    echo "</TR>" >> ${TMP}.2
  fi

  PART="`expr ${PART} + 1`"
done  # Netw.Check
# Do "reset" PART (is beginning)
PART=1
}

UPD_WEBPAGE()
{
  echo "  Updating ${HTML} ..."|tee -a ${LOG}

  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> Netw: ${NETW} </TITLE>" >> ${HTML}
  echo "<basefont face='verdana'>" >> ${HTML}
  echo "</HEAD>" >> ${HTML}

  echo "<BODY aLink=red bgColor=#D3D0D3 link=red text=#000000 vLink=#ff0000>" >> ${HTML}

# HEADER
  echo "<TABLE BORDER=0 WIDTH='100%' cellspacing='0'>" >> ${HTML}
  echo "<TR WIDTH=100% HEIGHT=40px>" >> ${HTML}
  echo "  <TD bgColor=${HEADERBGCOLOR}>" >> ${HTML}
  echo "     <FONT COLOR=${HEADERCOLOR} face='verdana' size=${FS1}> ${HEADERTEXT} </FONT> <BR>" >> ${HTML}
  echo "  </TD>" >> ${HTML}
  echo "</TR>" >> ${HTML}
  echo "</TABLE>" >> ${HTML}

# TABLE
  echo "<TABLE BORDER=1 WIDTH='100%' cellspacing='0'>" >> ${HTML}

  echo "<TR>" >> ${HTML}
  echo "  <TD BGCOLOR=lightblue> <B> IP-addr </TD>" >> ${HTML}
  echo "  <TD BGCOLOR=lightblue> <B> ping </TD>" >> ${HTML}
  echo "  <TD BGCOLOR=lightblue> <B> DNS (/etc/hosts) </TD>" >> ${HTML}
  echo "  <TD BGCOLOR=lightblue> <B> Remarks </TD>" >> ${HTML}
  echo "  <TD BGCOLOR=lightblue> <B> Previous (ping) result </TD>" >> ${HTML}
  echo "</TR>" >> ${HTML}
  
  cat ${TMP}.2 >> ${HTML}

echo "</TABLE>" >> ${HTML}

# Count # line(s) (selecting by number) with the colors
GREEN_CNT=`cat ${TMP}.2 |grep " [0-9]"|grep -c "=lightgreen"`
ORANGE_CNT=`cat ${TMP}.2 |grep " [0-9]"|grep -c "=orange"`
YELLOW_CNT=`cat ${TMP}.2 |grep " [0-9]"|grep -c "=yellow"`

echo "<TABLE WIDTH='100%' cellspacing='0'>" >> ${HTML}
echo "  <TR> " >> ${HTML}

echo "    <TD>" >> ${HTML}
echo "      <FONT COLOR=black face='Verdana' size='2'>" >> ${HTML}
echo "<B>Summary:</B>" >> ${HTML}
echo "      </FONT>" >> ${HTML}
echo "    </TD>" >> ${HTML}
echo "    <TD BGCOLOR=lightgreen>" >> ${HTML}
echo "      <FONT COLOR=black face='Verdana' size='2'>" >> ${HTML}
echo "${GREEN_CNT} line(s) all OK. " >> ${HTML}
echo "      </FONT>" >> ${HTML}
echo "    </TD>" >> ${HTML}
echo "    <TD BGCOLOR=yellow>" >> ${HTML}
echo "      <FONT COLOR=black face='Verdana' size='2'>" >> ${HTML}
echo "${YELLOW_CNT} line(s) need to be added in DNS? " >> ${HTML}
echo "      </FONT>" >> ${HTML}
echo "    </TD>" >> ${HTML}
echo "    <TD BGCOLOR=orange>" >> ${HTML}
echo "      <FONT COLOR=black face='Verdana' size='2'>" >> ${HTML}
echo "${ORANGE_CNT} line(s) in DNS. But NO answer. " >> ${HTML}
echo "      </FONT>" >> ${HTML}
echo "    </TD>" >> ${HTML}

echo "  </TR> " >> ${HTML}
echo "</TABLE>" >> ${HTML}


echo "<TABLE WIDTH='100%' cellspacing='0'>" >> ${HTML}
echo "<TR> " >> ${HTML}
echo "  <TD bgColor=${FOOTERBGCOLOR}>" >> ${HTML}
echo "    <FONT COLOR=${FOOTERCOLOR} face='Verdana' size='1'>" >> ${HTML}
echo "      <CENTER>" >> ${HTML}
echo "        ${FOOTERTEXT1} <BR>" >> ${HTML}
echo "        ${FOOTERTEXT2} <BR>" >> ${HTML}
echo "      </CENTER>" >> ${HTML}
echo "    </FONT>" >> ${HTML}
echo "  </TD>" >> ${HTML}
echo "</TR>" >> ${HTML}
echo "</TABLE>" >> ${HTML}

echo "</BODY>" >> ${HTML}
echo "</HTML>" >> ${HTML}
}


## 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
if [ -f ${RCFILE} ]; then
  echo "  Reading RC-file (${RCFILE})..."|tee -a ${LOG}
  . ${RCFILE}
fi
while [ $# -gt 0 ]
  do
  case $1 in
    -c | --chkssh) CHKSSH=1 ;;
    -m | --mail) MAIL=1 ;;
    -e | --etc) NETWEND=$2; shift ;;
    -f | --file) NETWFILE=$2; shift ;;
    -l | --nslookup) NSLOOKUP=1 ;;
    -n | --netw) NETW=$2;
                 NETWFILE="";
#                 HTMLDIR="/appl/dfm/web/techlab/netw/${NETW}"
                 HTMLDIR="${HTMLBASEDIR}/${NETW}"
                 HTML="${HTMLDIR}/index.html"
                 shift ;;
    -p | --pel) PRINTEMPTYLINES=1 ;;
    -r | --rpt) DOREPORT=1 ;;
    -w | --webupd) WEBUPD=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. With NETW=${NETW}"|tee -a ${LOG}
touch ${TMP} 
echo "CHKSSH=${CHKSSH}"
echo "DATADIR=${DATADIR}"
echo "DATAFILE=${DATAFILE}"
echo "DORPT=${DORPT}"
echo "FOOTERCOLOR=${FOOTERCOLOR}"
echo "FOOTERBGCOLOR=${FOOTERBGCOLOR}"
echo "FOOTERTEXT1=${FOOTERTEXT1}"
echo "FOOTERTEXT2=${FOOTERTEXT2}"
echo "HEADERCOLOR=${HEADERCOLOR}"
echo "HEADERBGCOLOR=${HEADERBGCOLOR}"
echo "HEADERTEXT=${HEADERTEXT}"
echo "HTMLBASEDIR=${HTMLBASEDIR}"
echo "HTMLDIR=${HTMLDIR}"
echo "HTML=${HTML}"
echo "HOSTS_FILE=${HOSTS_FILE}"
echo "NETW=${NETW}"
echo "NETWEND=${NETWEND}"
echo "NETWFILE=${NETWFILE}"
echo "NSLOOKUP=${NSLOOKUP}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"
echo "PRINTEMPTYLINES=${PRINTEMPTYLINES}"
echo "SSH=${SSH}"
echo "TMPRPT=${TMPRPT}"
echo "WEBUPD=${WEBUPD}"

sleep 2

if [ ! -d ${DATADIR} ]; then
  mkdir -p ${DATADIR}
  echo "  NO ${DATADIR}. Created one"|tee -a ${LOG}
fi

if [ ! -d ${HTMLDIR} ]; then
  mkdir -p ${HTMLDIR}
fi

if [ ${DOREPORT} ]; then
  echo "#NETW.PART;PINGSTR;NSL;REMARKS;PREVRESULT;" | tee -a ${TMPRPT}
fi

if [ "${NETWFILE}" != "" ] && [ -f ${NETWFILE} ]; then
# Use Netw(ork)file
  cat ${NETWFILE}|grep -v ^#| while read LINE
  do
    NETW=`echo ${LINE}|awk '{print $1}'`
    echo "  Check netw (${NETW}) from file (${LINE})"|tee -a ${LOG}
    if [ "${NETW}" != "" ]; then
# Empty netw-tmp
      cp /dev/null ${TMP}.2
#      HTMLDIR="/appl/dfm/web/techlab/netw/${NETW}"
      HTMLDIR="${HTMLBASEDIR}/${NETW}"
      if [ ! -d ${HTMLDIR} ]; then
        mkdir -p ${HTMLDIR}
      fi
      HTML="${HTMLDIR}/index.html"
      CHECK_NETW
    fi
    if [ ${WEBUPD} ]; then
#      HTMLDIR="${HTMLDIR}/techlab/netw/${NETW}"
      HTMLDIR="${HTMLBASEDIR}/${NETW}"
      if [ ! -d ${HTMLDIR} ]; then
# When no (new) dir. create one
        mkdir -p ${HTMLDIR}
      fi
      HTML="${HTMLDIR}/index.html"
      UPD_WEBPAGE
    fi  # WEBUDP
  done  # cat
else
  echo "  Check single netw (${NETW})"|tee -a ${LOG}
  CHECK_NETW
  if [ ${WEBUPD} ]; then
#    HTMLDIR="/appl/dfm/web/techlab/netw/${NETW}"
    HTMLDIR="${HTMLBASEDIR}/${NETW}"
    if [ ! -d ${HTMLDIR} ]; then
# When no (new) dir. create one
      mkdir -p ${HTMLDIR}
    fi
    HTML="${HTMLDIR}/index.html"
    UPD_WEBPAGE
  fi  # WEBUDP
fi

if [ ${MAIL} ]; then
  date| mailx -a ${TMP} -s ":${HOSTNAME}: ping netw ${NETW} [${PGM} v${VER}]" ${MAILTO}
  echo "`date` Mailed to ${MAILTO}"|tee -a ${LOG}
fi
if [ ${DOREPORT} ]; then
  echo "`date`: Exception report"| mailx -a ${TMPRPT} -s ":${HOSTNAME}: Exception report ${NETW} [${PGM} v${VER}]" ${MAILTO}
  echo "`date` Exception report mailed to ${MAILTO}"|tee -a ${LOG}
  rm ${TMPRPT}
fi

# (new:) Keep TMP(DATAFILE)
cp ${TMP} ${DATAFILE}

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

