#!/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} "[31mWARNING[0m\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} "[32mOK[0m\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