
#!/bin/sh
# File  : ping_netw-nslookup.sh
# By    : MaartenDeBoer.nl, 090611, 110124
# Subject       : Ping filers from $HOME/etc/filers
#(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),241212	: Add 3rd loop (PART3), Add SUBNET2. PART=>PART4, NETWEND=>NEDN4
#(0.14),241212	: added -f (hostfile)
#(0.15),241212	: Update -w & -p (P_END[34])
#(0.16),241216	: When SUBNET3, NMAP
#(0.17),241216	: Split -p & -w
#(0.18),241216	: Upd -w, add IFILTER
#(0.19),241217	: Added DNS_SERVER
#(0.20),241217	: Add netw.diff, NETW
#(0.21),241212	: Add check if DEF_ROUTE is active
PGM="`basename $0|cut -d\. -f1`"
VER="0.21"
TMP="/tmp/${PGM}.$$"
CSV="/tmp/${PGM}.csv"
LOG="${HOME}/log/${PGM}.log"
HOSTNAME="`hostname|cut -d\. -f1`"
MAIL=""
MAILTO="maarten@agrarix.nl"
SUBN4="0"
SUBN3="0"
SUBN2="137"
SUBN1="44"
PART3=0
P_END3=255
PART4=1
P_END4=254
WEBUPD=""
HTML="/var/www/html/hamnet/index.html"
DATADIR="${HOME}/data"
DATAFILE="${DATADIR}/ping-netw-lookup.csv"
PREVRESULT=""
CHKSSH=""
SSH="/usr/bin/ssh -n"
NSLOOKUP=""
RCFILE="${HOME}/etc/${PGM}.rc"
HOSTSFILE=""
#HOSTSFILE="${HOME}/etc/hosts.137"
DO_PING=""
DO_NMAP=""
NMAP="/usr/bin/nmap"
IFILTER="44"
DNS_SERVER=""
NETW="${SUBN1}.${SUBN2}.${SUBN3}.${SUBN4}"
DEF_ROUTE=""

USAGE()
{
  echo "Usage: ${PGM} <options>"
  echo "  Version: ${VER}"
  echo "  options          :"
  echo "    -c|--chkssh    : Chk hostname with SSH (hostname) (${CHKSSH})"
  echo "    -f|--hostsfile : using HOSTSfile (${HOSTSFILE})"
  echo "    -h|--help      : this Help"
  echo "    -l|--nslookup  : with nsLookup"
  echo "    -m|--mail      : do send Mail"
  echo "    -n|--netw      : Netw (part) (${NETW})"
  echo "    -p|--ping      : do Ping (${DO_PING})"
  echo "    -w|--webupd    : Update Web page (${WEBUPD})"
  echo "    --end3         : End of subnet-part3 (${P_END3})"
  echo "    --end4         : End of subnet-part4 (${P_END4})"
  echo "    --nmap         : do NMAP (${DO_NMAP})"
  echo "    --ifilter      : define IFILTER (${IFILTER}))"
  echo "    -V             : show Version"
  echo "    -x             : set -x"
  echo "    --mailto      : change MAILTO address & do send mail (${MAILTO})"
}
if [ -f ${RCFILE} ]; then
  echo "  Reading RC-file (${RCFILE})..."|tee -a ${LOG}
  . ${RCFILE}
fi
## 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 | --chkssh) CHKSSH=1 ;;
    -m | --mail) MAIL=1 ;;
    --end3) P_END3="${2}"; shift ;;
    --end4) P_END4="${2}"; shift ;;
    --ifilter) IFILTER="${2}"; shift ;;
    -f | --hostsfile) HOSTSFILE="${2}"; shift ;;
    -l | --nslookup) NSLOOKUP=1 ;;
    -n | --netw) NETW="${2}"; shift ;;
    -w | --webupd) WEBUPD=1 ;;
    -p | --ping) DO_PING=1 ;;
    --nmap) DO_NMAP=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

