#!/bin/bash

# check_dell_powerconnect
# Description : Check the status of DELL PowerConnect Switch
# Version : 2.0
# Author : Jochem van den Anker (original script Yoann LAMY)
# Thanx to: Lorentz Casimir Lyceum Eindhoven
# Licence : GPLv2

# Commands
CMD_BASENAME="/usr/bin/basename"
CMD_SNMPGET="/usr/bin/snmpget"
CMD_SNMPWALK="/usr/bin/snmpwalk"
CMD_AWK="/usr/bin/awk"
CMD_GREP="/bin/grep"
CMD_EXPR="/usr/bin/expr"

# Script name
SCRIPTNAME=`$CMD_BASENAME $0`

# Version
VERSION="2.0"

# Plugin return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

# OID's
OID_FIRMWARE=".1.3.6.1.4.1.674.10895.3000.1.2.100.4.0"
OID_MODEL=".1.3.6.1.4.1.674.10895.3000.1.2.100.1.0"
OID_UPTIME="1.3.6.1.2.1.1.3.0"
OID_PORTS_STATE="1.3.6.1.2.1.2.2.1.8"

# Default variables
DESCRIPTION="Unknown"
STATE=$STATE_UNKNOWN
PERFDATA=""
CPU_TEMP=""
NUMBER_PROC=0

# Default options
COMMUNITY="public"
HOSTNAME="127.0.0.1"
TYPE="firmware"
DISK=1
WARNING=0
CRITICAL=0

# Option processing
print_usage() {
  echo "Usage: ./check_dell_powerconnect -H 127.0.0.1 -C public -t portcheck -p 1"
  echo "  $SCRIPTNAME -H ADDRESS"
  echo "  $SCRIPTNAME -C STRING"
  echo "  $SCRIPTNAME -t STRING"
  echo "  $SCRIPTNAME -w INTEGER"
  echo "  $SCRIPTNAME -c INTEGER"
  echo "  $SCRIPTNAME -p INTEGER"
  echo "  $SCRIPTNAME -h"
  echo "  $SCRIPTNAME -V"
}

print_version() {
  echo $SCRIPTNAME version $VERSION
  echo ""
  echo "This nagios plugin comes with ABSOLUTELY NO WARRANTY."
  echo "You may redistribute copies of this plugin under the terms of the GNU General Public License v2."
}

print_help() {
  print_version
  echo ""
  print_usage
  echo ""
  echo "Check the status of a DELL PowerConnect Switch"
  echo ""
  echo "-H ADDRESS"
  echo "   Name or IP address of host (default: 127.0.0.1)"
  echo "-C STRING"
  echo "   Community name for the host's SNMP agent (default: public)"
  echo "-t STRING"
  echo "   Different status (uptime, firmware, model, ports, portcheck)"
  echo "-w INTEGER"
  echo "   Warning level (not available at this moment)"
  echo "-c INTEGER"
  echo "   Critical level (not available at this moment)"
  echo "-p INTEGER"
  echo "   Portnumber"
  echo "-h"
  echo "   Print this help screen"
  echo "-V"
  echo "   Print version and license information"
  echo ""
  echo ""
  echo "This plugin uses the 'snmpget' command and the 'snmpwalk' command included with the NET-SNMP package."
  echo "This plugin support performance data output."
  echo "If the percentage of the warning level and the critical level are set to 0, then the script returns an OK state."
}

while getopts H:C:t:d:w:c:p:hV OPT
do
  case $OPT in
    H) HOSTNAME="$OPTARG" ;;
    C) COMMUNITY="$OPTARG" ;;
    t) TYPE="$OPTARG" ;;
    w) WARNING="$OPTARG" ;;
    c) CRITICAL="$OPTARG" ;;
    p) PORT="$OPTARG" ;;
    h)
      print_help
      exit $STATE_UNKNOWN
      ;;
    V)
      print_version
      exit $STATE_UNKNOWN
      ;;
   esac
done

# Plugin processing

if [ $TYPE = "firmware" ]; then
  CODE=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME "${OID_FIRMWARE}"`
  if [ "$CODE" != '' ]; then
  	STATE=$STATE_OK;
  else
	STATE=$STATE_UNKNOWN;
  fi
  DESCRIPTION="Firmware: $CODE";

elif [ $TYPE = "model" ]; then
  CODE=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME "${OID_MODEL}"`
  if [ "$CODE" != '' ]; then
  	STATE=$STATE_OK;
  else
	STATE=$STATE_UNKNOWN;
  fi
  DESCRIPTION="Model: $CODE";

elif [ $TYPE = "uptime" ]; then
  CODE=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME "${OID_UPTIME}"`
  if [ "$CODE" != '' ]; then
	DESCRIPTION="Uptime: $CODE";
  	STATE=$STATE_OK;
  else
	DESCRIPTION="Down";
	STATE=$STATE_CRITICAL;
  fi

elif [ $TYPE = "ports" ]; then
  CODE=`$CMD_SNMPWALK -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME "${OID_PORTS_STATE}"`
  PORTSUP=`echo $CODE | awk -F "up" ' { print NF-1 } '`
  PORTSDOWN=`echo $CODE | awk -F "down" ' { print NF-1 } '`
  if [ "$PORTSUP" -ge 0 ] && [ "$PORTSDOWN" -ge 0 ]; then
	  DESCRIPTION="Ports: Up: $PORTSUP Down: $PORTSDOWN";
	  STATE=$STATE_OK;
  else
	  DESCRIPTION="Ports: Up: UNKNOWN Down: UNKNOWN";
	  STATE=$STATE_UNKNOWN;
  fi
elif [ $TYPE = "portcheck" ]; then
  CODE=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME "${OID_PORTS_STATE}.${PORT}"`
  if [ "$CODE" != '' ]; then 
	DESCRIPTION="Status port $PORT: $CODE";
	if [ "$CODE" == 'up' ]; then
  	STATE=$STATE_OK;
	else
	STATE=$STATE_CRITIAL;
	fi
   else
	DESCRIPTION="Unknown port";
	STATE=$STATE_UNKNOWN;
   fi
fi

echo $DESCRIPTION
exit $STATE
