#!/bin/bash

warn=2
crit=3

HSTNAME=""
KEYFILE=""
USRNAME=""

verbose=""

while getopts ":H:i:u:w:c:v" opt ; do
	case $opt in
        H)  HSTNAME="$OPTARG"
            ;;
        i)  KEYFILE="$OPTARG"
            ;;
        u)  USRNAME="$OPTARG"
            ;;
        w)  warn="$OPTARG"
            ;;
        c)  crit="$OPTARG"
            ;;
        v)  verbose="true"
            ;;
	esac
done

if ! [[ $HSTNAME ]] ; then
    echo "Hostname required with -H flag"
    exit 3
elif ! [[ $KEYFILE ]] ; then
    echo "Keyfile required with -i flag"
    exit 3
elif ! [[ $USRNAME ]] ; then
    echo "Username required with -u flag"
    exit 3
fi

volumes="$(ssh -oStrictHostKeyChecking=no -i $KEYFILE $USRNAME@$HSTNAME ls /vmfs/volumes -l | grep "\->" | awk -vORS=\  '{print $9}')"
if [[ $verbose ]] ; then echo "Volumes: $volumes" ; fi
vmsWarn=""
vmsCrit=""
returnStat=0

for vol in $volumes ; do
    if [[ $verbose ]] ; then echo "Checking volume $vol" ; fi
    currentDatastore="$(ssh -oStrictHostKeyChecking=no -i $KEYFILE $USRNAME@$HSTNAME ls /vmfs/volumes/$vol)"
    for dir in $currentDatastore ; do
        if $(echo $dir | grep -vq "ISOs\|ISO\|Patches\|vmkdump\|.*\.iso") ; then
            if [[ $verbose ]] ; then echo "..Checking directory $dir" ; fi
            numVmdk="$(ssh -oStrictHostKeyChecking=no -i $KEYFILE $USRNAME@$HSTNAME ls /vmfs/volumes/$vol/$dir | grep _ | wc -l)"
            numVmdk=$(echo "$numVmdk / 3" | bc) # integer representation of how many sets of snapshots there are.
            if [[ $verbose ]] ; then echo "....$dir has $numVmdk sets of snapshots" ; fi
            if [[ $numVmdk -ge $crit ]] ; then
                returnStat=2
                vmsCrit+="$dir - $numVmdk; "
            elif [[ $numVmdk -ge $warn ]] ; then
                returnStat=$(($returnStat>1 ? $returnStat : 1))
                vmsWarn+="$dir - $numVmdk; "
            fi
        else
            if [[ $verbose ]] ; then echo "..Skipping directory $dir" ; fi
        fi
    done
done

if [[ $vmsCrit ]] ; then
    returnText="CRITICAL - "
    returnText+="$vmsCrit"
elif [[ $vmsCrit ]] ; then
    returnText+="WARNING - "
    returnText+="$vmsWarn"
fi

if [[ $returnStat -eq 0 ]] ; then
    echo "OK - All vms within nominal range"
    exit 0
else
    echo $returnText
    exit $returnStat
fi
