diff --git a/Dell_MD38XX/zbxDellStorageDeviceDiscover b/Dell_MD38XX/zbxDellStorageDeviceDiscover new file mode 100755 index 0000000000000000000000000000000000000000..b01f8592ad267e20b9911cb13d9467e982d8e697 --- /dev/null +++ b/Dell_MD38XX/zbxDellStorageDeviceDiscover @@ -0,0 +1,273 @@ +#! /bin/bash +# +# Name: zbxDellStorageDeviceDiscover +# +# Get Dell MD38XX storage server metrics and send to Zabbix using zabbix_sender +# +# Author: Fulvio Galeazzi +# +# Heavily based on: +# zbxApacheStatusCheck: written by Rodrigo Luis Silva +# zapache: https://github.com/lorf/zapache +# ApacheStatsForZabbix: https://github.com/gpmidi/zabbix-apache-stats +# + +name="zbxDellStorageStatusCheck" +version="0.1" + +# Test if your getopt(1) is this enhanced version or an old version +getopt --test > /dev/null +if [[ $? != 4 ]]; then + echo "`getopt --test` failed in this environment." + exit 1 +fi + +# Help function +function usage() +{ +echo " +$0 $version + +Usage: $0 [Options] + +This script collect statistics from Apache status page, write to a temporary file +and send using zabbix_sender, the script will do only one request per execution. + +License: GPL + +Options: + --version show version and exit + + -h, --help show this help page and exit + + -e, --check Skip syntax checking: useful for crontab + once functionality has been ascertained + + -p PATHBIN, --path=PATHBIN + Full path of SMcli executable + + -m, --match=String Filter Storage Array name according to String + + -w, --want String1[,String2[,String3]] + List of words identifying storage objects + to query information for. Defaults to + Storage,RAID,Disk + (note that Disk matches both Group and Pool) + + --timeout=seconds Connection timeout + [default: 30] + + -d, --debug Run using Debug mode + + -t, --test Do not send data, simply test, use with --debug +" +} + +# Define some default values +HOST=localhost +DEBUG=0 +TEST=1 +MONINTERVAL=1 +PATHBIN="`which SMcli > /dev/null`" +TIMEOUT=30 +WANTOBJECTS="Storage,RAID,Disk" + +# Use getopt(1) program to parse command line options +SHORT=vhep:m:w:dt +LONG=version,help,check,path:,match:,want:,timeout:,debug,test +PARSED=`getopt --options $SHORT --longoptions $LONG --name "$0" -- "$@"` +if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi +eval set -- "$PARSED" + +while true; do + case "$1" in + -v|--version) + echo "$name $version" + exit 0 + ;; + -h|--help) + usage + exit 0 + ;; + -e|--check) + CHECKSYNTAX="-e" + shift + ;; + -p|--path) + PATHBIN="$2" + shift 2 + ;; + -m|--match) + MATCHSTR="$2" + shift 2 + ;; + -w|--want) + WANTOBJECTS="$2" + shift 2 + ;; + --timeout) + TIMEOUT="$2" + shift 2 + ;; + -d|--debug) + DEBUG=1 + shift + ;; + -t|--test) + TEST=1 + shift + ;; + --) + shift + break + ;; + *) + usage + exit 3 + ;; + esac +done + +# Temporary files +STATUSFILE=`mktemp` +SENDERFILE=`mktemp` +if [[ -z $CONFIGFILE ]]; then + CONFIGFILE=`mktemp` + tmpCONFIGFILE=1 + echo "$DEFAULTCONFIG" > $CONFIGFILE +fi +KNOWNARRAYS=`mktemp` + +GET_CMD="$PATHBIN -d -i > $KNOWNARRAYS" +eval $GET_CMD +RET_VAL=$? +if [[ $RET_VAL = 0 ]]; then + + cat $KNOWNARRAYS + + index=0 + # 1 is with ',' + raidCtrlArray1=() + # 2 is with ' ' + raidCtrlArray2=() + devNameArray=() + while read aLine ; do + # Strip leading and trailing space, replace blanks with comma + aNiceLine=`echo $aLine | sed -e 's/^\s\+//' -e 's/\s\+$//' -e 's/\s\+/,/g'` + firstWord=${aNiceLine%%,*} + if [[ -z "$firstWord" || ${firstWord} == *"SMcli"* ]]; then + continue + fi + echo "First: -->${firstWord}<--" + if [[ ! -z "$MATCHSTR" && ! "$aLine" == *"$MATCHSTR"* ]]; then + continue + fi + echo "Line: ${aNiceLine}" + + devNameArray[$index]="$firstWord" + tmpString="${aNiceLine#*,}" + raidCtrlArray1[$index]="$tmpString" + raidCtrlArray2[$index]="${tmpString//,/ }" + index=$(($index+1)) + done < $KNOWNARRAYS + echo "Dev: ${devNameArray[@]}" + echo "Raid1: ${raidCtrlArray1[@]}" + echo "Raid2: ${raidCtrlArray2[@]}" + + IFS=',' read -a wantObjArr <<< "$WANTOBJECTS" + + for (( idx=0; idx<${#devNameArray[@]}; idx++)); do + raidList="${raidCtrlArray2[$idx]}" + STATUSFILE=`mktemp` + GET_CMD="$PATHBIN $raidList -c 'set session performanceMonitorInterval=3 performanceMonitorIterations=1 ; save storageArray performanceStats file=\"$STATUSFILE\";' > /dev/null" + + echo "Execute: $GET_CMD" + # get data from server + eval $GET_CMD + RET_VAL=$? + + if [[ $RET_VAL = 0 ]]; then + + while read STATUSLINE + do + # read the status file to get all relevant statistics + # Replaces all occurrences of " character + aLine=`echo ${STATUSLINE//\"}` + # Split line into fields + IFS=',' read -a arrayLine <<< "$aLine" + # Skip not-so-interesting lines + firstField="${arrayLine[0]}" + firstWord=`echo ${arrayLine[0]} | awk '{print $1}'` + if [[ -z "$firstWord" || ! "${wantObjArr[@]}" =~ "$firstWord" ]]; then + continue + fi + + tmpString=`echo $firstField | awk '{print $1" "$2}'` + deviceType=${tmpString// /_} + deviceName=${firstField:${#tmpString}+1} + deviceName=${deviceName// /_} + + echo "RAID: ${raidCtrlArray1[$idx]} Want: $WANTOBJECTS Type: $deviceType Name: $deviceName" + done < $STATUSFILE + + + fi + rm $STATUSFILE + done +fi + + +# DEBUG +if [[ $DEBUG = 1 ]]; then + echo -e "\n########################################\n" + echo -e "Statistics available on your server:\n" + cat $STATUSFILE | awk -F: '{print $1}' + + echo -e "\n########################################\n" + echo -e "Statistics that I am collecting:\n" + cat $CONFIGFILE + + echo -e "\n########################################\n" + echo -e "Metrics to be sent\n" + SENDERFILEDEBUG=`mktemp` + echo '"SERVER" "METRIC" VALUE' >> $SENDERFILEDEBUG + cat $SENDERFILE >> $SENDERFILEDEBUG + column -t -s'\"' $SENDERFILEDEBUG + rm -f $SENDERFILEDEBUG + + echo -e "\n########################################\n" + echo -e "Parameters\n" + echo "--check=$CHECKSYNTAX" + echo "--path=$PATHBIN" + echo "--raid=$raidList" + echo "--interval=$MONINTERVAL" + echo "--zabbixserver=$ZABBIXSERVER" + echo "--sender=$SENDER" + echo "--zabbixport=$ZABBIXPORT" + echo "--zabbixsource=$ZABBIXSOURCE" + echo "--timeout=$TIMEOUT" + + echo -e "\n wantObjects=${wantObjArr[@]}\n" + + echo -e "\n########################################\n" + echo -e "Command line to collect data\n" + echo -e "$GET_CMD\n" + echo -e "Command line to send data to Zabbix\n" + echo -e "$SENDER_CMD\n" + + if [[ $TEST = 0 ]]; then + echo -e "\n########################################\n" + echo -e "zabbix_sender output\n" + eval $SENDER_CMD + echo -e "\n" + fi +else + [[ $TEST = 0 ]] && eval $SENDER_CMD > /dev/null +fi + +# Housekeeping +rm -f $STATUSFILE +# rm -f $SENDERFILE +if [[ -n $tmpCONFIGFILE ]]; then + rm -f $CONFIGFILE +fi diff --git a/Dell_MD38XX/zbxDellStorageStatusCheck b/Dell_MD38XX/zbxDellStorageStatusCheck new file mode 100755 index 0000000000000000000000000000000000000000..94073ce8045150e693dae1b0824259dab0567615 --- /dev/null +++ b/Dell_MD38XX/zbxDellStorageStatusCheck @@ -0,0 +1,336 @@ +#! /bin/bash +# +# Name: zbxDellStorageStatusCheck +# +# Get Dell MD3X60 storage server metrics and send to Zabbix using zabbix_sender +# +# Author: Fulvio Galeazzi +# +# Heavily based on: +# zbxApacheStatusCheck: written by Rodrigo Luis Silva +# zapache: https://github.com/lorf/zapache +# ApacheStatsForZabbix: https://github.com/gpmidi/zabbix-apache-stats +# + +name="zbxDellStorageStatusCheck" +version="0.1" + +# Test if your getopt(1) is this enhanced version or an old version +getopt --test > /dev/null +if [[ $? != 4 ]]; then + echo "`getopt --test` failed in this environment." + exit 1 +fi + +# Help function +function usage() +{ +echo " +$0 $version + +Usage: $0 [Options] + +This script collect statistics from Apache status page, write to a temporary file +and send using zabbix_sender, the script will do only one request per execution. + +License: GPL + +Options: + --version show version and exit + + -h, --help show this help page and exit + + -e, --check Skip syntax checking: useful for crontab + once functionality has been ascertained + + -p PATHBIN, --path=PATHBIN + Full path of SMcli executable + + -r, --raid IP1[,IP2] List of IPs or DNS names: all addresses + should belong to the same controller + + -w, --want String1[,String2[,String3]] + List of words identifying storage objects + to query information for. Defaults to + Storage,RAID,Disk + (note that Disk matches both Group and Pool) + + -i TIME, --interval=ITIME + Number of seconds to accumulate data for, + default is 3 + + -z ZABBIXSERVER, --zabbixserver=ZABBIXSERVER + Hostname or IP address of Zabbix server + [default: localhost] + + -s SENDERLOC, --sender=SENDERLOC + Path of zabbix_sender binary + [default: /usr/bin/zabbix_sender] + + -q ZABBIXPORT, --zabbixport=ZABBIXPORT + Specify port number of Zabbix server + trapper running on the server + [default: 10051] + + -c ZABBIXSOURCE, --zabbixsource=ZABBIXSOURCE + Specify host name the item belongs to + (as registered in Zabbix frontend) + [default: localhost] + + --TIMEOUT=seconds Connection timeout + [default: 30] + + -k CONFIGFILE, --config=CONFIGFILE + Specify the file with the list of statistics to collect + File format is a list of lines with the same order as the + fields in SMcli output, of the form: <variableName> <0|1> + <variableName> should match Zabbix item key + <0|1> the relevant statistics shouldn't/should be collected + [default: run $0 --dumpconfig] + + --dumpconfig Show the actual config + + -d, --debug Run using Debug mode + + -t, --test Do not send data, simply test, use with --debug +" +} + +# Define some default values +HOST=localhost +PORT=80 +PROTO=http +ZABBIXSERVER=localhost +SENDER=/usr/bin/zabbix_sender +DEBUG=0 +TEST=1 +ZABBIXPORT=10051 +ZABBIXSOURCE=localhost +MONINTERVAL=3 +PATHBIN="`which SMcli > /dev/null`" +TIMEOUT=30 +DEFAULTCONFIG="name,1 +iotot,1 +readfrac,1 +ctrlcachehitr,1 +ctrlcachehitw,1 +ssdcachehitr,1 +curMBs,0 +maxMBs,1 +curIOs,0 +maxIOs,1 +minIOs,0 +avgIOs,0 +minMBs,0 +avgMBs,0 +curIOlat,0 +maxIOlat,0 +minIOlat,0 +avgIOlat,1" +WANTOBJECTS="Storage,RAID,Disk" + +# Use getopt(1) program to parse command line options +SHORT=vhep:r:w:i:z:s:q:c:k:dt +LONG=version,help,check,path:,raid:,want:,interval:,zabbixserver:,sender:,zabbixport:,zabbixsource:,timeout:,config:,debug,dumpconfig,test +PARSED=`getopt --options $SHORT --longoptions $LONG --name "$0" -- "$@"` +if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi +eval set -- "$PARSED" + +while true; do + case "$1" in + -v|--version) + echo "$name $version" + exit 0 + ;; + -h|--help) + usage + exit 0 + ;; + -e|--check) + CHECKSYNTAX="-e" + shift + ;; + -p|--path) + PATHBIN="$2" + shift 2 + ;; + -r|--raid) + RAIDCTRL="$2" + shift 2 + ;; + -w|--want) + WANTOBJECTS="$2" + shift 2 + ;; + -i|--interval) + MONINTERVAL="$2" + shift 2 + ;; + -z|--zabbixserver) + ZABBIXSERVER="$2" + shift 2 + ;; + -s|--sender) + SENDER="$2" + shift 2 + ;; + -q|--zabbixport) + ZABBIXPORT="$2" + shift 2 + ;; + -c|--zabbixsource) + ZABBIXSOURCE="$2" + shift 2 + ;; + --timeout) + TIMEOUT="$2" + shift 2 + ;; + -k|--config) + CONFIGFILE="$2" + shift 2 + ;; + -d|--debug) + DEBUG=1 + shift + ;; + --dumpconfig) + echo "$DEFAULTCONFIG" + exit 0 + ;; + -t|--test) + TEST=1 + shift + ;; + --) + shift + break + ;; + *) + usage + exit 3 + ;; + esac +done + +# Temporary files +STATUSFILE=`mktemp` +SENDERFILE=`mktemp` +if [[ -z $CONFIGFILE ]]; then + CONFIGFILE=`mktemp` + tmpCONFIGFILE=1 + echo "$DEFAULTCONFIG" > $CONFIGFILE +fi + +raidList=`echo $RAIDCTRL | sed -e 's/,/ /'` +IFS=',' read -a wantObjArr <<< "$WANTOBJECTS" + +GET_CMD="$PATHBIN $raidList $CHECKSYNTAX -c 'set session performanceMonitorInterval=$MONINTERVAL performanceMonitorIterations=1 ; save storageArray performanceStats file=\"$STATUSFILE\";' > /dev/null" + +# get data from server +eval $GET_CMD +RET_VAL=$? + +# in case of error, just send [failed] = 1 +# otherwise send all collected data +if [[ $RET_VAL = 0 ]]; then + echo "\"$ZABBIXSOURCE\" \"custom.dellmd38xx[failed]\" 0" >> $SENDERFILE + + index=0 + zbxKey=() + zbxWant=() + while IFS=',' read -a aItem ; do + if [[ ${aItem[0]} ]]; then + zbxKey[$index]="${aItem[0]}" + zbxWant[$index]="${aItem[1]}" + index=$(($index+1)) + fi + done < $CONFIGFILE + + # read the status file to get all relevant statistics + while read STATUSLINE + do + # Replaces all occurrences of " character + aLine=`echo ${STATUSLINE//\"}` + # Split line into fields + IFS=',' read -a arrayLine <<< "$aLine" + # Skip not-so-interesting lines + firstField="${arrayLine[0]}" + firstWord=`echo ${arrayLine[0]} | awk '{print $1}'` + if [[ -z "$firstWord" || ! "${wantObjArr[@]}" =~ "$firstWord" ]]; then + continue + fi + + tmpString=`echo $firstField | awk '{print $1" "$2}'` + deviceType=${tmpString// /_} + deviceName=${firstField:${#tmpString}+1} + deviceName=${deviceName// /_} + for (( idx=1; idx<${#zbxKey[@]}; idx++)); do + if [ ! "$zbxWant[$idx]" ]; then + continue + fi + echo -n "\"$ZABBIXSOURCE\" \"custom.dellmd38xx.${zbxKey[$idx]}[${deviceType},${deviceName}]\" " >> $SENDERFILE + echo ${arrayLine[$idx]} >> $SENDERFILE + done + done < $STATUSFILE +else + echo "\"$ZABBIXSOURCE\" \"custom.dellmd38xx[failed]\" 1" >> $SENDERFILE +fi + +# Send all information to Zabbix using zbbix_sender +SENDER_CMD="$SENDER -v --zabbix-server $ZABBIXSERVER --port $ZABBIXPORT --input-file $SENDERFILE" + +# DEBUG +if [[ $DEBUG = 1 ]]; then + echo -e "\n########################################\n" + echo -e "Statistics available on your server:\n" + cat $STATUSFILE | awk -F: '{print $1}' + + echo -e "\n########################################\n" + echo -e "Statistics that I am collecting:\n" + cat $CONFIGFILE + + echo -e "\n########################################\n" + echo -e "Metrics to be sent\n" + SENDERFILEDEBUG=`mktemp` + echo '"SERVER" "METRIC" VALUE' >> $SENDERFILEDEBUG + cat $SENDERFILE >> $SENDERFILEDEBUG + column -t -s'\"' $SENDERFILEDEBUG + rm -f $SENDERFILEDEBUG + + echo -e "\n########################################\n" + echo -e "Parameters\n" + echo "--check=$CHECKSYNTAX" + echo "--path=$PATHBIN" + echo "--raid=$raidList" + echo "--interval=$MONINTERVAL" + echo "--zabbixserver=$ZABBIXSERVER" + echo "--sender=$SENDER" + echo "--zabbixport=$ZABBIXPORT" + echo "--zabbixsource=$ZABBIXSOURCE" + echo "--timeout=$TIMEOUT" + + echo -e "\n wantObjects=${wantObjArr[@]}\n" + + echo -e "\n########################################\n" + echo -e "Command line to collect data\n" + echo -e "$GET_CMD\n" + echo -e "Command line to send data to Zabbix\n" + echo -e "$SENDER_CMD\n" + + if [[ $TEST = 0 ]]; then + echo -e "\n########################################\n" + echo -e "zabbix_sender output\n" + eval $SENDER_CMD + echo -e "\n" + fi +else + [[ $TEST = 0 ]] && eval $SENDER_CMD > /dev/null +fi + +# Housekeeping +rm -f $STATUSFILE +# rm -f $SENDERFILE +if [[ -n $tmpCONFIGFILE ]]; then + rm -f $CONFIGFILE +fi