#!/bin/bash
#< Script to check Spamhaus RBL's to see if IP is listed
# Requires: common_functions.sh
#           valip

BASENAME="/usr/bin/basename"
CURL="/usr/bin/curl"
ECHO="/usr/bin/echo"
GREP="/bin/grep"
PRINTF="/usr/bin/printf"
RM="/usr/bin/rm"
SED="/bin/sed"
VALIP="/home/kevin/tmp/sbl/valip"

COMMON_FUNCTIONS="/home/kevin/tmp/sbl/common_functions.sh"
TMP_ROOT="/var/tmp"
TMP_FILE="${TMP_ROOT}/spamhaus_check.$$"

ADDRESS=0
COLOUR=0
FOUNDIT=0
IP_TO_CHECK="invalid.ip.address.here"
HELP=0
UNKNOWN=0
VERBOSE=0

THIS_PROG=$( ${BASENAME} $0 )

function cleanup {
   ${RM} -f ${TMP_FILE} 
}

trap "cleanup; exit 255" 1 2 3 15

. ${COMMON_FUNCTIONS} 2>/dev/null || {
   ${ECHO} "Error: Could not load common functions"
   exit 255
}

function print_usage {
   {
      ${ECHO} "Usage: ${THIS_PROG} [-chv] -a <ipaddress>"
      ${ECHO} "       -a    Specify IP address to check"
      ${ECHO} "       -c    Display output in colour"
      ${ECHO} "       -h    Display this usage message"
      ${ECHO} "       -v    Operate in verbose mode"
   } >&2
}

function check_dependencies {
   for DEPENDENT in ${VALIP}; do
      requires "${DEPENDENT}" || {
         print_error "could not find dependent ${DEPENDENT}"
	 exit 255
      }
   done
   for EXECUTABLE in ${VALIP}; do
      is_exe "${EXECUTABLE}" || {
         print_error "${EXECUTABLE} found, but not executable"
	 exit 255
      }
   done
}

function check_ip {
   ${ECHO} ${IP_TO_CHECK} | ${VALIP} >/dev/null 2>&1
   if [ "$?" -ne "0" ]; then
      print_error "${IP_TO_CHECK} is not a valid IPv4 address"
      exit 255
   fi
}

function convert_to_regex {
   IP_REGEX=$( ${ECHO} ${IP_TO_CHECK} | ${SED} 's/\./\\\./g' ) 
}

function get_html {
   URL="http://www.spamhaus.org/query"
   PAGE="bl?ip="
   ${CURL} "${URL}/${PAGE}${IP_TO_CHECK}" -o ${TMP_FILE} 2>/dev/null
   RESULTS=$( ${GREP} "${IP_TO_CHECK}" ${TMP_FILE} )
   LISTS=$( ${ECHO} "${RESULTS}" | ${SED} 's/^.*\([A-Z]BL\).*$/\1/' )
   for LIST in ${LISTS}; do
      CURRENT_LINE=$( ${ECHO} "${RESULTS}" | ${GREP} "${LIST}" )
      ${ECHO} "${CURRENT_LINE}" | ${GREP} "is listed in the ${LIST}" >/dev/null 2>&1
      if [ "$?" -eq "0" ]; then
	 (( COLOUR )) && {
            ${PRINTF} "WARNING\tIP ${IP_TO_CHECK} IS LISTED IN THE SPAMHAUS ${LIST}\n"
	 } || {
            ${PRINTF} "WARNING\tIP ${IP_TO_CHECK} IS LISTED IN THE SPAMHAUS ${LIST}\n"
	 }
	 FOUNDIT=1
      else
         (( VERBOSE )) && {
	    (( COLOUR )) && {
	       ${PRINTF} "OK\tIP ${IP_TO_CHECK} IS NOT LISTED IN THE SPAMHAUS ${LIST}\n"
	    } || {
	       ${PRINTF} "OK\tIP ${IP_TO_CHECK} IS NOT LISTED IN THE SPAMHAUS ${LIST}\n"
	    }
	 }
      fi
   done
}

while getopts ":a:chv" OPTION; do
   case ${OPTION} in
      "a")   ADDRESS="1"       
             IP_TO_CHECK="${OPTARG}"  ;;
      "c")   COLOUR="1"               ;;
      "h")   HELP="1"                 ;;
      "v")   VERBOSE="1"              ;;
      *  )   UNKNOWN="1"              ;;
   esac
done
shift $(( ${OPTIND} - 1 ))

if [ "${HELP}" -gt "0" ]; then
   print_usage && exit 0
elif [ "${UNKNOWN}" -gt "0" ]; then
   print_usage && exit 255
fi

if [ "${ADDRESS}" -ne "1" ]; then
   print_error "-a must be specified" && exit 255
fi

check_dependencies
check_ip
convert_to_regex
get_html
cleanup

if [ "${FOUNDIT}" -eq "1" ]; then
   exit 1
else
   exit 0
fi