#!/bin/sh
# Plugin to check Ironport Appliances
# Desarrollado por Claudio Saavedra (20080120)
# Translated to english by Steven Geerts (20080316)
# Added various extra checks by Steven Geerts (20080830)
# Added feature key checks by Paul Robinson paul@syntonic.com.au (20090711)

# input parameters
HOSTNAME=$1
USER=$2
PASSWORD=$3
ARGS=$4
PAR_WARN=$5
PAR_CRIT=$6


STATUSFILE=/tmp/status.`echo $RANDOM$RANDOM|cut -c1-4`

# Nagios return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

PROGNAME=`basename $0`

print_usage() {
  echo ""
        echo "Usage: $PROGNAME <hostname> <user> <password> <parameter> <warning_nro> <critical_nro>"
        echo ""
        echo "Notes:"
        echo " hostname  - Can be a hostname or IP address"
  echo " parameter - Can be status, cpu, ram, msgxhour, conn_in, conn_out, queue, workqueue,"
  echo "              msgs_in_quarantine, disk_util, queuedisk_usage or resourseconservation"
  echo "	      vof_license, sophos_license, ipspam_license, cm_license"
        echo ""
        echo "parameters for STATUS are ignored but must be provided. The results for STATUS can be OK or critical."
        echo "parameters for RESOURSECONSERVATION should be 1 and 2."
	echo "parameters for *_license should reverse warning and critical values (since less days remaining is actually critical but script requires warning to be less than critical)."
}
# XML Parameter info:
# <system status="online" /> DONE
# <gauge name="ram_utilization" current="7" /> DONE
# <gauge name="total_utilization" current="1" /> DONE
# <gauge name="cpu_utilization" current="0" />
# <gauge name="av_utilization" current="0" /> 
# <gauge name="case_utilization" current="0" /> 
# <gauge name="bm_utilization" current="0" /> 
# <gauge name="disk_utilization" current="1" /> DONE
# <gauge name="resource_conservation" current="0" /> DONE
# <gauge name="log_used" current="24" /> 
# <gauge name="log_available" current="123G" /> 
# <gauge name="conn_in" current="5" /> DONE
# <gauge name="conn_out" current="1" /> DONE
# <gauge name="active_recips" current="70" /> 
# <gauge name="unattempted_recips" current="64" /> DONE 
# <gauge name="attempted_recips" current="6" /> DONE
# <gauge name="msgs_in_work_queue" current="0" /> DONE
# <gauge name="dests_in_memory" current="86" /> 
# <gauge name="kbytes_used" current="3458" />  DONE
# <gauge name="kbytes_free" current="71299710" /> DONE
# <gauge name="msgs_in_quarantine" current="24" /> DONE
# <gauge name="kbytes_in_quarantine" current="1616" /> 
# <gauge name="reporting_utilization" current="0" /> 
# <gauge name="quarantine_utilization" current="0" /> 

while test -n "$1"; do
        case "$1" in
                --help)
                        print_usage
                        exit $STATE_OK
                        ;;
                -h)
                        print_usage
                        exit $STATE_OK
                        ;;
        esac
        shift
done

# Check arguments for validity
if [ -z ${HOSTNAME} ]; then
        echo "Please specify the hostname!"
        print_usage
        exitstatus=$STATE_UNKNOWN
        exit $exitstatus
fi

if [ $PAR_WARN -ge $PAR_CRIT ]; then
  exitstatus=$STATE_UNKNOWN
        echo "The WARNING number can not be larger or equal to the CRITICAL number!"
        exit $exitstatus
fi

wget --http-user=$USER --http-password=$PASSWORD --no-check-certificate --no-proxy https://$HOSTNAME/xml/status --output-document=$STATUSFILE  >> /dev/null 2>&1
#wget --http-user=$USER --http-password=$PASSWORD --no-check-certificate https://$HOSTNAME/xml/status --output-document=$STATUSFILE  >> /dev/null 2>&1



if [ $? -ne 0 ]; then
  exitstatus=${STATE_UNKNOWN}
  echo ""
  echo "Can't collect data from an Ironpor appliance Ironport. Verify hostname, userID and password!"
  rm -rf $STATUSFILE
  exit $exitstatus
else 
  exitstatus=${STATE_OK}
fi

