munin-contrib/plugins/disk/hdsentinel

161 lines
4.5 KiB
Bash
Executable File

#!/bin/bash
# -*- sh -*-
#
# Multigraph plugin to monitor harddrive temperature, condition,
# performance and estimated remaining lifetime through HDSentinel.
#
# To use, download the latest HDSentinel for Linux x86 or x64 from
# http://www.hdsentinel.com/hard_disk_sentinel_linux.php
# Unzip to /usr/local/bin/, make executable (chmod +x HDSentinel)
# in /etc/munin/plugin-conf.d/munin-node add the following lines
#
# [hdsentinel]
# user root
# group root
#
# Copy this plugin to /usr/share/munin/plugins, and symlink it to
# /etc/munin/plugins, and then restart node.
#
#%# family=contrib
HDSPATH=/usr/local/bin/HDSentinel
if [ "$1" = "autoconf" ]; then
if [ -x "$HDSPATH" ]; then
echo yes
exit 0
else
echo no
exit 0
fi
fi
HDSOUT=`$HDSPATH`
LIN=''
SPC=' '
NLN='\n'
OLDIFS=$IFS
IFS=$'\n'
for line in $HDSOUT; do
if [[ "$line" == */dev* ]] ; then
LIN=$LIN$line
fi
if [[ "$line" == *Temperature* ]] || [[ "$line" == *Health* ]] || [[ "$line" == *Performance* ]] ; then
LIN=$LIN$SPC$line
fi
if [[ "$line" == *lifetime* ]] ; then
LIN=$LIN$SPC$line$NLN
fi
done
SLD=`echo -e $LIN`
echo 'multigraph hdsentinel_temps'
if [ "$1" = "config" ]; then
echo 'graph_title HDSentinel Drive Temperature'
echo 'graph_vlabel Degrees Celsius'
echo 'graph_args --base 1000 -l 0'
echo 'graph_category sensors'
echo 'graph_info Temperatures calculated by HDSentinel from SMART'
fi
for linf in $SLD; do
DEV=`echo $linf | awk '{printf $4}' | awk '{printf substr($0,6)}'`
echo -n $DEV
if [ "$1" = "config" ]; then
echo '_temp.label '$DEV
echo $DEV'_temp.warning 55'
echo $DEV'_temp.critical 70'
else
echo -n '_temp.value '
TEMP=`echo $linf | awk '{print $7}'`
if [[ "$TEMP" == *Unknown* ]] || [[ "$line" == "" ]] ; then
TEMP='U'
fi
echo $TEMP
fi
done
echo
echo 'multigraph hdsentinel_health'
if [ "$1" = "config" ]; then
echo 'graph_title HDSentinel Drive Health'
echo 'graph_vlabel %'
echo 'graph_args --base 1000 -l 0 --lower-limit 0 --upper-limit 100'
echo 'graph_category disk'
echo 'graph_info Drive health in percent calculated by HDSentinel from SMART'
fi
for linf in $SLD; do
DEV=`echo $linf | awk '{printf $4}' | awk '{printf substr($0,6)}'`
echo -n $DEV
if [ "$1" = "config" ]; then
echo '_heal.label '$DEV
echo $DEV'_heal.warning 100:'
echo $DEV'_heal.critical 75:'
else
echo -n '_heal.value '
HEAL=`echo $linf | awk '{print $11}'`
if [[ "$HEAL" == *Unknown* ]] || [[ "$HEAL" == "" ]] ; then
HEAL='U'
fi
echo $HEAL
fi
done
echo
echo 'multigraph hdsentinel_performance'
if [ "$1" = "config" ]; then
echo 'graph_title HDSentinel Drive Performance'
echo 'graph_vlabel %'
echo 'graph_args --base 1000 -l 0 --lower-limit 0 --upper-limit 100'
echo 'graph_category disk'
echo 'graph_info Drive performance calculated by HDSentinel from SMART'
fi
for linf in $SLD; do
DEV=`echo $linf | awk '{printf $4}' | awk '{printf substr($0,6)}'`
echo -n $DEV
if [ "$1" = "config" ]; then
echo '_perf.label '$DEV
echo $DEV'_perf.warning 85:'
echo $DEV'_perf.critical 60:'
else
echo -n '_perf.value '
PERF=`echo $linf | awk '{print $15}'`
if [[ "$PERF" == *Unknown* ]] || [[ "$PERF" == "" ]] ; then
PERF='U'
fi
echo $PERF
fi
done
echo
echo 'multigraph hdsentinel_lifetime'
if [ "$1" = "config" ]; then
echo 'graph_title HDSentinel Estimated Drive Lifetime'
echo 'graph_vlabel days'
echo 'graph_args --base 1000 -l 0'
echo 'graph_category disk'
echo 'graph_info Drive estimated remaining lifetime calculated by HDSentinel from SMART'
fi
for linf in $SLD; do
DEV=`echo $linf | awk '{printf $4}' | awk '{printf substr($0,6)}'`
echo -n $DEV
if [ "$1" = "config" ]; then
echo '_life.label '$DEV
echo $DEV'_life.warning 180:'
echo $DEV'_life.critical 90:'
else
echo -n '_life.value '
LIFE=`echo $linf | awk 'match($0,"lifetime: "){print substr($0,RSTART+10)}' | tr -dc '[0-9]'`
if [[ "$LIFE" == *Unknown* ]] || [[ "$LIFE" == "" ]] ; then
LIFE='U'
fi
echo $LIFE
fi
done
echo
IFS=$OLDIFS
unset IFS