#if [ "${SUBNET3}" != "" ]; then
#  SUBNET2=`echo "${SUBNET3}"|cut -d\. -f1-2`
#  PART3=`echo "${SUBNET3}"|cut -d\. -f3`
#fi  # SUBNET3 <> ""

echo "`date` ${PGM} v${VER} started. (NETW=${NETW})"|tee -a ${LOG}
touch ${TMP} 

SUBN1=`echo ${NETW}|cut -d\. -f1`
SUBN2=`echo ${NETW}|cut -d\. -f2`
SUBN3=`echo ${NETW}|cut -d\. -f3`
SUBN4=`echo ${NETW}|cut -d\. -f4`
CSV="/tmp/${PGM}_${SUBN2}.csv"
PART3=${SUBN3}
PART4=${SUBN4}

echo "SSH=${SSH}"
echo "CHKSSH=${CHKSSH}"
echo "CSV=${CSV}"
echo "DATADIR=${DATADIR}"
echo "DATAFILE=${DATAFILE}"
echo "DNS_SERVER=${DNS_SERVER}"
echo "DEF_ROUTE=${DEF_ROUTE}"
echo "DO_NMAP=${DO_NMAP}"
echo "DO_PING=${DO_PING}"
echo "HOSTSFILE=${HOSTSFILE}"
echo "HTML=${HTML}"
echo "IFILTER=${IFILTER}"
echo "MAIL=${MAIL}"
echo "MAILTO=${MAILTO}"
echo "NSLOOKUP=${NSLOOKUP}"
echo "NETW=${NETW}"
echo "RCFILE=${RCFILE}"
echo "SUBN1=${SUBN1}"
echo "SUBN2=${SUBN2}"
echo "SUBN3=${SUBN3}"
echo "SUBN4=${SUBN4}"
echo "PART3=${PART3}"
echo "PART4=${PART4}"
echo "P_END3=${P_END3}"
echo "P_END4=${P_END4}"
echo "WEBUPD=${WEBUPD}"
sleep 2

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

# ----------------------------------------
# -p : ping
#
if [ ${DO_PING} ]; then
# When HOSTSFILE would be, and not found, then exit
  if [ "${HOSTSFILE}" != "" ] && [ ! -f ${HOSTSFILE} ]; then
    echo "  NO HOSTSFILE (${HOSTSFILE}). Exiting ..."|tee -a ${LOG}
    exit 4
  fi

# Check is Def.route is active otherwise exit
  if [ "${DEF_ROUTE}" != "" ]; then
    ping -W 2 -c 2 ${DEF_ROUTE}
    EC=${?}
    if [ ${EC} -ne 0 ]; then
      echo "  DEF_ROUTE(${DEF_ROUTE}) not active. Exiting..."|tee -a ${LOG}
      exit 5
    fi  # EC <> 0
  fi  # DEF_ROUTE

# Empty ${CSV}
  echo "# IP-ADDR;STATUS;NSLOOKUP;NMAP_ANSW;" > ${CSV}

# Loop2 (3rd Octed)
  while [ ${PART3} -le ${P_END3} ]
  do
# Loop1 (4rd Octed)
    while [ ${PART4} -le ${P_END4} ]
    do
      echo "${SUBN1}.${SUBN2}.${PART3}.${PART4}"
      NSL=""

      if [ "${HOSTSFILE}" != "" ]; then
# When HOSTSFILE, Check if in HOSTSFILE
        ANSW=`grep "${SUBN1}.${SUBN2}.${PART3}.${PART4}" ${HOSTSFILE}`
        if [ "${ANSW}" != "" ]; then
          echo "  ${ANSW}"
          if [ ${NSLOOKUP} ]; then
            NSL="`nslookup ${SUBN1}.${SUBN}.${PART3}.${PART4} ${DNS_SERVER}|grep name|cut -d\= -f2|head -1`"
          fi  # NSLOOKUP
# ping (check)
          ping -W 1 -c 1 ${SUBN1}.${SUBN}.${PART3}.${PART4} 2> /dev/null
          EC=${?}
          if [ ${EC} -eq 0 ]; then
