2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00
contrib-munin/plugins/sensors/freeipmi_
2012-08-09 15:55:12 -07:00

180 lines
4.1 KiB
Bash
Executable File

#!/bin/sh
# -*- sh -*-
: << =cut
=head1 NAME
freeipmi_ - Plugin to monitor temperature or fan speed using FreeIPMI
=head1 CONFIGURATION
=head2 ENVIRONMENT VARIABLES
When used to monitor a foreign host, this plugins use the variables
IPMI_USERNAME and IPMI_PASSWORD to log in on the remote system.
=head2 WILDCARD PLUGIN
You can monitor either the current system (via /dev/ipmi0 and the
like) or a remote system (via the LAN protocols), and for each of the
two options you can select your sensors:
- fans;
- temp;
- power;
- current;
- voltage.
When used for the local host, the plugin should be linked as, e.g.,
'ipmi_temp', whereas when used to monitor a foreign host it should be,
e.g., 'ipmi_192.168.0.253_temp'.
=head1 NOTE
=head1 AUTHOR
Rewritten by Diego Elio Pettenò <flameeyes@flameeyes.eu>.
Based on the work of Nicolai Langfeldt <janl@linpro.no>, Logilab and
Peter Palfrader.
=head1 LICENSE
GPLv2
=head1 MAGIC MARKERS
#%# family=auto
#%# capabilities=autoconf suggest
=cut
#### Parse commandline to determine what the job is
_ipmisensors() {
params="--quiet-cache --comma-separated-output --no-header-output --ignore-not-available-sensors"
if [ "x${hostname}" != "x" ]; then
params="${params} --hostname=${hostname}"
[ "x${IPMI_USERNAME}" != "x" ] && params="${params} --username=${IPMI_USERNAME}"
[ "x${IPMI_PASSWORD}" != "x" ] && params="${params} --password=${IPMI_PASSWORD}"
fi
if ! ipmi-sensors ${params} --output-sensor-thresholds "$@"; then
ipmi-sensors ${params} "$@"
fi
}
# extract and eventual hostname out of the called name; we
# have to check whether it's set to "u" as that's what happens
# when the compatibility with ipmi_sensor_ is used.
hostname1=${0#*_}
hostname=${hostname1%%_*}
if [ "x${hostname}" = "xu" -o "x${hostname}" = "x${hostname1}" ]; then
hostname=""
fi
case $0 in
*_temp|*_u_degrees_c)
title="Temperatures"
vlabel="degrees Celsius"
type=Temperature
unit=C
;;
*_fans|*_u_rpm)
title="Fan speeds"
vlabel="Rotations per Minute (RPM)"
type=Fan
unit=RPM
;;
*_power|*_u_watts)
title="Power consumption"
vlabel="Watts"
type=Current
unit=W
;;
*_current|*_u_amps)
title="Current drain"
vlabel="Amperes"
type=Current
unit=A
;;
*_voltage|*_u_volts)
title="Voltages"
vlabel="Volts"
type=Voltage
unit=V
;;
*)
if [ x"$1" != x"autoconf" -a x"$1" != x"suggest" ]; then
echo "Please invoke as one of the supported sensors types:" >&2
echo freeipmi_{temp,fans,power,current} >&2
exit 1
fi
esac
case $1 in
autoconf)
if ! command -v ipmi-sensors >/dev/null 2>&1 ; then
echo 'no (missing ipmi-sensors command)'
exit 0
fi
if ! _ipmisensors -t OS_Boot >/dev/null 2>&1 ; then
echo 'no (unable to access IPMI device)'
exit 0
fi
echo yes
exit 0
;;
suggest)
_ipmisensors | awk -F, '
$3 == "Temperature" { print "temp"; }
$3 == "Fan" { print "fans"; }
$3 == "Current" && $5 == "W" { print "power"; }
$3 == "Current" && $5 == "A" { print "current"; }
$3 == "Voltage" { print "voltage"; }
'
exit 0;;
config)
cat - <<EOF
graph_title ${title} based on IPMI sensors
graph_vlabel ${vlabel}
graph_category Sensors
EOF
if [ "x${hostname}" != "x" ]; then
echo "host_name ${hostname}"
fi
;;
esac
_ipmisensors -t ${type} | awk -F, -v CONFIG=$1 -v UNIT=$unit '
$5 == UNIT {
if ( CONFIG != "config" ) {
printf("ipmi%s.value %s\n", $1, $4);
} else {
printf("ipmi%s.label %s\n", $1, $2);
# This can only happen if FreeIPMI is new enough
if ( NF == 12 ) {
if ( $8 != "N/A" && $10 != "N/A" )
printf("ipmi%s.warning %s:%s\n", $1, $8, $10);
else if ( $8 == "N/A" && $10 != "N/A" )
printf("ipmi%s.warning :%s\n", $1, $10);
else if ( $8 != "N/A" && $10 == "N/A" )
printf("ipmi%s.warning %s:\n", $1, $8);
if ( $7 != "N/A" && $11 != "N/A" )
printf("ipmi%s.critical %s:%s\n", $1, $7, $11);
else if ( $7 == "N/A" && $11 != "N/A" )
printf("ipmi%s.critical :%s\n", $1, $11);
else if ( $7 != "N/A" && $11 == "N/A" )
printf("ipmi%s.critical %s:\n", $1, $7);
}
}
}
'
# vim: syntax=sh ts=4 et