#!/bin/bash 
#########################################################################
# Usage: ./check_compellent -H host -C community -t type [-w warning] [-c critical]
#########################################################################
help="check_compellent\n
Usage: ./check_compellent -H host -C community -t type [-w warning] [-c critical]\n
Options:\n-H Hostname\n-C SNMP-Community name (at least read-only)\n-t Type to check, see list below\n-w Warning Threshold\n-c Critical Threshold\n
Requirements: snmpwalk, awk, grep, wc\n
types:\nhealth -> checks overall health
controller -> checks status of controllers
power -> checks status of power supplies
volume -> checks status of volumes
server -> checks status of connected servers
disks -> checks status of physical disks
enclosure -> checks status of enclosure
temp1 -> checks temperature
psufans -> checks PSU Fans
folder -> checks status of folders
cache -> checks status of controller cache
cachebat -> checks status of controller cache battery
folderspace -> checks utilization of all storage folders (if no thresholds are given, outputs information)"

STATE_OK=0              # define the exit code if status is OK
STATE_WARNING=1         # define the exit code if status is Warning
STATE_CRITICAL=2        # define the exit code if status is Critical
STATE_UNKNOWN=3         # define the exit code if status is Unknown
PATH=/usr/local/bin:/usr/bin:/bin # Set path

for cmd in snmpwalk awk grep wc [
do
 if ! `which ${cmd} 1>/dev/null`
 then
 echo "UNKNOWN: ${cmd} does not exist, please check if command exists and PATH is correct"
 exit ${STATE_UNKNOWN}
 fi
done

# Check for people who need help - aren't we all nice ;-)
#########################################################################
if [ "${1}" = "--help" -o "${#}" = "0" ];
       then
       echo -e "${help}";
       exit 1;
fi

# Get user-given variables
#########################################################################
while getopts "H:C:t:v:w:c:" Input;
do
       case ${Input} in
       H)      host=${OPTARG};;
       C)      community=${OPTARG};;
       t)      type=${OPTARG};;
       v)      volume=${OPTARG};;
       w)      warning=${OPTARG};;
       c)      critical=${OPTARG};;
       *)      echo "Wrong option given. Please use options -H for host, -C for SNMP-Community, -t for type, -w for warning and -c for critical"
               exit 1
               ;;
       esac
done