# WHen OK & DO_NAMP
            NMAP_ANSW=""
            if [ ${DO_NMAP} ]; then
              echo "    Testing NMAP ..."
              NMAP_ANSW=`${NMAP} ${SUBN1}.${SUBN2}.${PART3}.${PART4}|grep '^[0-9]*' `
            fi  # DO_NMAP
            echo "${SUBN1}.${SUBN2}.${PART3}.${PART4};OK;${NSL};${NMAP_ANSW};" | tee -a ${CSV}
          fi  # EC = 0 (is OK)
        fi  # ANSW grep HOSTSFILE
      else   # HOSTSFILE
# ping (check)
        ping -W 1 -c 1 ${SUBN1}.${SUBN2}.${PART3}.${PART4} 2> /dev/null
        EC=${?}
        if [ ${EC} -eq 0 ]; then
# WHen OK & DO_NAMP
          NMAP_ANSW=""
          if [ ${DO_NMAP} ]; then
            echo "    Testing NMAP ..."
            NMAP_ANSW=`${NMAP} ${SUBN1}.${SUBN2}.${PART3}.${PART4}|grep '^[0-9]*' `
          fi  # DO_NMAP
          echo "${SUBN1}.${SUBN2}.${PART3}.${PART4};OK;${NSL};${NMAP_ANSW};" | tee -a ${CSV}
        fi  # EC = 0 (is OK)
      fi  # HOSTSFILE

      PART4="`expr ${PART4} + 1`"
    done  # Loop1
    PART4=1
    PART3="`expr ${PART3} + 1`"
  done  # Loop2
fi  # DO_PING