case "$ARGS" in

# <system status="online" /> DONE
# <gauge name="ram_utilization" current="7" /> DONE
 status)
                IPORTPAR=`grep "system status" $STATUSFILE | cut -d\" -f 2`
                if [ $IPORTPAR = online ]; then
                   exitstatus=${STATE_OK}
                   echo "STATUS OK: $IPORTPAR"
                else
                   exitstatus=${STATE_CRITICAL}
                   echo "STATUS CRITICAL: $IPORTPAR"
                fi
                ;;
  
  cpu)
                IPORTPAR=`grep total_utilization $STATUSFILE | cut -d\" -f 4`
                if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "CPU CRITICAL: $IPORTPAR%"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "CPU WARNING: $IPORTPAR%"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "CPU OK: $IPORTPAR%"
                fi
                ;;
  ram)
                IPORTPAR=`grep ram_utilization $STATUSFILE | cut -d\" -f 4`
                if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "RAM CRITICAL: $IPORTPAR%"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "RAM WARNING: $IPORTPAR%"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "RAM OK: $IPORTPAR%"
                fi
                ;;
  msgxhour)
                IPORTPAR=`grep -A 3 "rate name=\"inj_msgs" $STATUSFILE | grep last_15_min | cut -d\" -f 2  `
                if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "MAIL RATE CRITICAL: $IPORTPAR msgs/hr"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "MAIL RATE WARNING: $IPORTPAR msgs/hr"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "MAIL RATE OK: $IPORTPAR msgs/hr"
                fi
                ;;
  conn_in)
                IPORTPAR=`grep conn_in  $STATUSFILE | cut -d\" -f 4`
                if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "Incomming Connections CRITICAL: $IPORTPAR connections"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "Incomming Connections WARNING: $IPORTPAR connections"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "Incomming Connections OK: $IPORTPAR connections"
                fi
                ;;
  conn_out)
                IPORTPAR=`grep conn_out  $STATUSFILE | cut -d\" -f 4`
                if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "Outgoing Connections CRITICAL: $IPORTPAR connections"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "Outgoing Connections WARNING: $IPORTPAR connections"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "Outgoing Connections OK: $IPORTPAR connections"
                fi
                ;;
                  
  queue)
               IPORTPAR1=`grep \"attempted_recips $STATUSFILE | cut -d\" -f 4`
               IPORTPAR2=`grep unattempted_recips $STATUSFILE | cut -d\" -f 4`
               IPORTPAR=`expr $IPORTPAR1 + $IPORTPAR2`
               if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "QUEUE CRITICAL: $IPORTPAR msgs"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "QUEUE WARNING: $IPORTPAR msgs"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "QUEUE OK: $IPORTPAR msgs"
                fi
                ;;
  workqueue)
                IPORTPAR=`grep msgs_in_work_queue $STATUSFILE | cut -d\" -f 4`
                if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "WORKQUEUE CRITICAL: $IPORTPAR msgs"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "WORKQUEUE WARNING: $IPORTPAR msgs"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "WORKQUEUE OK: $IPORTPAR msgs"
                fi
                ;;
   resourseconservation)
                IPORTPAR=`grep resource_conservation $STATUSFILE | cut -d\" -f 4`
                if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "RESOURSECONSERVATION CRITICAL: $IPORTPAR "
                        else
                                exitstatus=${STATE_WARNING}
                                echo "RESOURSECONSERVATION WARNING: $IPORTPAR "
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "RESOURSECONSERVATION OK: $IPORTPAR "
                fi
                ;;
  disk_util)
                IPORTPAR=`grep disk_utilization $STATUSFILE | cut -d\" -f 4`
                if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "Disk Utilization CRITICAL: $IPORTPAR "
                        else
                                exitstatus=${STATE_WARNING}
                                echo "Disk Utilization WARNING: $IPORTPAR "
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "Disk Utilization OK: $IPORTPAR "
                fi
                ;;
  msgs_in_quarantine)
              IPORTPAR=`grep msgs_in_quarantine $STATUSFILE | cut -d\" -f 4`
                if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "MSG In Quarantine CRITICAL: $IPORTPAR "
                        else
                                exitstatus=${STATE_WARNING}
                                echo "MSG In Quarantine WARNING: $IPORTPAR "
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "MSG In Quarantine OK: $IPORTPAR "
                fi
                ;;
  queuedisk_usage) 
               IPORTPAR1=`grep kbytes_free $STATUSFILE | cut -d\" -f 4`
               IPORTPAR2=`grep kbytes_used $STATUSFILE | cut -d\" -f 4`
               IPORTPAR3="$(( $IPORTPAR1 / 100 ))"
               IPORTPAR="$(( $IPORTPAR2 / $IPORTPAR3 ))"
                if [ $IPORTPAR -ge $PAR_WARN ]; then
                        if [ $IPORTPAR -ge $PAR_CRIT ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "QueueDisk Usage CRITICAL: $IPORTPAR%"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "QueueDisk Usage WARNING: $IPORTPAR% "
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "QueueDisk Usage OK: $IPORTPAR% "
                fi
                ;;
  vof_license)
		IPORTPAR=`grep "Virus Outbreak Filters" $STATUSFILE | cut -d\" -f 4`
		PAR_WARN="$(( $PAR_WARN * 3600 * 24 ))"
		PAR_CRIT="$(( $PAR_CRIT * 3600 * 24 ))"
		HUMAN_PAR="$(( $IPORTPAR / 24 / 3600 ))"
                if [ $IPORTPAR -le $PAR_CRIT ]; then
                        if [ $IPORTPAR -le $PAR_WARN ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "Virus Outbreak License CRITICAL: $HUMAN_PAR days remaining"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "Virus Outbreak License WARNING: $HUMAN_PAR days remaining"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "Virus Outbreak License OK: $HUMAN_PAR days remaining"
                fi
                ;;
  ipspam_license)
                IPORTPAR=`grep "IronPort Anti-Spam" $STATUSFILE | cut -d\" -f 4`
                PAR_WARN="$(( $PAR_WARN * 3600 * 24 ))"
                PAR_CRIT="$(( $PAR_CRIT * 3600 * 24 ))"
                HUMAN_PAR="$(( $IPORTPAR / 24 / 3600 ))"
                if [ $IPORTPAR -le $PAR_CRIT ]; then
                        if [ $IPORTPAR -le $PAR_WARN ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "IronPort Anti-Spam License CRITICAL: $HUMAN_PAR days remaining"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "IronPort Anti-Spam License WARNING: $HUMAN_PAR days remaining"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "IronPort Anti-Spam License OK: $HUMAN_PAR days remaining"
                fi
                ;;
  sophos_license)
                IPORTPAR=`grep "Sophos" $STATUSFILE | cut -d\" -f 4`
                PAR_WARN="$(( $PAR_WARN * 3600 * 24 ))"
                PAR_CRIT="$(( $PAR_CRIT * 3600 * 24 ))"
                HUMAN_PAR="$(( $IPORTPAR / 24 / 3600 ))"
                if [ $IPORTPAR -le $PAR_CRIT ]; then
                        if [ $IPORTPAR -le $PAR_WARN ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "Sophos License CRITICAL: $HUMAN_PAR days remaining"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "Sophos Outbreak License WARNING: $HUMAN_PAR days remaining"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "Sophos License OK: $HUMAN_PAR days remaining"
                fi
                ;;
  cm_license)
                IPORTPAR=`grep "Central Mgmt" $STATUSFILE | cut -d\" -f 4`
                PAR_WARN="$(( $PAR_WARN * 3600 * 24 ))"
                PAR_CRIT="$(( $PAR_CRIT * 3600 * 24 ))"
                HUMAN_PAR="$(( $IPORTPAR / 24 / 3600 ))"
                if [ $IPORTPAR -le $PAR_CRIT ]; then
                        if [ $IPORTPAR -le $PAR_WARN ]; then
                                exitstatus=${STATE_CRITICAL}
                                echo "Central Mgmt License CRITICAL: $HUMAN_PAR days remaining"
                        else
                                exitstatus=${STATE_WARNING}
                                echo "Central Mgmt License WARNING: $HUMAN_PAR days remaining"
                        fi
                else
                        exitstatus=${STATE_OK}
                        echo "Central Mgmt License OK: $HUMAN_PAR days remaining"
                fi
                ;;


  

  *)
    print_usage
    exit $STATE_OK
esac

rm -rf $STATUSFILE

exit $exitstatus


