#!/bin/bash
#< Check multiple RBLs on robtex.com to see if an IP is listed

AWK="/usr/bin/awk"
BASENAME="/usr/bin/basename"
CURL="/usr/bin/curl"
ECHO="/bin/echo"
EGREP="/usr/bin/egrep"
MV="/bin/mv"
PASTE="/usr/bin/paste"
RM="/bin/rm"
SED="/usr/bin/sed"
TR="/usr/bin/tr"
VALIP="./valip"

OUTPUT_FILE="./www.out"
THISPROG=$( ${BASENAME} $0 )
URL_PREFIX="http://www.robtex.com/rbls/"
URL_SUFFIX=".html"

function print_error {
   ${ECHO} "Error: $@" >&2
}

function print_usage {
   {
      ${ECHO} "Usage: ${THISPROG} <ip_to_check>"
   } >&2
}

function check_valip {
   if [ ! -x "${VALIP}" ]; then
      print_error "This script requires \"valip\"" && exit 1
   fi
}

function validate_ip {
   # Let valip print it's error if returned
   ${ECHO} "${IP_ADDRESS}" | ${VALIP}
   [[ "$?" -ne "0" ]] && exit 1
}

function check_url {
   HTTP_CODE=$( ${CURL} -s -o /dev/null -w%{http_code} ${URL_PREFIX}${IP_ADDRESS}${URL_SUFFIX} )
   if [ "${HTTP_CODE}" -ne "200" ]; then
      print_error "Issues downloading ${URL_PREFIX}${IP_ADDRESS}${URL_SUFFIX}"
      exit 1
   fi
}

function get_url {
   ${CURL} ${URL_PREFIX}${IP_ADDRESS}${URL_SUFFIX} > ${OUTPUT_FILE} 2> /dev/null
}

# relies on strict formatting of the page at www.robtex.com/rbls - if this changes,
# the parsing code will require a change too
function parse_html {
   ${SED} -n '/<table border=1/,/<\/table/ p' ${OUTPUT_FILE} > ${OUTPUT_FILE}.tmp
   ${MV} ${OUTPUT_FILE}.tmp ${OUTPUT_FILE} 
   ${EGREP} -v '<table|</table' ${OUTPUT_FILE} |\
      ${SED} '1,6 d' | ${EGREP} -v '<tr|</tr' |\
      ${PASTE} - - - - - | ${TR} -d '\t' |\
      ${SED} -e 's/<[^>]*>/ /g' -e 's/^[ ]*//' |\
      ${TR} -s ' ' | while read LINE; do
         PARTRESULT=$( ${ECHO} "${LINE}" | ${AWK} '{print $4}' )
         if [ "${PARTRESULT}" = "BLACKLISTED" ]; then
            RBL=$( ${ECHO} "${LINE}" | ${AWK} '{print $1}' )
            URL=$( ${ECHO} "${LINE}" | ${AWK} '{print $2}' )
            ${ECHO} "WARNING! ${IP_ADDRESS} is listed on ${RBL} [${URL}]"
         fi
      done
}

function cleanup {
   ${RM} -f ${OUTPUT_FILE} ${OUTPUT_FILE}.tmp
}

#
# main()
#
# need valip check....
trap 'cleanup; exit 1' 1 2 3 15

if [ "$#" -ne "1" ]; then
   print_usage && exit 1
fi
IP_ADDRESS="$1"

validate_ip
check_url
get_url
parse_html
cleanup

exit 0