# ----------------------------------------
# -w : WEBUPD
if [ ${WEBUPD} ]; then
  echo "  Updating Website (${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> Ping & DNS status: </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=1 width='100%'>" >> ${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 </TD>" >> ${HTML}
#  echo "  <TD BGCOLOR=lightblue> <B> Remarks </TD>" >> ${HTML}
#  echo "  <TD BGCOLOR=lightblue> <B> Previous (ping) result </TD>" >> ${HTML}
  echo "</TR>" >> ${HTML}

  REMARKS=""
  PREVRESULT=""
  PREVCOL=""

  if [ -f ${CSV} ]; then
    cat ${CSV} | grep -v ^#|grep "${IFILTER}"| while read LINE
    do
      echo "<TR>" >> ${HTML}
      IPCOL=""
      PINGCOL=""
      PINGSTR=""
      NSLCOL=""

#      echo ${LINE}
      IP_ADDR=`echo ${LINE}|awk -F\; '{print $1}'`
      PINGSTR=`echo ${LINE}|awk -F\; '{print $2}'`
      NSL=`echo ${LINE}|awk -F\; '{print $3}'`

      if [ ${NSLOOKUP} ]; then
        NSL="`nslookup ${IP_ADDR} ${DNS_SERVER}|grep name|cut -d\= -f2|head -1`"
      fi  # NSLOOKUP

      if [ "${PINGSTR}" = "OK" ] && [ "${NSL}" != "" ]; then
        IPCOL="lightgreen"
        PINGCOL="lightgreen"
        NSLCOL="lightgreen"
        REMARKS="All OK"
        REMCOL="lightgreen"
      fi
      if [ "${PINGSTR}" = "OK" ] && [ "${NSL}" = "" ]; then
        IPCOL="yellow"
        PINGCOL="yellow"
        NSLCOL="yellow"
        REMARKS="Need to be added in DNS?"
        REMCOL="yellow"

        SSHANSW=""
        if [ ${CHKSSH} ]; then
          SSHANSW=`${SSH} ${SUBN1}.${SUBN2}.${PART3}.${PART4} hostname`
          NSL="hostname: ${SSHANSW}" 
        fi  # CHKSSH
      fi
      if [ "${PINGSTR}" = "OK" ] && [ "${NSL}" != "" ]; then
        IPCOL="lightgreen"
        PINGCOL="lightgreen"
        REMARKS="ping OK"
        REMCOL="lightgreen"
      fi
      if [ "${PINGSTR}" != "OK" ] && [ "${NSL}" != "" ]; then
        IPCOL="orange"
        PINGCOL="orange"
        NSLCOL="orange"
        REMARKS="Is in DNS. But NO answer"
        REMCOL="orange"
      fi

      NMAP_ANSW=""
      ANSW80=""
      ANSW443=""
      if [ ${DO_NMAP} ]; then
        echo -n "  NMAPing ... "
	NMAP_ANSW=`${NMAP} ${IP_ADDR} --open --host-timeout 10| grep "^[0-9]"|sed 's/open//g'`
	echo "${NMAP_ANSW}"
	ANSW80=`echo "${NMAP_ANSW}" |grep "80/tcp"`
	ANSW443=`echo "${NMAP_ANSW}" |grep "443/tcp"`
      fi

      echo "${IP_ADDR};${PINGSTR};${NSL};${NMAP_ANSW};"

      if [ "${REMCOL}" != "" ]; then
	if [ "${ANSW80}" != "" ] || [ "${ANSW443}" != "" ]; then
          echo "  <TD BGCOLOR=${IPCOL}> <A HREF=\"//${IP_ADDR}\" target=\"_blank\">${IP_ADDR}</A> </TD>" >> ${HTML}
	else
          echo "  <TD BGCOLOR=${IPCOL}> ${IP_ADDR} </TD>" >> ${HTML}
	fi
        echo "  <TD BGCOLOR=${PINGCOL}> ${PINGSTR} </TD>" >> ${HTML}
        echo "  <TD BGCOLOR=${NSLCOL}> ${NSL} </TD>" >>  ${HTML}
        echo "  <TD BGCOLOR=""> ${NMAP_ANSW} </TD>" >>  ${HTML}
#        echo "  <TD BGCOLOR=${REMCOL}> ${REMARKS} </TD>" >>  ${HTML}
#        echo "  <TD BGCOLOR=${PREVCOL}> ${PREVRESULT} </TD>" >> ${HTML}
      fi  # REMCOL

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

    done  # cat ${CSV}
  fi  # CSV

## Search for PREV
#  if [ -f ${DATAFILE} ]; then
#    PREVRESULT=`grep "${SUBNET2}.${PART3}.${PART4};" ${DATAFILE}|awk -F\; '{print $2}'`
#    if [ "${PINGSTR}" = "OK" ] && [ "${PINGSTR}" = "${PREVRESULT}" ]; then
#      PREVCOL="lightgreen"
#    fi
#    if [ "${PREVRESULT}" = "OK" ] && [ "${PINGSTR}" != "${PREVRESULT}" ]; then
#      PREVCOL="yellow"
#    fi
##echo "  PREVRESULT=${PREVRESULT}  PREVCOL=${PREVCOL}"
#  fi  # -f DATAFILE


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

  echo "<TABLE width='100%'>" >> ${HTML}
  echo "<TR> " >> ${HTML}
  echo "  <TD bgColor=lightblue > " >> ${HTML}
  echo "    <FONT COLOR=white face='Verdana' size='1'>" >> ${HTML}
  echo "      <CENTER>" >> ${HTML}
  echo "Contact + Content Owner: <A HREF="mailto:Maarten@Agrarix.nl">Maarten de Boer</A> <BR> Last Update: `date` <BR> [${PGM} v${VER} @ ${HOSTNAME} ]<BR>" >> ${HTML}
  echo "      </CENTER>" >> ${HTML}
  echo "    </FONT>" >> ${HTML}
  echo "  </TD>" >> ${HTML}
  echo "</TR>" >> ${HTML}
  echo "</TABLE>" >> ${HTML}

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

fi  # WEBUDP


echo "# `date` ${PGM} v${VER} finised" >> ${CSV}

# ----------------------------------------------
# -m  mail
if [ ${MAIL} ]; then
  date| mailx -a ${CSV} -s ":${HOSTNAME}: ping netw ${NETW} [${PGM} v${VER}]" ${MAILTO}
  echo "`date` Mailed to ${MAILTO}"|tee -a ${LOG}
fi

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

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

