2013-06-12 15:29:45 +02:00
|
|
|
#!/bin/bash
|
|
|
|
# -*- sh -*-
|
|
|
|
#
|
2018-08-02 02:03:42 +02:00
|
|
|
# Multigraph plugin to monitor harddrive temperature, condition,
|
2013-06-12 15:29:45 +02:00
|
|
|
# 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
|