#!/bin/bash # # Jonathan Petersson # GPLv3 # Based on check_areca by Nikolay Diulgerov # CULIMIT=10000 CLLIMIT=1000 WULIMIT=8000 WLLIMIT=2000 STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 STATE_UNKNOWN=3 CLI=/usr/local/sbin/cli64 EVENT_FILE=/tmp/areca_event print_help() { echo "" echo "Usage: check_areca [-w :] [-c :] [-C ] [-h]" echo "" echo "This plugin checks the areca controller fan speed and raid volume status." echo "Needs /usr/local/sbin/cli64 to be installed on the linux machine." echo "$CLI should be owned by root.nagios with mode 750 and setuserid on execution" echo "$CLI can be downloaded from areca web site" echo "ftp://ftp.areca.com.tw/RaidCards/AP_Drivers/Linux/CLI" } while getopts "w:c:h" opt; do case $opt in w) IFS=: read WLLIMIT WULIMIT <<< "$OPTARG" ;; c) IFS=: read CLLIMIT CULIMIT <<< "$OPTARG" ;; C) CLI=$OPTARG exit $STATE_OK ;; h) print_help exit $STATE_OK ;; *) esac done if [ ! -f $CLI ]; then echo "Missing $CLI file." print_help exit $STATE_UNKNOWN fi if [[ ${direction=`echo $WLLIMIT $CLLIMIT | awk '($1 < $2) { print "above" }'`} = "above" ]] || [[ ${direction=`echo $WULIMIT $CULIMIT | awk '($1 > $2) { print "below" }'`} = "below" ]]; then echo "Error: WARNING value must be $direction CRITICAL value" print_help exit $STATE_UNKNOWN fi fan_speed_areca=`sudo $CLI hw info|grep "Fan"|grep -oP '[0-9]+?\S+'` IFS=$'\n' read -a temperatures <<< `sudo $CLI hw info | awk '/.*C$/ { print $1":"$(NF-1) }'` IFS=$'\n' read -a volume_status <<< `sudo $CLI vsf info|grep -i VOL|awk '{print $1":"$NF}'` event_status=`sudo $CLI event info|grep -E ^[0-9] | awk '{ print $1" "$2 }'` for temperature in ${temperatures[@]}; do IFS=: read sensor out <<< "$temperature" temp_perf+=($sensor=$out\;) done temp_perf=$(echo ${temp_perf[*]}) # Check fan if [[ $fan_speed_areca =~ ^[0-9]+ ]]; then if [[ $fan_speed_areca -gt $WULIMIT ]] || [[ $fan_speed_areca -lt $WLLIMIT ]]; then if [[ $fan_speed_areca -gt $CULIMIT ]] || [[ $fan_speed_areca -lt $CLLIMIT ]]; then exit_out+=("FAN:$STATE_CRITICAL") else exit_out+=("FAN:$STATE_WARNING") fi fi fi # Check volume status for volume in ${volume_status[*]}; do OLDIFS=$IFS IFS=:; read volid status <<< "$volume" IFS=$OLDIFS if [ "$status" != "Normal" ]; then volume_status="CRITICAL" exit_out+=("VOLUME($volid $status):$STATE_CRITICAL") else volume_status=OK fi done # Event check new_event=0 new_date=$(date "+%s") if [[ ! -e $EVENT_FILE ]]; then now_date=$new_date else now_date=$(cat $EVENT_FILE) fi OLDIFS=$IFS IFS=$'\n' for i in $event_status; do old_date=`date -d "$i UTC -30 min" "+%s"` if [ $old_date -gt $now_date ]; then new_event=1 fi done IFS=$OLDIFS echo $new_date > $EVENT_FILE if [ $new_event -eq 1 ]; then exit_out+=("EVENT:$STATE_CRITICAL") fi state=0 for exit in ${exit_out[*]}; do IFS=: read SYSTEM STATE <<< "$exit" system+=("$SYSTEM") if [[ $STATE -gt $state ]]; then state=$STATE fi done EXIT_CODE[0]=OK EXIT_CODE[1]=WARNING EXIT_CODE[2]=CRITICAL EXIT_CODE[3]=UNKNOWN system=$(IFS=,; echo "${system[*]}") OUT=$(echo $state | awk '$1 > 0 { print " ("var")" }' var="$system") if [[ $fan_speed_areca =~ ^[0-9]+ ]]; then FAN=" Fan speed: $fan_speed_areca -" fi if [[ $temperatures != "" ]]; then TEMP=" Temperatures: $temperatures -" fi echo "${EXIT_CODE[$state]}$OUT -$FAN$TEMP Volume status:$volume_status|fan=$fan_speed_areca;$temp_perf" exit $state