#!/bin/bash # - VAR # - Bash info APPNAME=$(basename $0) NAME="Check Switch Huawei" AUTHOR="Kalarumeth" VERSION="v0.1" URL="https://github.com/Kalarumeth" # - Default settings for connection COMMUNITY="public" HOST_NAME="localhost" AP="authPriv" AUTH="SHA-256" PRIV="AES" SNMPVERSION="3" # - State Variables STATE_OK=0 STATE_WARN=1 STATE_CRIT=2 STATE_UNK=3 STATE=$STATE_OK # - OID Huawei.OIDS() { #Info OID_sysDescr="1.3.6.1.2.1.1.1.0" OID_sysUptimeIstance="1.3.6.1.2.1.1.3" #Fan OID_fanSlot="1.3.6.1.4.1.2011.5.25.31.1.1.10.1.1" OID_fanSn="1.3.6.1.4.1.2011.5.25.31.1.1.10.1.2" OID_fanReg="1.3.6.1.4.1.2011.5.25.31.1.1.10.1.3" OID_fanMode="1.3.6.1.4.1.2011.5.25.31.1.1.10.1.4" OID_fanSpeed="1.3.6.1.4.1.2011.5.25.31.1.1.10.1.5" OID_fanPresent="1.3.6.1.4.1.2011.5.25.31.1.1.10.1.6" OID_fanState="1.3.6.1.4.1.2011.5.25.31.1.1.10.1.7" OID_fanDesc="1.3.6.1.4.1.2011.5.25.31.1.1.10.1.8" #Power OID_pwrSlot="1.3.6.1.4.1.2011.5.25.31.1.1.18.1.1" OID_pwrSn="1.3.6.1.4.1.2011.5.25.31.1.1.18.1.2" OID_pwrReg="1.3.6.1.4.1.2011.5.25.31.1.1.18.1.3" OID_pwrMode="1.3.6.1.4.1.2011.5.25.31.1.1.18.1.4" OID_pwrPresent="1.3.6.1.4.1.2011.5.25.31.1.1.18.1.5" OID_pwrState="1.3.6.1.4.1.2011.5.25.31.1.1.18.1.6" OID_pwrCurrent="1.3.6.1.4.1.2011.5.25.31.1.1.18.1.7" OID_pwrVoltage="1.3.6.1.4.1.2011.5.25.31.1.1.18.1.8" OID_pwrDesc="1.3.6.1.4.1.2011.5.25.31.1.1.18.1.9" #Stack OID_stkRun="1.3.6.1.4.1.2011.5.25.183.1.1" OID_stkType="1.3.6.1.4.1.2011.5.25.183.1.2" OID_stkPriority="1.3.6.1.4.1.2011.5.25.183.1.20.1.2" OID_stkRole="1.3.6.1.4.1.2011.5.25.183.1.20.1.3" OID_stkMac="1.3.6.1.4.1.2011.5.25.183.1.20.1.4" OID_stkDevice="1.3.6.1.4.1.2011.5.25.183.1.20.1.5" OID_stkId="1.3.6.1.4.1.2011.5.25.183.1.20.1.6" } # - MAIN CODE Script.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 } Script.SNMP() { snmpwalk -v $SNMPVERSION -r 1 -t 10 -Oen -l $AP -u $USER -e $ENGINEID -a $AUTH -A $PHAUTH -x $PRIV -X $PHPRIV $HOST_NAME $1 } Huawei.Main() { Script.HostAlive case $1 in info) Huawei.Info exit $STATE ;; uptime) Huawei.UpTime exit $STATE ;; fan) Huawei.Fan exit $STATE ;; power) Huawei.Power exit $STATE ;; stack) Huawei.Stack exit $STATE ;; *) echo "Unknown check!" Help.Huawei exit $STATE_UNK ;; esac } Huawei.GetData() { Huawei.OIDS case $1 in description) sysDescr=$(Script.SNMP $OID_sysDescr | cut -d ':' -f 2);; uptime) sysUptimeIstance=$(Script.SNMP $OID_sysUptimeIstance | cut -d ')' -f 2 );; fan) fanSlot=($(Script.SNMP $OID_fanSlot | cut -d ' ' -f 4 )) fanSn=($(Script.SNMP $OID_fanSn | cut -d ' ' -f 4 )) fanReg=($(Script.SNMP $OID_fanReg | cut -d ' ' -f 4 )) fanMode=($(Script.SNMP $OID_fanMode | cut -d ' ' -f 4 )) fanSpeed=($(Script.SNMP $OID_fanSpeed | cut -d ' ' -f 4 )) fanPresent=($(Script.SNMP $OID_fanPresent | cut -d ' ' -f 4 )) fanState=($(Script.SNMP $OID_fanState | cut -d ' ' -f 4 )) fanDesc=($(Script.SNMP $OID_fanDesc | cut -d '"' -f 2)) ;; power) pwrSlot=($(Script.SNMP $OID_pwrSlot | cut -d ' ' -f 4 )) pwrSn=($(Script.SNMP $OID_pwrSn | cut -d ' ' -f 4 )) pwrReg=($(Script.SNMP $OID_pwrReg | cut -d ' ' -f 4 )) pwrMode=($(Script.SNMP $OID_pwrMode | cut -d ' ' -f 4 )) pwrPresent=($(Script.SNMP $OID_pwrPresent | cut -d ' ' -f 4 )) pwrState=($(Script.SNMP $OID_pwrState | cut -d ' ' -f 4 )) pwrCurrent=($(Script.SNMP $OID_pwrCurrent | cut -d ' ' -f 4 )) pwrVoltage=($(Script.SNMP $OID_pwrVoltage | cut -d ' ' -f 4)) pwrDesc=($(Script.SNMP $OID_pwrDesc | cut -d '"' -f 2)) ;; stack) stkRun=$(Script.SNMP $OID_stkRun | cut -d ' ' -f 4 ) stkType=$(Script.SNMP $OID_stkType | cut -d ' ' -f 4 ) stkPriority=($(Script.SNMP $OID_stkPriority | cut -d ' ' -f 4 )) stkRole=($(Script.SNMP $OID_stkRole | cut -d ' ' -f 4 )) stkMac=($(Script.SNMP $OID_stkMac | cut -d '"' -f 2 )) stkDevice=($(Script.SNMP $OID_stkDevice | cut -d '"' -f 2 )) stkId=($(Script.SNMP $OID_stkId | cut -d ' ' -f 4 )) ;; esac } Huawei.ErrorCounter() { for Error in "$(( WarningCounter + CriticalCounter ))"; do if [[ $WarningCounter == 0 ]] && [[ $CriticalCounter == 0 ]] ; then printf "%s\t%s\n\n" "OK!" "All $1 is Up" elif [[ $WarningCounter != 0 ]] && [[ $CriticalCounter == 0 ]] ; then printf "%s\t%s\n\n" "WARNING!" "$Error $1 with problem" STATE=$STATE_WARN elif [[ $CriticalCounter != 0 ]] ; then printf "%s\t%s\n\n" "CRITICAL!" "$Error $1 with problem" STATE=$STATE_CRIT fi done } # Device Information Huawei.Info() { Huawei.GetData description printf "%s\n" "$sysDescr" } # UpTime Huawei.UpTime() { Huawei.GetData uptime printf "%s\n" "$sysUptimeIstance" } # Fan Huawei.Fan() { Huawei.GetData fan Huawei.Fan.Header for((i=0; i<${#fanSlot[@]}; i++)) do Huawei.Fan.Desc printf "%s\t" "${fanSlot[$i]}" printf "%s\t" "${fanSn[$i]}" Huawei.Fan.Reg Huawei.Fan.Mode printf "%s\t" "${fanSpeed[$i]}" Huawei.Fan.Present Huawei.Fan.State printf "\n" done } Huawei.Fan.Header() { WarningCounter=0 CriticalCounter=0 for((i=0; i<${#fanSlot[@]}; i++)); do for value in "${fanState[$i]}"; do if [[ $value == 2 ]]; then CriticalCounter=$(( CriticalCounter + 1 )) fi done done Huawei.ErrorCounter "Fan" if [[ $HOST_NAME == *"core"* ]] ; then printf "%s\t\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" "Desc" "Unit" "Slot" "Reg" "Mode" "Speed" "Present" "State" "========================================================================" elif [[ $HOST_NAME == *"acc"* ]] ; then printf "%s\t%s\t%s\t%s\t%s\t%s\t%s\n" "Unit" "Slot" "Reg" "Mode" "Speed" "Present" "State" "========================================================" fi } Huawei.Fan.Desc() { if [[ $HOST_NAME == *"core"* ]] ; then printf "%s\t" "${fanDesc[$i]}" fi } Huawei.Fan.Reg() { case ${fanReg[$i]} in 1) printf "%s\t" "Yes" ;; 2) printf "%s\t" "No" ;; esac } Huawei.Fan.Mode() { case ${fanMode[$i]} in 1) printf "%s\t" "Auto" ;; 2) printf "%s\t" "Manual" ;; 3) printf "%s\t" "Unknown" ;; 4) printf "%s\t" "Silent" ;; esac } Huawei.Fan.Present() { case ${fanPresent[$i]} in 1) printf "%s\t" "Present" ;; 2) printf "%s\t" "absent" ;; esac } Huawei.Fan.State() { case ${fanState[$i]} in 1) printf "%s\t" "Normal" ;; 2) printf "%s\t" "Abnormal" ;; esac } # Power Huawei.Power() { Huawei.GetData power Huawei.Power.Header for((i=0; i<${#pwrSlot[@]}; i++)) do printf "%s\t" "${pwrDesc[$i]}" printf "%s\t" "${pwrSlot[$i]}" printf "%s\t" "${pwrSn[$i]}" Huawei.Power.Reg Huawei.Power.Mode Huawei.Power.Present Huawei.Power.State printf "%s\t" "${pwrCurrent[$i]} mA" printf "%s\t" "${pwrVoltage[$i]} mV" printf "\n" done } Huawei.Power.Header() { WarningCounter=0 CriticalCounter=0 for((i=0; i<${#pwrSlot[@]}; i++)); do for value in "${pwrState[$i]}"; do if [[ $value == 2 ]]; then CriticalCounter=$(( CriticalCounter + 1 )) fi done done Huawei.ErrorCounter "Power Supply" printf "%s\t\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" "Desc" "Unit" "Slot" "Reg" "Mode" "Present" "State" "Current" "Voltage" "==================================================================================" } Huawei.Power.Reg() { case ${pwrReg[$i]} in 1) printf "%s\t" "Yes" ;; 2) printf "%s\t" "No" ;; esac } Huawei.Power.Mode() { case ${pwrMode[$i]} in 1) printf "%s\t" "Unknown" ;; 2) printf "%s\t" "DC" ;; 3) printf "%s\t" "AC" ;; 4) printf "%s\t" "hvdc" ;; esac } Huawei.Power.Present() { case ${pwrPresent[$i]} in 1) printf "%s\t" "Present" ;; 2) printf "%s\t" "Absent" ;; esac } Huawei.Power.State() { case ${pwrState[$i]} in 1) printf "%s\t" "Supply" ;; 2) printf "%s\t" "NotSupply" ;; 3) printf "%s\t" "Sleep" ;; 4) printf "%s\t" "Unknown" ;; esac } # Stack Huawei.Stack() { Huawei.GetData stack Huawei.Stack.Header for((i=0; i<${#stkDevice[@]}; i++)) do printf "%s\t" "${stkId[$i]}" printf "%s\t" "${stkDevice[$i]}" printf "%s\t" "${stkMac[$i]}" Huawei.Stack.Role printf "%s\t" "${stkPriority[$i]}" printf "\n" done } Huawei.Stack.Header() { if [[ $stkRun == 1 ]] ; then Huawei.Stack.Status printf "%s\t%s\t\t%s\t\t%s\t\t%s\n" "Id" "Device" "Mac Address" "Role" "Priority" "==========================================================================" elif [[ $stkRun == 2 ]] ; then printf "%s\t%s\n\n" "CRITICAL!" "Stack is disable" exit $STATE_CRIT fi } Huawei.Stack.Status() { printf "%s" "OK! Stack is " case $stkRun in 1) printf "%s" "Enable" ;; 2) printf "%s" "Disable" ;; esac if [[ $HOST_NAME == *"acc"* ]] ; then printf "%s" " and topology type is " case $stkType in 1) printf "%s" "Ring" ;; 2) printf "%s" "Link" ;; esac fi printf "\n\n" } Huawei.Stack.Role() { if [[ $HOST_NAME == *"acc"* ]] ; then printf "\t" fi case ${stkRole[$i]} in 1) printf "%s\t" "Master Switch" ;; 2) printf "%s\t" "Backup Switch" ;; 3) printf "%s\t" "Slave Switch" ;; esac } # - COMMAND LINE ENCODER while test -n "$1"; do case "$1" in --host | -h) HOST_NAME=$2 shift ;; --user | -u) USER=$2 shift ;; --engineId | -e) ENGINEID=$2 shift ;; --phAuth | -pa) PHAUTH=$2 shift ;; --phPriv | -pp) PHPRIV=$2 shift ;; --type | -t) Huawei.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 Huawei.Main