#!/bin/bash # - VAR # - Bash info APPNAME=$(basename $0) NAME="Check ESXi vCenter" AUTHOR="Kalarumeth" VERSION="v1.0" URL="https://github.com/Kalarumeth/ESXi-Monitoring" # - Default settings for connection COMMUNITY="public" HOST_NAME="localhost" SNMPVERSION="2c" # - State Variables STATE_OK=0 STATE_WARN=1 STATE_CRIT=2 STATE_UNK=3 STATE=$STATE_OK eWarning=0 eCritical=0 eUnknown=0 # - OID ESXi.OIDS() { OID_osName=".1.3.6.1.2.1.47.1.2.1.1.2.1" OID_fwRev=".1.3.6.1.2.1.47.1.1.1.1.9.1" OID_serviceTag=".1.3.6.1.2.1.47.1.1.1.1.11.1" OID_sysManufacturer=".1.3.6.1.2.1.47.1.1.1.1.12.1" OID_sysModel=".1.3.6.1.2.1.47.1.1.1.1.13.1" OID_prodName=".1.3.6.1.4.1.6876.1.1.0" OID_prodVersion=".1.3.6.1.4.1.6876.1.2.0" OID_prodBuild=".1.3.6.1.4.1.6876.1.4.0" OID_prodUpdate=".1.3.6.1.4.1.6876.1.5.0" OID_prodPatch=".1.3.6.1.4.1.6876.1.6.0" OID_vmName=".1.3.6.1.4.1.6876.2.1.1.2" } # - MAIN CODE Source.HostAlive() { for server in $HOST_NAME; do ping -c1 -W1 -q $server &>/dev/null if [[ $? != 0 ]] ; then printf "%s\n" "$server is unreachable" exit $STATE_UNK fi done } Source.SNMP() { snmpwalk -v $SNMPVERSION -r 1 -t 10 -Oe -c $COMMUNITY $HOST_NAME $1 } Source.vSpheredb.Host() { for host in $HOST_NAME; do icingacli vspheredb check host --name $host exit $? done } Source.vSpheredb.Vm() { for vm in $1; do icingacli vspheredb check vm --name $vm Source.e done } Source.e() { case $? in 1) eWarning=$(($eWarning + 1)) ;; 2) eCritical=$(($eCritical + 1)) ;; 3) eUnknown=$(($eUnknown + 1)) ;; esac } # - ESXi vCenter Health Check ESXi.Main() { Source.HostAlive case $1 in host) Source.vSpheredb.Host exit $? ;; info) ESXi.Info exit $STATE ;; vm) ESXi.VmList exit $? ;; *) echo "Unknown check!" Help.Function exit $STATE_UNK ;; esac } ESXi.GetData() { ESXi.OIDS case $1 in info) osName=$(Source.SNMP $OID_osName | cut -d '"' -f 2) fwRev=$(Source.SNMP $OID_fwRev | cut -d '"' -f 2) serviceTag=$(Source.SNMP $OID_serviceTag | cut -d '"' -f 2) sysManufacturer=$(Source.SNMP $OID_sysManufacturer | cut -d '"' -f 2) sysModel=$(Source.SNMP $OID_sysModel | cut -d '"' -f 2) prodName=$(Source.SNMP $OID_prodName | cut -d '"' -f 2) prodVersion=$(Source.SNMP $OID_prodVersion | cut -d '"' -f 2) prodBuild=$(Source.SNMP $OID_prodBuild | cut -d '"' -f 2) prodUpdate=$(Source.SNMP $OID_prodUpdate | cut -d '"' -f 2) prodPatch=$(Source.SNMP $OID_prodPatch | cut -d '"' -f 2) ;; vm) vmList=($(Source.SNMP $OID_vmName | cut -d '"' -f 2)) ;; esac } ESXi.Info() { ESXi.GetData info printf "%s\n" "$osName Rev. $fwRev" "$sysManufacturer" "Model: $sysModel" "Service Tag: $serviceTag" "$prodName $prodVersion" "Build: $prodBuild" "Update: $prodUpdate" "Patch: $prodPatch" } ESXi.VmList() { ESXi.GetData vm if [[ $? != 0 ]] ; then printf "%s\n" "$server is unreachable" exit $STATE_UNK else for((i=0; i<${#vmList[@]}; i++)) do printf "%s\n" "$(($i+1)) - ${vmList[$i]}" Source.vSpheredb.Vm ${vmList[$i]} printf "\n" done if [[ $eWarning != 0 ]] && [[ $eCritical == 0 ]] ; then exit $STATE_WARN elif [[ $eCritical != 0 ]] && [[ $eUnknown != 0 ]] ; then exit $STATE_CRIT fi fi } # - Help Help.Main() { echo "Check ESXi Status" echo '' Help.Usage echo '' Help.Option echo '' Help.Info echo '' exit $STATE_UNK } Help.Usage() { printf "%s\n" "Method to compose the execution string" printf "%s\n" "./$APPNAME -c -h -t [host/info/vm]" } Help.Option() { printf "%s\n" "OPTIONS:" printf "%s\t%s\t%s\n\t\t\t%s\n" "-c" "--community" "SNMP v2 community string with Read access." " Default is $COMMUNITY." printf "%s\t%s\t\t%s\n\t\t\t%s\n" "-h" "--host" "Host name or IP address to check." " Default is $HOST_NAME." printf "%s\t%s\t\t%s\n" "-t" "--type" "Argument for check function" printf "%s\t%s\t\t%s\n" "-H" "--help" "Show script help" printf "%s\t%s\t%s\n" "-V" "--version" "Show script version" } Help.Function() { printf "\n%s\n\n" "ESXi vCenter Check Function" printf "%s\t%s\n\n" "Check" "Description" printf "%s\t%s\n" "host" "Get Host check from vsphere plugin." printf "%s\t%s\n" "info" "Get Information from snmpwalk." printf "%s\t%s\n" "vm" "Get Virtual Machine from vsphere plugin." } Help.Info() { printf "%s\t%s\t%s\n" "INFO:" "$NAME" "$VERSION" "" "$AUTHOR" "$URL" } # - COMMAND LINE ENCODER while test -n "$1"; do case "$1" in --host | -h) HOST_NAME=$2 shift ;; --comunity | -c) COMMUNITY=$2 shift ;; --type | -t) ESXi.Main $2 shift ;; --help | -H) Help.Main ;; --version | -V) Help.Info exit $STATE ;; *) echo "Unknown argument: $1" print_help exit $STATE_UNK ;; esac shift done