#!/bin/bash
#< Nagios plugin - check time deviation between two F5 BIG-IP LTM nodes

ECHO="/bin/echo"
SSH="/usr/bin/ssh"

R_DATE="/bin/date"

BIGIP_1="192.168.x.x"
BIGIP_2="192.168.x.x"
BIGIP_USER="root"
# permitted time deviation between nodes 
WARN="5"        
CRIT="10"

VERBOSE=0

E_SUCCESS=0
E_WARNING=1
E_CRITICAL=2
E_UNKNOWN=3

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

function check_ssh {
   for BIGIP in ${BIGIP_1} ${BIGIP_2}; do
      (( VERBOSE )) && { ${ECHO} "--> Testing SSH ${BIGIP_USER}@${BIGIP}"; }
      ${SSH} -q -o ConnectTimeout=2 -o BatchMode=yes ${BIGIP_USER}@${BIGIP} 'exit'
      if [ "$?" -ne "0" ]; then
         ${ECHO} "CRITICAL: Could not SSH to ${BIGIP}"
         exit ${E_CRITICAL}
      fi
      (( VERBOSE )) && { ${ECHO} "<-- SSH Test Successful"; }
   done
}

if [ "$1" = '-v' ]; then
   VERBOSE=1
fi


function check_epoch {
   BIGIP_NODE_1_EPOCH=$( ${SSH} -o ConnectTimeout=2 -o BatchMode=yes ${BIGIP_USER}@${BIGIP_1} "${R_DATE} +%s" )
   if [ "$?" -ne "0" ]; then
      ${ECHO} "CRITICAL: Could not get time from ${BIGIP}"
      exit ${E_CRITICAL}
   fi
   BIGIP_NODE_2_EPOCH=$( ${SSH} -o ConnectTimeout=2 -o BatchMode=yes ${BIGIP_USER}@${BIGIP_2} "${R_DATE} +%s" )
   if [ "$?" -ne "0" ]; then
      ${ECHO} "CRITICAL: Could not get time from ${BIGIP}"
      exit ${E_CRITICAL}
   fi
   (( VERBOSE )) && {
      ${ECHO} "--> NODE 1 [${BIGIP_1}] - ${BIGIP_NODE_1_EPOCH}"
      ${ECHO} "--> NODE 2 [${BIGIP_2}] - ${BIGIP_NODE_2_EPOCH}"
   }
   if [ "${BIGIP_NODE_1_EPOCH}" -eq "${BIGIP_NODE_2_EPOCH}" ]; then
      ${ECHO} "OK: No time difference"
      exit ${E_SUCCESS}
   fi
   if [ "${BIGIP_NODE_1_EPOCH}" -gt "${BIGIP_NODE_2_EPOCH}" ]; then
      DIFFERENCE=$(( BIGIP_NODE_1_EPOCH - BIGIP_NODE_2_EPOCH ))
      if [ "${DIFFERENCE}" -ge "${CRIT}" ]; then
         ${ECHO} "CRITICAL: ${DIFFERENCE}s time difference"
         exit ${E_CRITICAL}
      elif [ "${DIFFERENCE}" -ge "${WARN}" ]; then
         ${ECHO} "WARNING: ${DIFFERENCE}s time difference"
         exit ${E_WARNING}
      else
         ${ECHO} "OK: ${DIFFERENCE}s time difference"
         exit ${E_SUCCESS}
      fi
   fi
   if [ "${BIGIP_NODE_2_EPOCH}" -gt "${BIGIP_NODE_1_EPOCH}" ]; then
      DIFFERENCE=$(( BIGIP_NODE_2_EPOCH - BIGIP_NODE_1_EPOCH ))
      if [ "${DIFFERENCE}" -ge "${CRIT}" ]; then
         ${ECHO} "CRITICAL: ${DIFFERENCE}s time difference"
         exit ${E_CRITICAL}
      elif [ "${DIFFERENCE}" -ge "${WARN}" ]; then
         ${ECHO} "WARNING: ${DIFFERENCE}s time difference"
         exit ${E_WARNING}
      else
         ${ECHO} "OK: ${DIFFERENCE}s time difference"
         exit ${E_SUCCESS}
      fi
   fi
}

check_ssh
check_epoch

${ECHO} "UNKNOWN: Should never be reached"
exit ${E_UNKNOWN}