# Check Different Types
#########################################################################
       case ${type} in
       health)
               healthstatus=$(snmpwalk -v 2c -O vqe -c ${community} ${host} 1.3.6.1.4.1.674.11000.2000.500.1.2.29.1.3)

               s_crit=0; s_warn=0; s_ok=0; s_unknown=0
               for s in $healthstatus
               do
                       if [ "$s" = "3" ]; then s_crit=$((s_crit + 1)); fi
                       if [ "$s" = "2" ]; then s_warn=$((s_warn + 1)); fi
                       if [ "$s" = "1" ]; then s_ok=$((s_ok + 1)); fi
                       if [ "$s" = "0" ]; then s_unkown=$((s_unknown + 1)); fi
               done

               if [ $s_crit -gt 0 ]; then echo "OVERALL HEALTH CRITICAL"; exit ${STATE_CRITICAL}; fi
               if [ $s_warn -gt 0 ]; then echo "OVERALL HEALTH WARNING"; exit ${STATE_WARNING}; fi
               if [ $s_unknown -gt 0 ]; then echo "OVERALL HEALTH UNKNOWN"; exit ${STATE_UNKNOWN}; fi
               if [ $s_ok -gt 0 ]; then echo "OVERALL HEALTH OK"; exit ${STATE_OK}; fi
               ;;

      
       controller)
	      declare -a controllernames=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.13.1.4 | tr '\n' ' '))

		declare -a controllercrit=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.13.1.3 | grep -n "3" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${controllercrit[@]}
                do controllercrit[$c]=`expr ${controllercrit[$c]} - 1`
                let c++
                done
                # find the corresponding names of the critical fans
                c=0
                for line in ${controllercrit[@]}
                do controllerfinalcrit[${c}]=${controllernames[$line]}
                let c++
                done
              
       		declare -a controllerwarn=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.13.1.3 | grep -n "2" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${controllerwarn[@]}
                do controllerwarn[$c]=`expr ${controllerwarn[$c]} - 1`
                let w++
                done
                # find the corresponding names of the warning fans
                c=0
                for line in ${controllerwarn[@]}
                do controllerfinalwarn[${c}]=${controllernames[$line]}
                let w++
                done

		declare -a controllerunknown=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.13.1.3 | grep -n "0" | awk -F : '{print $1}' | tr '\n' ' '))

		declare -a controllerok=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.13.1.3 | grep -n "1" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${controllerok[@]}
                do controllerok[$o]=`expr ${controllerok[$o]} - 1`
                let o++
                done
                # find the corresponding names of the ok controllers
                c=0
                for line in ${controllerok[@]}
                do controllerfinalok[${o}]=${controllernames[$line]}
                let o++
                done

	        
		if [[ ${#controllerfinalcrit[*]} -gt 0 ]]
                then echo "CRITICAL Controllers: ${controllerfinalcrit[*]}"; exit ${STATE_CRITICAL}
                elif [[ ${#controllerfinalwarn[*]} -gt 0 ]]
                then echo "WARNING Controllers: ${controllerfinalwarn[*]}"; exit ${STATE_WARNING}
                elif [[ ${#controllerunknown[*]} -gt 0 ]]
                then echo "UNKNOWN Check Controllers, an unknown error occured"; exit ${STATE_UNKNOWN}
                elif [[ ${#controllerfinalok[*]} -gt 0 ]]
                then echo "Controllers OK"; exit ${STATE_OK}
                fi
		;;

       power)
               powerstatus=$(snmpwalk -v 2c -O vqe -c ${community} ${host} 1.3.6.1.4.1.674.11000.2000.500.1.2.21.1.3)

               s_crit=0; s_warn=0; s_ok=0; s_unknown=0
               for s in $powerstatus
               do
                       if [ "$s" = "3" ]; then s_crit=$((s_crit + 1)); fi
                       if [ "$s" = "2" ]; then s_warn=$((s_warn + 1)); fi
                       if [ "$s" = "1" ]; then s_ok=$((s_ok + 1)); fi
                       if [ "$s" = "0" ]; then s_unkown=$((s_unknown + 1)); fi
               done

               if [ $s_crit -gt 0 ]; then echo "Power CRITICAL"; exit ${STATE_CRITICAL}; fi
               if [ $s_warn -gt 0 ]; then echo "Power WARNING"; exit ${STATE_WARNING}; fi
               if [ $s_unknown -gt 0 ]; then echo "Power UNKNOWN"; exit ${STATE_UNKNOWN}; fi
               if [ $s_ok -gt 0 ]; then echo "Power OK"; exit ${STATE_OK}; fi
               ;;

	volume)
	      declare -a volumenames=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.26.1.4 | tr '\n' ' '))

		declare -a vulumecrit=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.26.1.3 | grep -n "3" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${volumecrit[@]}
                do volumecrit[$c]=`expr ${volumecrit[$c]} - 1`
                let c++
                done
                # find the corresponding names of the critical volume
                c=0
                for line in ${volumecrit[@]}
                do volumefinalcrit[${c}]=${volumenames[$line]}
                let c++
                done
              
       		declare -a volumewarn=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.26.1.3 | grep -n "2" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${volumewarn[@]}
                do volumewarn[$w]=`expr ${volumewarn[$w]} - 1`
                let w++
                done
                # find the corresponding names of the warning volume
                c=0
                for line in ${volumewarn[@]}
                do volumefinalwarn[${w}]=${volumenames[$line]}
                let w++
                done

		declare -a volumeunknown=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.26.1.3 | grep -n "0" | awk -F : '{print $1}' | tr '\n' ' '))

	        declare -a volumeok=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.26.1.3 | grep -n "1" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${volumeok[@]}
                do volumeok[$o]=`expr ${volumeok[$o]} - 1`
                let o++
                done
                # find the corresponding names of the ok volume
                c=0
                for line in ${volumeok[@]}
                do volumefinalok[${o}]=${volumenames[$line]}
                let o++
                done


		if [[ ${#volumefinalcrit[*]} -gt 0 ]]
                then echo "CRITICAL Volumes: ${volumefinalcrit[*]}"; exit ${STATE_CRITICAL}
                elif [[ ${#volumefinalwarn[*]} -gt 0 ]]
                then echo "WARNING Volumes: ${volumefinalwarn[*]}"; exit ${STATE_WARNING}
                elif [[ ${#volumeunknown[*]} -gt 0 ]]
                then echo "UNKNOWN Check Volumes, an unknown error occured"; exit ${STATE_UNKNOWN}
		elif [[ ${#volumefinalok[*]} -gt 0 ]]
		then echo "OK Volumes: ${volumefinalok[*]}"; exit ${STATE_OK}
                fi
		;;

	server)
	      declare -a servernames=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.27.1.4 | tr '\n' ' '))

		declare -a servercrit=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.27.1.3 | grep -n "3" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${servercrit[@]}
                do servercrit[$c]=`expr ${servercrit[$c]} - 1`
                let c++
                done
                # find the corresponding names of the critical server
                c=0
                for line in ${servercrit[@]}
                do serverfinalcrit[${c}]=${servernames[$line]}
                let c++
                done
              
       		declare -a serverwarn=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.27.1.3 | grep -n "2" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${serverwarn[@]}
                do serverwarn[$w]=`expr ${serverwarn[$w]} - 1`
                let c++
                done
                # find the corresponding names of the warning server
                c=0
                for line in ${serverwarn[@]}
                do serverfinalwarn[${w}]=${servernames[$line]}
                let w++
                done

		declare -a serverunknown=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.27.1.3 | grep -n "0" | awk -F : '{print $1}' | tr '\n' ' '))

	        declare -a serverok=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.27.1.3 | grep -n "1" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${serverok[@]}
                do serverok[$o]=`expr ${serverok[$o]} - 1`
                let o++
                done
                # find the corresponding names of the ok servers
                c=0
                for line in ${serverok[@]}
                do serverfinalok[${o}]=${servernames[$line]}
                let o++
                done


		if [[ ${#serverfinalcrit[*]} -gt 0 ]]
                then echo "Degrated Servers: ${serverfinalcrit[*]}"; exit ${STATE_CRITICAL}
                elif [[ ${#serverfinalwarn[*]} -gt 0 ]]
                then echo "Down Servers: ${serverfinalwarn[*]}"; exit ${STATE_WARNING}
                elif [[ ${#serverunknown[*]} -gt 0 ]]
                then echo "UNKNOWN Check Servers, an unknown error occured"; exit ${STATE_UNKNOWN}
		elif [[ ${#serverfinalok[*]} -gt 0 ]]
		then echo "OK Servers: ${serverfinalok[*]}"; exit ${STATE_OK}
                fi
		;;

	disks)
	      declare -a disknames=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.14.1.4 | tr '\n' ' '))

		declare -a diskcrit=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.14.1.3 | grep -n "3" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${diskcrit[@]}
                do diskcrit[$c]=`expr ${diskcrit[$c]} - 1`
                let c++
                done
                # find the corresponding names of the critical disks
                c=0
                for line in ${diskcrit[@]}
                do diskfinalcrit[${c}]=${disknames[$line]}
                let c++
                done
              
       		declare -a diskwarn=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.14.1.3 | grep -n "2" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${diskwarn[@]}
                do diskwarn[$w]=`expr ${diskwarn[$w]} - 1`
                let c++
                done
                # find the corresponding names of the warning disk
                c=0
                for line in ${diskwarn[@]}
                do diskfinalwarn[${w}]=${disknames[$line]}
                let w++
                done

		declare -a diskunknown=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.14.1.3 | grep -n "0" | awk -F : '{print $1}' | tr '\n' ' '))

	        declare -a diskok=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.14.1.3 | grep -n "1" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${diskok[@]}
                do diskok[$o]=`expr ${diskok[$o]} - 1`
                let o++
                done
                # find the corresponding names of the ok disk
                c=0
                for line in ${diskok[@]}
                do diskfinalok[${o}]=${disknames[$line]}
                let o++
                done


		if [[ ${#diskfinalcrit[*]} -gt 0 ]]
                then echo "Degrated Disks: ${diskfinalcrit[*]}"; exit ${STATE_CRITICAL}
                elif [[ ${#diskfinalwarn[*]} -gt 0 ]]
                then echo "Failed Disks: ${diskfinalwarn[*]}"; exit ${STATE_WARNING}
                elif [[ ${#serverunknown[*]} -gt 0 ]]
                then echo "UNKNOWN Check Servers, an unknown error occured"; exit ${STATE_UNKNOWN}
		elif [[ ${#diskfinalok[*]} -gt 0 ]]
		then echo "Disks OK"; exit ${STATE_OK}
                fi
		;;

	enclosure)
	      declare -a enclosurenames=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.15.1.4 | tr '\n' ' '))

		declare -a enclosurecrit=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.15.1.3 | grep -n "3" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${enclosurecrit[@]}
                do enclosurecrit[$c]=`expr ${enclosurecrit[$c]} - 1`
                let c++
                done
                # find the corresponding names of the critical enclosures
                c=0
                for line in ${enclosurecrit[@]}
                do enclosurefinalcrit[${c}]=${enclosurenames[$line]}
                let c++
                done
              
       		declare -a enclosurewarn=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.15.1.3 | grep -n "2" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${enclosurewarn[@]}
                do enclosurewarn[$w]=`expr ${enclosurewarn[$w]} - 1`
                let c++
                done
                # find the corresponding names of the warning enclosure
                c=0
                for line in ${enclosurewarn[@]}
                do enclosurefinalwarn[${w}]=${enclosurenames[$line]}
                let w++
                done

		declare -a enclosureunknown=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.15.1.3 | grep -n "0" | awk -F : '{print $1}' | tr '\n' ' '))

	        declare -a enclosureok=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.15.1.3 | grep -n "1" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${enclosureok[@]}
                do enclosureok[$o]=`expr ${enclosureok[$o]} - 1`
                let o++
                done
                # find the corresponding names of the ok enclosure
                c=0
                for line in ${enclosureok[@]}
                do enclosurefinalok[${o}]=${enclosurenames[$line]}
                let o++
                done


		if [[ ${#enclosurefinalcrit[*]} -gt 0 ]]
                then echo "Degrated Enclosures: ${enclosurefinalcrit[*]}"; exit ${STATE_CRITICAL}
                elif [[ ${#enclosurefinalwarn[*]} -gt 0 ]]
                then echo "Down Enclosure: ${enclosurefinalwarn[*]}"; exit ${STATE_WARNING}
                elif [[ ${#enclosureunknown[*]} -gt 0 ]]
                then echo "UNKNOWN Check Enclosures, an unknown error occured"; exit ${STATE_UNKNOWN}
		elif [[ ${#enclosurefinalok[*]} -gt 0 ]]
		then echo "Enclosures OK"; exit ${STATE_OK}
                fi
		;;

	temp1)
	      declare -a temp1names=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.19.1.4 | tr '\n' ' '))

		declare -a temp1crit=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.19.1.3 | grep -n "3" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${temp1crit[@]}
                do temp1crit[$c]=`expr ${temp1crit[$c]} - 1`
                let c++
                done
                # find the corresponding names of the critical Temps
                c=0
                for line in ${temp1crit[@]}
                do temp1finalcrit[${c}]=${temp1names[$line]}
                let c++
                done
              
       		declare -a temp1warn=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.19.1.3 | grep -n "2" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${temp1warn[@]}
                do temp1warn[$w]=`expr ${temp1warn[$w]} - 1`
                let c++
                done
                # find the corresponding names of the warning Temps
                c=0
                for line in ${temp1warn[@]}
                do temp1finalwarn[${w}]=${temp1names[$line]}
                let w++
                done

		declare -a temp1unknown=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.19.1.3 | grep -n "0" | awk -F : '{print $1}' | tr '\n' ' '))

	        declare -a temp1ok=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.19.1.3 | grep -n "1" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${temp1ok[@]}
                do temp1ok[$o]=`expr ${temp1ok[$o]} - 1`
                let o++
                done
                # find the corresponding names of the ok Temps
                c=0
                for line in ${temp1ok[@]}
                do temp1finalok[${o}]=${temp1names[$line]}
                let o++
                done


		if [[ ${#temp1finalcrit[*]} -gt 0 ]]
                then echo "Critical Temps: ${temp1finalcrit[*]}"; exit ${STATE_CRITICAL}
                elif [[ ${#temp1finalwarn[*]} -gt 0 ]]
                then echo "Warning Temps: ${temp1finalwarn[*]}"; exit ${STATE_WARNING}
                elif [[ ${#temp1unknown[*]} -gt 0 ]]
                then echo "UNKNOWN Check Temps, an unknown error occured"; exit ${STATE_UNKNOWN}
		elif [[ ${#temp1finalok[*]} -gt 0 ]]
		then echo "All Temps OK"; exit ${STATE_OK}
                fi
		;;

	psufans)
	      declare -a psufansnames=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.20.1.4 | tr '\n' ' '))

		declare -a psufanscrit=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.20.1.3 | grep -n "3" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${psufanscrit[@]}
                do psufanscrit[$c]=`expr ${psufanscrit[$c]} - 1`
                let c++
                done
                # find the corresponding names of the critical psufans
                c=0
                for line in ${psufanscrit[@]}
                do psufansfinalcrit[${c}]=${psufansnames[$line]}
                let c++
                done
              
       		declare -a psufanswarn=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.20.1.3 | grep -n "2" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${psufanswarn[@]}
                do psufanswarn[$w]=`expr ${psufanswarn[$w]} - 1`
                let c++
                done
                # find the corresponding names of the warning psufans
                c=0
                for line in ${psufanswarn[@]}
                do psufansfinalwarn[${w}]=${psufansnames[$line]}
                let w++
                done

		declare -a psufansunknown=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.20.1.3 | grep -n "0" | awk -F : '{print $1}' | tr '\n' ' '))

	        declare -a psufansok=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.20.1.3 | grep -n "1" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${psufansok[@]}
                do psufansok[$o]=`expr ${psufansok[$o]} - 1`
                let o++
                done
                # find the corresponding names of the ok psufans
                c=0
                for line in ${psufansok[@]}
                do psufansfinalok[${o}]=${psufansnames[$line]}
                let o++
                done


		if [[ ${#psufansfinalcrit[*]} -gt 0 ]]
                then echo "Critical psufans: ${psufansfinalcrit[*]}"; exit ${STATE_CRITICAL}
                elif [[ ${#psufansfinalwarn[*]} -gt 0 ]]
                then echo "Warning psufans: ${psufansfinalwarn[*]}"; exit ${STATE_WARNING}
                elif [[ ${#psufansunknown[*]} -gt 0 ]]
                then echo "UNKNOWN Check psufans, an unknown error occured"; exit ${STATE_UNKNOWN}
		elif [[ ${#psufansfinalok[*]} -gt 0 ]]
		then echo "PSU-Fans OK"; exit ${STATE_OK}
                fi
		;;

	folder)
	      declare -a foldernames=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.25.1.4 | grep -v "Unassigned" | tr '\n' ' '| sed -e :a -e 's/^\(\([^"]*"[^"]*"[^"]*\)*[^"]*"[^"]*\) /\1/;ta'))

		declare -a foldercrit=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.25.1.3 | grep -n "3" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${foldercrit[@]}
                do foldercrit[$c]=`expr ${foldercrit[$c]} - 1`
                let c++
                done
                # find the corresponding names of the critical folders
                c=0
                for line in ${foldercrit[@]}
                do folderfinalcrit[${c}]=${foldernames[$line]}
                let c++
                done
              
       		declare -a folderwarn=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.25.1.3 | grep -n "2" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${folderwarn[@]}
                do folderwarn[$w]=`expr ${folderwarn[$w]} - 1`
                let c++
                done
                # find the corresponding names of the warning folders
                c=0
                for line in ${folderwarn[@]}
                do folderfinalwarn[${w}]=${foldernames[$line]}
                let w++
                done

		declare -a folderunknown=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.25.1.3 | grep -n "0" | awk -F : '{print $1}' | tr '\n' ' '))

	        declare -a folderok=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.25.1.3 | grep -n "1" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${folderok[@]}
                do folderok[$o]=`expr ${folderok[$o]} - 1`
                let o++
                done
                # find the corresponding names of the ok folder
                c=0
                for line in ${folderok[@]}
                do folderfinalok[${o}]=${foldernames[$line]}
                let o++
                done


		if [[ ${#folderfinalcrit[*]} -gt 0 ]]
                then echo "Critical folder: ${folderfinalcrit[*]}"; exit ${STATE_CRITICAL}
                elif [[ ${#folderfinalwarn[*]} -gt 0 ]]
                then echo "Warning folder: ${folderfinalwarn[*]}"; exit ${STATE_WARNING}
                elif [[ ${#folderunknown[*]} -gt 0 ]]
                then echo "UNKNOWN Check folder, an unknown error occured"; exit ${STATE_UNKNOWN}
		elif [[ ${#folderfinalok[*]} -gt 0 ]]
		then echo "Folders OK: ${folderfinalok[*]}"; exit ${STATE_OK}
                fi
		;;

	cache)
	      declare -a cachenames=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.28.1.4 | tr '\n' ' '))

		declare -a cachecrit=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.28.1.3 | grep -n "3" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${cachecrit[@]}
                do cachecrit[$c]=`expr ${cachecrit[$c]} - 1`
                let c++
                done
                # find the corresponding names of the critical cache
                c=0
                for line in ${cachecrit[@]}
                do cachefinalcrit[${c}]=${cachenames[$line]}
                let c++
                done
              
       		declare -a cachewarn=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.28.1.3 | grep -n "2" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${cachewarn[@]}
                do cachewarn[$w]=`expr ${cachewarn[$w]} - 1`
                let c++
                done
                # find the corresponding names of the warning cache
                c=0
                for line in ${cachewarn[@]}
                do cachefinalwarn[${w}]=${cachenames[$line]}
                let w++
                done

		declare -a cacheunknown=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.28.1.3 | grep -n "0" | awk -F : '{print $1}' | tr '\n' ' '))

	        declare -a cacheok=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.28.1.3 | grep -n "1" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${cacheok[@]}
                do cacheok[$o]=`expr ${cacheok[$o]} - 1`
                let o++
                done
                # find the corresponding names of the ok cache
                c=0
                for line in ${cacheok[@]}
                do cachefinalok[${o}]=${cachenames[$line]}
                let o++
                done


		if [[ ${#cachefinalcrit[*]} -gt 0 ]]
                then echo "Critical Cache Status: ${cachefinalcrit[*]}"; exit ${STATE_CRITICAL}
                elif [[ ${#cachefinalwarn[*]} -gt 0 ]]
                then echo "Warning Cache Status: ${cachefinalwarn[*]}"; exit ${STATE_WARNING}
                elif [[ ${#cacheunknown[*]} -gt 0 ]]
                then echo "UNKNOWN Check cache, an unknown error occured"; exit ${STATE_UNKNOWN}
		elif [[ ${#cachefinalok[*]} -gt 0 ]]
		then echo "Cache Status OK"; exit ${STATE_OK}
                fi
		;;
	cachebat)
	      declare -a cachebatnames=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.28.1.4 | tr '\n' ' '))

		declare -a cachebatcrit=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.28.1.5 | grep -n "3" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${cachebatcrit[@]}
                do cachebatcrit[$c]=`expr ${cachebatcrit[$c]} - 1`
                let c++
                done
                # find the corresponding names of the critical cachebat
                c=0
                for line in ${cachebatcrit[@]}
                do cachebatfinalcrit[${c}]=${cachebatnames[$line]}
                let c++
                done
              
       		declare -a cachebatwarn=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.28.1.5 | grep -n "2" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${cachebatwarn[@]}
                do cachebatwarn[$w]=`expr ${cachebatwarn[$w]} - 1`
                let c++
                done
                # find the corresponding names of the warning cachebat
                c=0
                for line in ${cachebatwarn[@]}
                do cachebatfinalwarn[${w}]=${cachebatnames[$line]}
                let w++
                done

		declare -a cachebatunknown=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.28.1.5 | grep -n "0" | awk -F : '{print $1}' | tr '\n' ' '))

	        declare -a cachebatok=($(snmpwalk -v 2c -O vqe -c ${community} ${host} .1.3.6.1.4.1.674.11000.2000.500.1.2.28.1.5 | grep -n "1" | awk -F : '{print $1}' | tr '\n' ' '))
	        c=0
                for line in ${cachebatok[@]}
                do cachebatok[$o]=`expr ${cachebatok[$o]} - 1`
                let o++
                done
                # find the corresponding names of the ok cachebat
                c=0
                for line in ${cachebatok[@]}
                do cachebatfinalok[${o}]=${cachebatnames[$line]}
                let o++
                done


		if [[ ${#cachebatfinalcrit[*]} -gt 0 ]]
                then echo "Cache Battery Expired: ${cachebatfinalcrit[*]}"; exit ${STATE_CRITICAL}
                elif [[ ${#cachefinalwarn[*]} -gt 0 ]]
                then echo "Cache Battery Expired exepted: ${cachebatfinalwarn[*]}"; exit ${STATE_WARNING}
                elif [[ ${#cachebatunknown[*]} -gt 0 ]]
                then echo "UNKNOWN Check Cachebattery, an unknown error occured"; exit ${STATE_UNKNOWN}
		elif [[ ${#cachebatfinalok[*]} -gt 0 ]]
		then echo "Cache Battery OK"; exit ${STATE_OK}
                fi
		;;


	folderspace)
                folderscount=$(snmpwalk -v 2c -c ${community} ${host} 1.3.6.1.4.1.674.11000.2000.500.1.2.25.1.4 | wc -l)
                declare -a foldernames=($(snmpwalk -v 2c -O vqe -c ${community} ${host} 1.3.6.1.4.1.674.11000.2000.500.1.2.25.1.4 | tr '\n' ' ' | sed -e :a -e 's/^\(\([^"]*"[^"]*"[^"]*\)*[^"]*"[^"]*\) /\1/;ta' ))
                declare -a folderavailspace=($(snmpwalk -v 2c -O vqe -c ${community} ${host}  .1.3.6.1.4.1.674.11000.2000.500.1.2.32.1.5 | tr '\n' ' '))
                declare -a folderusedspace=($(snmpwalk -v 2c -O vqe -c ${community} ${host}  .1.3.6.1.4.1.674.11000.2000.500.1.2.32.1.6 | tr '\n' ' '))
		
		# Determine special Compellent folders and remove them from array
                ignorefolders=($(snmpwalk -v 2c -O vqe -c ${community} ${host} 1.3.6.1.4.1.674.11000.2000.500.1.2.25.1.4 | grep -n -w "Unassigned" | awk -F : '{print $1}' | tr '\n' ' '))
                k=0
                while [ ${k} -lt ${#ignorefolders[@]} ]
                do
                finalignore[$k]=`expr ${ignorefolders[$k]} - 1`
                unset foldernames[${finalignore[$k]}]
                unset folderavailspace[${finalignore[$k]}]
                unset folderusedspace[${finalignore[$k]}]
                let k++
                done

                # How many real folders (manmade) do exist
                realfolderscount=`expr ${folderscount} - ${#ignorefolders[@]}`
		
                # Calculate Free Space and Percentage per folder
                i=0
                while [ ${i} -le ${folderscount} ]
                do
                        if [ ${foldernames[${i}]} ]
                        then
                        folderfreespace[${i}]=`expr ${folderavailspace[${i}]} - ${folderusedspace[${i}]}`
                        folderpercentage[${i}]=`expr ${folderusedspace[${i}]} \* 100 / ${folderavailspace[${i}]}`
                        #echo "$i: ${foldernames[$i]}, free Space: ${folderfreespace[${i}]} used: ${folderpercentage[${i}]} %" # For Debug
			perfavailspace[${i}]=$((${folderavailspace[${i}]}*1024*1024))
			perfusedspace[${i}]=$((${folderusedspace[${i}]}*1024*1024))
			perffreespace[${i}]=$((${folderfreespace[${i}]}*1024*1024))
			perfdata[${i}]="${foldernames[$i]}=${perfusedspace[${i}]};${perffreespace[${i}]};${perfavailspace[${i}]};"
                        let i++
                        else
                        let i++
                        fi
                done

                # Output Warning and Critical
                if [ -n "${warning}" ] || [ -n "${critical}" ]
                then
                j=0
                while [ ${j} -le ${folderscount} ]
                do
                        if [ ${foldernames[${j}]} ]
                        then
                                if [ ${folderpercentage[${j}]} -ge ${warning} ] && [ ${folderpercentage[${j}]} -lt ${critical} ]
                                then folderwarning[${j}]="${foldernames[${j}]}: ${folderpercentage[${j}]}% used "
                                elif [ ${folderpercentage[${j}]} -ge ${critical} ]
                                then foldercritical[${j}]="${foldernames[${j}]}: ${folderpercentage[${j}]}% used "
                                else folderok[${j}]="${foldernames[$j]}: ${folderpercentage[${j}]}% used "
                                fi
                        let j++
                        else
                        let j++
                        fi
                done


                if [ ${#folderwarning[@]} -gt 0 ] && [ ${#foldercritical[@]} -lt 1 ]
                then echo "WARNING ${folderwarning[@]}|${perfdata[*]}"; exit ${STATE_WARNING}
                elif [ ${#foldercritical[@]} -ge 1 ]
                then echo "CRITICAL ${foldercritical[@]}|${perfdata[*]}"; exit ${STATE_CRITICAL}
                else
                echo "OK ${folderok[*]}|${perfdata[*]}"; exit ${STATE_OK}
                fi

                # Output without thresholds
                else
                j=0
                while [ ${j} -le ${folderscount} ]
                do
                        if [ ${foldernames[${j}]} ]
                        then
                        folderfinaloutput[${j}]="${foldernames[$j]}: ${folderpercentage[${j}]}% used "
                        let j++
                        else
                        let j++
                        fi
                done
                echo "${folderfinaloutput[*]}|${perfdata[*]}"
                exit ${STATE_OK}
                fi

	;;



       esac


echo "UNKNOWN: should never reach this part"
exit ${STATE_UNKNOWN}