#!/bin/bash

set -e

HPSSACLI="/usr/sbin/hpssacli"
OMREPORT="/opt/dell/srvadmin/bin/omreport"
STORCLI="/opt/MegaRAID/storcli/storcli64"
MEGACLI="/opt/MegaRAID/MegaCli/MegaCli64"
TWCLI="/sbin/tw_cli"
if [ -e "/sbin/lspci" ]; then
  LSPCI="/sbin/lspci"
elif [ -e "/usr/sbin/lspci" ]; then
  LSPCI="/usr/sbin/lspci"
else
  echo "CRITICAL: Cannot find lspci binary!"
  exit 2
fi

# Check for 3ware
hardware=`$LSPCI`
num_3ware=`echo "$hardware" | grep 3ware | wc -l`
if [ $num_3ware -gt 0 ]; then
  is_3ware="1"
else
  is_3ware="0"
fi

# Check for mdraid
mdstat=`cat /proc/mdstat`
mdraid_num=`echo "$mdstat" | grep "^md" | wc -l`
if [ $mdraid_num -gt 0 ]; then
  is_mdraid="1"
else
  is_mdraid="0"
fi

# Check for LSI MegaRAID
hardware=`$LSPCI`
is_megaraid=`echo "$hardware" | grep MegaRAID | wc -l`

# Check for SmartArray
hardware=`$LSPCI`
num_smartarray=`echo "$hardware" | grep "Smart Array" | wc -l`
if [ $num_smartarray -gt 0 ]; then
  is_smartarray="1"
else
  is_smartarray="0"
fi

volumes=0
volumes_ok=0

if [ $is_3ware -ne 0 ]; then
  if [ -e "$TWCLI" ]; then
    data=`$TWCLI /c0 show`
    num=`echo "$data" | grep "^u" | wc -l`
    num_ok=`echo "$data" | grep "^u.*OK" | wc -l`
  else
    echo "CRITICAL: Cannot find $TWCLI binary!"
    exit 2
  fi
  volumes=$(($volumes+$num))
  volumes_ok=$(($volumes_ok+$num_ok))
fi

if [ $is_mdraid -ne 0 ]; then
  num=`cat /proc/mdstat | grep "^md" | wc -l`
  num_ok=`cat /proc/mdstat | grep UU | wc -l`
  volumes=$(($volumes+$num))
  volumes_ok=$(($volumes_ok+$num_ok))
fi

if [ $is_megaraid -ne 0 ]; then
  if [ -e "$MEGACLI" ]; then
    data=`$MEGACLI -LDInfo -Lall -aALL`
    num=`echo "$data" | grep "^State" | wc -l`
    num_ok=`echo "$data" | grep "^State.*Optimal" | wc -l`
  elif [ -e "$OMREPORT" ]; then
    data=`$OMREPORT storage vdisk`
    num=`echo "$data" | grep "^State" | wc -l`
    num_ok=`echo "$data" | grep "^State.*Ready" | wc -l`
  elif [ -e "$STORCLI" ]; then
    data=`$STORCLI /c0/v0 show`
    num=`echo "$data" | grep "0/0" | wc -l`
    num_ok=`echo "$data" | grep "0/0.*Optl" | wc -l`
  else
    echo "CRITICAL: Cannot find $MEGACLI, $STORCLI or $OMREPORT binary!"
    exit 2
  fi
  volumes=$(($volumes+$num))
  volumes_ok=$(($volumes_ok+$num_ok))
fi

if [ $is_smartarray -ne 0 ]; then
  if [ -e "$HPSSACLI" ]; then
    data=`$HPSSACLI ctrl all show config`
    num=`echo "$data" | grep "logicaldrive" | wc -l`
    num_ok=`echo "$data" | grep "logicaldrive.*OK" | wc -l`
  else
    echo "CRITICAL: Cannot find $HPSSACLI binary!"
    exit 2
  fi
  volumes=$(($volumes+$num))
  volumes_ok=$(($volumes_ok+$num_ok))
fi

if [ $volumes_ok -eq 0 ]; then
  echo "CRITICAL: No raids found!"
  exit 2
fi

if [ $volumes_ok -ne $volumes ]; then
  echo "CRITICAL: Number of raid volumes ($volumes) does not match number of volumes that are ok ($volumes_ok)"
  exit 2
fi

echo "OK: All $volumes detected raid volumes are ok"
exit 0

