#!/bin/bash
#< Perform DNS zone serial check against two reference nameservers

AWK="/usr/bin/awk"
BASENAME="/usr/bin/basename"
DIG="/usr/bin/dig"
ECHO="/usr/bin/echo"
GREP="/bin/grep"
SED="/usr/bin/sed"
SCP="/usr/bin/scp"
SLEEP="/usr/bin/sleep"

DIGOPTS="+noadd +noauth +nostats +noquestion +nocomments +nocmd +time=2"
SERVER1="nameserver1.com"
SERVER2="nameserver2.com"
FILEHOST="nameserver1.com"
THISPROG=$( ${BASENAME} $0 )

TMP_DIR="${HOME}/check_serials/tmp"
L_SEC_CONF="${TMP_DIR}/sec.cogent.conf"
R_SEC_CONF="/dns/var/bind/conf/somezones.conf"

RECORDTYPE="soa"
VERBOSE=0

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

function check_args {
   if [ "${NAME}" = "" ]; then
      print_usage && exit 1  
   elif [ "${RECORDTYPE}" = "" ]; then
      print_usage && exit 1  
   fi
}

function get_conf {
   ${SCP} -q username@${FILEHOST}:${R_SEC_CONF} ${L_SEC_CONF} || {
      print_error "Cannot SCP configuration from ${FILEHOST}" && exit 1
   }
}

function perform_checks {
   ${SED} -n '/^zone/ s/^zone \"\([^"]*\)" {.*$/\1/p' ${L_SEC_CONF} | while read NAME; do
      SERIAL1=""
      SERIAL2=""
      DIGOUTPUT=""
      DIGOUTPUT=$( ${DIG} ${DIGOPTS} ${RECORDTYPE} ${NAME} @${SERVER1} 2>&1 )
      ${ECHO} "${DIGOUTPUT}" | ${AWK} '{print $7}' | ${GREP} '^[0-9]\{1,\}$' >/dev/null 2>&1
      if [ "$?" -eq "0" ]; then
         SERIAL1=$( ${ECHO} "${DIGOUTPUT}" | ${AWK} '{print $7}' )
      else
         # Try again...
         SERIAL1=""
         DIGOUTPUT=$( ${DIG} ${DIGOPTS} ${RECORDTYPE} ${NAME} @${SERVER1} 2>&1 )
         ${ECHO} "${DIGOUTPUT}" | ${AWK} '{print $7}' | ${GREP} '^[0-9]\{1,\}$' >/dev/null 2>&1
         if [ "$?" -eq "0" ]; then
            SERIAL1=$( ${ECHO} "${DIGOUTPUT}" | ${AWK} '{print $7}' )
         else
            print_error "Could not get serial for ${NAME}@${SERVER1}"
         fi
      fi
      DIGOUTPUT=$( ${DIG} ${DIGOPTS} ${RECORDTYPE} ${NAME} @${SERVER2} 2>&1 )
      ${ECHO} "${DIGOUTPUT}" | ${AWK} '{print $7}' | ${GREP} '^[0-9]\{1,\}$' >/dev/null 2>&1
      if [ "$?" -eq "0" ]; then
         SERIAL2=$( ${ECHO} "${DIGOUTPUT}" | ${AWK} '{print $7}' )
      else
         # Try again...
         SERIAL2=""
         DIGOUTPUT=$( ${DIG} ${DIGOPTS} ${RECORDTYPE} ${NAME} @${SERVER2} 2>&1 )
         ${ECHO} "${DIGOUTPUT}" | ${AWK} '{print $7}' | ${GREP} '^[0-9]\{1,\}$' >/dev/null 2>&1
         if [ "$?" -eq "0" ]; then
            SERIAL2=$( ${ECHO} "${DIGOUTPUT}" | ${AWK} '{print $7}' )
         else
            print_error "Could not get serial for ${NAME}@${SERVER2}"
         fi 
      fi
      if [ "${SERIAL1}" != "${SERIAL2}" ]; then
         ${ECHO} "${SERVER1}[${NAME}] Serial: ${SERIAL1} != ${SERVER2}[${NAME}] Serial: ${SERIAL2}"
      fi
   done
}

get_conf
perform_checks

exit 0