2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00

ipmi: remove the multiple IPMI plugins and simply introduce my FreeIPMI plugin.

This is a catch-all that will work with any recent FreeIPMI and
actually supports all the features of the others.
This commit is contained in:
Diego Elio Pettenò 2012-08-06 21:41:09 -07:00
parent e0f0fb8659
commit 4e3ef5b93e
8 changed files with 146 additions and 1986 deletions

341
plugins/ipmi/freeipmi_ Executable file → Normal file
View File

@ -1,228 +1,179 @@
#!/usr/bin/python
#
# Copyright (C) 2011,2012 Andreas Thienemann <andreas@bawue.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#!/bin/sh
# -*- sh -*-
: << =cut
"""
=head1 NAME
freeipmi_ - Munin plugin to retreive temperature and fan speed measurements
from a local machine via IPMI.
=head1 APPLICABLE SYSTEMS
All machines with an IPMI capable baseboard management controller.
freeipmi_ - Plugin to monitor temperature or fan speed using FreeIPMI
=head1 CONFIGURATION
On most supported systems this plugin works nearly out of the box as long as
both Python and the freeipmi binaries in a semi-recent version are installed.
=head2 ENVIRONMENT VARIABLES
If the machine works out of the box can be tested by calling bmc-info.
If there's text output, a bmc card was detected. If there's an entry for
"Sensor Device" visible in the "Additional Device Support" entry you're good.
When used to monitor a foreign host, this plugins use the variables
IPMI_USERNAME and IPMI_PASSWORD to log in on the remote system.
If you get a "ipmi_cmd_get_device_id: driver timeout" message you have most
likely no bmc to query.
=head2 WILDCARD PLUGIN
In certain cases however bmc-info will just seem to hang for quite some time.
In this case, autodetection does not work because the smbios table has
incorrect information. One system known to experience this problem is the
HP Proliant Microserver.
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:
Adding env.freeipmi_args "--no-probing --driver-type=KCS --driver-address=0xca2 --register-spacing=1"
to the munin plugin configuration will make the plugin work. This is the
specific line for the HP Proliant Microserver mentioned above. Your mileage
may vary.
- fans;
- temp;
- power;
- current;
- voltage.
Basic configuration for every system is that the plugin needs to be called as root.
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'.
Add the following to your /etc/munin/plugin-conf.d/freeipmi:
[freeipmi_*]
user root
=head1 INTERPRETATION
The plugin shows the temperature in Celsius or the fanspeed in rotations per minute.
=head1 MAGIC MARKERS
#%# family=contrib
#%# capabilities=autoconf suggest
=head1 VERSION
0.0.1
=head1 BUGS
Only local support for now. Remote could be hacked in via freeipmi_args for now.
=head1 NOTE
=head1 AUTHOR
Andreas Thienemann <andreas@bawue.net>
Rewritten by Diego Elio Pettenò <flameeyes@flameeyes.eu>.
Based on the work of Nicolai Langfeldt <janl@linpro.no>, Logilab and
Peter Palfrader.
=head1 LICENSE
GPLv3+
GPLv2
=head1 MAGIC MARKERS
#%# family=auto
#%# capabilities=autoconf suggest
=cut
"""
import subprocess
import sys
import os
import re
import pprint
#### Parse commandline to determine what the job is
# Parse some environment variables
if os.getenv("freeipmi_args") is not None:
freeipmi_args = " %s" % (os.getenv("freeipmi_args"))
else:
freeipmi_args = ""
_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
# We are a wildcard plugin, figure out whether we are called for temp or fan
if sys.argv[0].split("_")[1] == "temp":
mode = "Temperature"
elif sys.argv[0].split("_")[1] == "fan":
mode = "Fan"
else:
mode = None
if ! ipmi-sensors ${params} --output-sensor-thresholds "$@"; then
ipmi-sensors ${params} "$@"
fi
}
def whereis(prog):
"""Check if prog can be found in the path and if yes, return the full pathname"""
prog = os.path.basename(prog)
for dir in os.getenv("PATH").split(":"):
for root, dirs, files in os.walk(dir):
if prog in files:
return os.path.join(dir, prog)
return None
# 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
def normalize_sensor(name):
name = name.lower().replace("-","M").replace("+","P")
name = re.sub("[^a-z0-9A-Z]","_", name)
return name
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
# Code sniplet from Philipp Keller
# http://code.pui.ch/2007/02/19/set-timeout-for-a-shell-command-in-python/
def timeout_command(command, timeout):
"""call shell-command and either return its output or kill it
if it doesn't normally exit within timeout seconds and return None"""
import subprocess, datetime, os, time, signal
start = datetime.datetime.now()
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while process.poll() is None:
time.sleep(0.1)
now = datetime.datetime.now()
if (now - start).seconds> timeout:
os.kill(process.pid, signal.SIGKILL)
os.waitpid(-1, os.WNOHANG)
return None
return process.stdout.read()
case $1 in
autoconf)
if ! command -v ipmi-sensors >/dev/null 2>&1 ; then
echo 'no (missing ipmi-sensors command)'
exit 0
fi
def bmc_detect():
"""Check whether there's a baseboard management controller we can query."""
if whereis("bmc-info") is None:
print "no (bmc-info not found in path. Please install FreeIPMI.)"
sys.exit(0)
else:
out = timeout_command("bmc-info%s" % (freeipmi_args), 2)
if out is not None and "[Sensor Device]" in out:
print "yes"
sys.exit(0)
else:
print "no (no supported bmc found)"
sys.exit(0)
if ! _ipmisensors -t OS_Boot >/dev/null 2>&1 ; then
echo 'no (unable to access IPMI device)'
exit 0
fi
def read_sensors():
"""Return all sensor data as a dict"""
out = timeout_command("ipmi-sensors --verbose%s" % (freeipmi_args), 2)
sensors = dict()
sensor = dict()
sensor_id = None
for line in out.split("\n"):
if ":" in line:
k,v = line.split(": ")
if k == "Record ID":
sensor = dict()
sensor_id = int(v)
sensor[k] = v
else:
sensor[k] = v
else:
sensors[sensor_id] = sensor
return sensors
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
def print_config():
"""Return configuration arguments for munin"""
print "graph_title FreeIPMI Sensors: %s" % (mode)
if mode == "Fan":
print "graph_vlabel RPM"
print "graph_info This graph shows the RPMs of the fans as reported by IPMI"
elif mode == "Temperature":
print "graph_vlabel Degrees C"
print "graph_info This graph shows the temperatures as reported by IPMI"
print "graph_category sensors"
sensors = read_sensors()
if [ "x${hostname}" != "x" ]; then
echo "host_name ${hostname}"
fi
;;
esac
for id in sorted(sensors):
if sensors[id]["Group Name"] == mode:
label = normalize_sensor(sensors[id]["Sensor Name"])
for n in ["Normal Max.", "Normal Min.", "Sensor Reading", "Lower Critical Threshold", "Upper Critical Threshold", "Lower Non-Critical Threshold", "Upper Non-Critical Threshold"]:
sensors[id][n] = sensors[id][n].replace("NA","")
sensors[id][n] = sensors[id][n].split('.')[0]
_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);
print "%s.label %s" % (label, label)
print "%s.warning %s:%s" % (label, sensors[id]["Lower Non-Critical Threshold"], sensors[id]["Upper Non-Critical Threshold"])
print "%s.critical %s:%s" % (label, sensors[id]["Lower Critical Threshold"], sensors[id]["Upper Critical Threshold"])
print "%s.graph_args --base 1000 -l 0" % (label)
print "%s.graph_scale no" % (label)
# pprint.pprint(sensors[id])
sys.exit(0)
# 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);
def fetch():
sensors = read_sensors()
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);
}
}
}
'
for id in sorted(sensors):
if sensors[id]["Group Name"] == mode:
label = normalize_sensor(sensors[id]["Sensor Name"])
print "%s.value %s" % (label, sensors[id]["Sensor Reading"].split(".")[0])
sys.exit(0)
if "config" in sys.argv[1:]:
print_config()
elif "autoconf" in sys.argv[1:]:
bmc_detect()
elif "suggest" in sys.argv[1:]:
sensors = read_sensors()
fan, temperature = [0, 0]
for id in sensors:
if sensors[id]["Group Name"] == "Fan":
fan += 1
elif sensors[id]["Group Name"] == "Temperature":
temperature += 1
if fan > 0:
print "fan"
if temperature > 0:
print "temp"
sys.exit(0)
else:
fetch()
# vim: syntax=sh ts=4 et

View File

@ -1,95 +0,0 @@
#!/usr/bin/env python
from commands import getstatusoutput as gso
def safe(s):
s=s.replace("-", "_")
s=s.replace(" ", "_")
s=s.replace(".", "_")
return s
def config(data,title):
for i in data:
print "%s.label %s"%(safe(i[0]), i[0])
# check for non-critical thresholds
if i[6] != 'na':
if i[7] != 'na':
warning = "%s:%s"%(i[6],i[7])
else:
warning = "%s:"%i[6]
else:
if i[7] != 'na':
warning = "%s"%i[7]
else:
warning = ""
if warning:
print "%s.warning %s"%(safe(i[0]),warning)
# check for critical thresholds
if i[5] == 'na':
i[5] == i[4] # N/A, so see if there is a non-recoverable threshold
if i[8] == 'na':
i[8] == i[9] # N/A, so see if there is a non-recoverable threshold
if i[5] != 'na':
if i[8] != 'na':
critical = "%s:%s"%(i[5],i[8])
else:
critical = "%s:"%i[5]
else:
if i[8] != 'na':
critical = "%s"%i[8]
else:
critical = ""
if critical:
print "%s.critical %s"%(safe(i[0]),critical)
print "graph_title %s"%title
if title == "Voltages":
print "graph_args -X 0 --logarithmic -l 1 -u 15"
#print "graph_args --base 1000 --logarithmic"
else:
print "graph_args -l 0"
print "graph_vlabel %s"%i[2]
print "graph_period minute"
print "graph_category IPMI"
def get_data():
import sys
category = sys.argv[0].split("_",1)[1]
data = []
if category =="Fans":
ids = ("Fan 1 Tach", "Fan 2 Tach", "Fan 3 Tach",
"Fan 4 Tach", "Fan 5 Tach", "Fan 6 Tach",)
title = "Fan Speed"
elif category == "Temperature":
ids = ("Ambient Temp", "Memory Temp",)
title = "Temperatures"
elif category == "Voltage":
ids = ("Planar 1.5V", "Planar 1.8V",
"Planar 3.3V", "Planar 5V", "Planar 12V",
"Planar VBAT", "CPU 1 VCore", "CPU 2 VCore",)
title = "Voltages"
status, output = gso("ipmitool sensor")
for row in output.split("\n"):
items = map(str.strip,row.split("|"))
field,value,units,status,lower_nonrecoverable,lower_critical,lower_non_critical,upper_non_critical,upper_critical,upper_nonrecoverable=items
if field in ids:
if value == 'na': continue
data.append(items)
return data,title
def sample(data):
for i in data:
print "%s.value %s"%(safe(i[0]),i[1])
def main():
import sys
data,title = get_data()
if 'config' in sys.argv:
return config(data,title)
sample(data)
if __name__ == '__main__':
main()

View File

@ -1,114 +0,0 @@
#! /usr/bin/perl -w
#
# This plugin will graph the chassis fan speed on a Dell PowerEdge Server
# via the ipmi-sensors tool. It has been tested on the following chassis:
#
# PE1850
#
# To enable:
#
# ln -s /usr/share/munin/plugins/ipmi-fans /etc/munin/plugins/ipmi-fans
#
# Configuration parameters for /etc/munin/plugin-conf.d/munin-node
#
# [ipmi_fans]
# user - User that has permissions to run the omreport binary
# env.omreport - Path to the omreport binary
#
# Parameters:
#
# config
# autoconf
#
# Author: Alexx Roche <munin-ipmi-plugin@alexx.net>
# Built on the work of Justin Shepherd <galstrom21@gmail.com>
# Revision: 2.1 2011/01/10
#
#%# family=auto
#%# capabilities=autoconf
use strict;
my $IPMI;
if(-f "/usr/sbin/ipmi-sensors"){ $IPMI='/usr/sbin/ipmi-sensors'; }
unless($IPMI){
$IPMI = `which ipmi-sensors 2>/dev/null|sed 's/.*no ipmi-sensors//'`;
#$IPMI = `echo -n \$(which ipmi-sensors)`;
}
chomp($IPMI);
unless($IPMI){ exit 1; }
if ($ARGV[0] && $ARGV[0] eq "autoconf"){
if (-f $IPMI){
print "yes\n";
}else{
print "no ($IPMI does not exist)\n";
exit(1);
}
}else{
my $cmd = "$IPMI --verbose --sensors=\"\$(echo \$($IPMI |grep FAN|sed 's/:.*//'))\"";
#if ($ARGV[0] eq 'cmd'){ print $cmd; exit;};
my @result = `$cmd`;
my (%val, $index);
$index=0;
my $count=0;
#Four of these seem to be unlabled, I'm going to guess that they are the CPU(s) and HDD(s)
my @unknown = ('HDD0','HDD1','CPU0','CPU1');
foreach my $line (@result) {
$line =~ s/\s+/ /g;
$line =~ s/\s$//g;
if(!$line || $line eq ""){
$index++;
next;
}
my ($key, $val) = split(/\: /, $line);
unless($key){
# $index++;
# next;
}
if($key eq 'Sensor Name'){
if($val eq 'Temp'){
$val = $unknown[$count];
$count++;
}
#my @data = split / /, $val;
#$data[2]=~s/^\(//;
#$data[2]=~s/\)$//;
#my($warn,$crit) = split/\//, $data[2];
$val{$index}{'Probe Name'} = "$val";
}elsif($key eq 'Upper Critical Threshold'){
$val=~s/ .*$//;
next unless $val=~m/^\d+\.\d+$/;
$val{$index}{'Critical Threshold'} = "$val";
}elsif($key eq 'Normal Max.'){
$val=~s/ .*//;
$val{$index}{'Warning Threshold'} = $val;
}elsif($key eq 'Sensor Reading'){
$val=~s/ .*//;
$val{$index}{'Reading'} = $val;
}elsif($key eq 'Sensor Max. Reading' && !$val{$index}{'Critical Threshold'}){
$val=~s/ .*$//;
$val{$index}{'Critical Threshold'} = "$val";
}
}
if ($ARGV[0] && $ARGV[0] eq "config") {
print "graph_title IPMI - Fan Speeds\n";
print "graph_args --base 1000 -l 0\n";
print "graph_vlabel Speed in RPM\n";
print "graph_category Sensors\n";
foreach my $j (sort keys %val) {
print "probe_$j\.label $val{$j}{'Probe Name'}\n";
print "probe_$j\.warning $val{$j}{'Warning Threshold'}\n";
print "probe_$j\.critical $val{$j}{'Critical Threshold'}\n";
}
}else{
foreach my $j (sort keys %val) {
if($val{$j}{'Reading'}){
print "probe_$j.value $val{$j}{'Reading'}\n";
}
}
}
}
exit(0);

View File

@ -1,153 +0,0 @@
#!/usr/bin/perl -w
#
# IPMI data gathering for munin.
#
# Author: 2008 Benjamin Pineau <ben.pineau@gmail.com>
# This work is hereby released into the Public Domain.
# To view a copy of the public domain dedication, visit
# http://creativecommons.org/licenses/publicdomain/
#
# Requirements :
#
# - ipmitool command line utility (and kernel drivers)
# - access rights to /dev/ipmi0 device (ie, root privileges
# can be configured in /etc/munin/plugin-conf.d/munin-node)
#
# Parameters supported:
#
# config
# autoconf
#
# Setup :
#
# ipmitool sdr || echo "please load IPMI kernel modules"
# cp ipmi_sdr_ /usr/share/munin/plugins/
# chmod +x /usr/share/munin/plugins/ipmi_sdr_
# ln -s /usr/share/munin/plugins/ipmi_sdr_ /etc/munin/plugins/ipmi_sdr_fan
# ln -s /usr/share/munin/plugins/ipmi_sdr_ /etc/munin/plugins/ipmi_sdr_current
# ln -s /usr/share/munin/plugins/ipmi_sdr_ /etc/munin/plugins/ipmi_sdr_voltage
# ln -s /usr/share/munin/plugins/ipmi_sdr_ /etc/munin/plugins/ipmi_sdr_temperature
# echo -e "\n[ipmi_sdr*]\nuser root\ntimeout 15\n" >> /etc/munin/plugin-conf.d/munin-node
# /etc/init.d/munin-node restart
#
# Magic markers
#%# family=auto
#%# capabilities=autoconf
use strict;
use warnings;
$ENV{'LANG'} = 'C';
$ENV{'LC_ALL'} = 'C';
my $ipmidump = $ENV{'ipmidump'} || '/var/lib/munin/plugin-state/ipmi_sdr';
my $ipmitool = $ENV{'ipmitool'} || 'ipmitool';
my $drefresh = $ENV{'drefresh'} || 86400;
my %sensors;
my $desc = {
'fan' => {
'graph_title' => 'Fans rotations per minute',
'graph_vlabel' => 'RPM',
'graph_info' => 'Fans rotations per minute',
},
'voltage' => {
'graph_title' => 'Electrical tensions',
'graph_vlabel' => 'Volts',
'graph_info' => 'Electrical tensions',
},
'temperature' => {
'graph_title' => 'Hardware temperatures',
'graph_vlabel' => 'Degrees Celsius',
'graph_info' => 'Hardware temperature sensors output',
},
'current' => {
'graph_title' => 'Hardware power consumption',
'graph_vlabel' => 'Watts or Amperes',
'graph_info' => 'Hardware power consumption',
},
};
my $stype = $0 =~ /.*ipmi_sdr_(\w+)$/ ? lc($1) : 'temperature';
if (!defined($desc->{"$stype"})) {
printf STDERR "Unknown sensor type : '$stype'. Aborting.\n";
exit 1;
}
sub strip_spaces($) {
(my $s = shift) =~ s/^\s*(.*?)\s*\n?$/$1/;
return $s;
}
sub normalize_name($) {
(my $l = lc(strip_spaces(shift))) =~ tr/\t ./_/;
return $l;
}
sub sdrlist_parse(@) {
foreach(@_) {
next unless /^([^\|]+)\s*\|\s*(\w+)\s*\|[^\|]+\|[^\|]+\|\s*([\d\.]+)\s+/;
$sensors{$_}{"name"} = strip_spaces($1);
$sensors{$_}{"value"} = strip_spaces($3);
$sensors{$_}{"label"} = normalize_name($1) . normalize_name($2);
}
}
if (defined $ARGV[0] and $ARGV[0] eq 'autoconf') {
`$ipmitool help 2> /dev/null`;
if ($?) {
print "no ($ipmitool not found)";
exit 1;
}
`$ipmitool sdr dump $ipmidump`;
if ($?) {
printf "no (ipmitool sdr dump returned code %d)\n", $? >> 8;
exit 1;
}
`$ipmitool sdr type $stype -S $ipmidump`;
if ($?) {
print "no (ipmitool didn't found any sensor of type ";
printf "'$stype', returned code %d)\n", $? >> 8;
exit 1;
}
print "yes\n";
exit 0;
}
# "ipmitool dump" dumps speeds up data retreival big time, by avoiding
# IPMI sensors autodiscovery. This only caches sensors names/types/ids
# (not values/datas), so we can have a very long cache lifetime policy.
if (-f $ipmidump) {
unlink($ipmidump) if (time - (stat($ipmidump))[9] >= $drefresh);
}
unless (-f $ipmidump) {
`$ipmitool sdr dump $ipmidump` || die $!;
}
(my @dt = `$ipmitool sdr type $stype -S $ipmidump`) || die $!;
sdrlist_parse(@dt);
if (defined($ARGV[0]) && $ARGV[0] eq "config") {
print "graph_category system\n";
print "graph_title " . $desc->{$stype}->{"graph_title"} . "\n";
print "graph_vlabel " . $desc->{$stype}->{"graph_vlabel"} . "\n";
print "graph_info " . $desc->{$stype}->{"graph_info"} . "\n";
foreach my $v (values(%sensors)) {
print $v->{"label"} . ".label " . $v->{"name"} . "\n";
print $v->{"label"} . ".type GAUGE\n";
}
exit 0;
}
foreach my $v (values(%sensors)) {
print $v->{"label"} . ".value " . $v->{"value"} . "\n";
}

View File

@ -1,103 +0,0 @@
#! /usr/bin/perl -w
#
# This plugin will graph the chassis temp sensors on a Dell PowerEdge Server
# via the ipmi-sensors tool. It has been tested on the following chassis:
#
# PE1850
#
# To enable:
#
# ln -s /usr/share/munin/plugins/ipmi-therm /etc/munin/plugins/ipmi-therm
#
# Configuration parameters for /etc/munin/plugin-conf.d/munin-node
#
# [ipmi_therm]
# user - User that has permissions to run ipmi-sensors
# env.category sensors
#
# Parameters:
#
# config
# autoconf
#
# Author: Alexx Roche <munin-ipmi-plugin@alexx.net>
# Built on the work of Justin Shepherd <galstrom21@gmail.com>
# Revision: 1.3 2011/01/10
#
#%# family=auto
#%# capabilities=autoconf
use strict;
my $IPMI;
if(-f "/usr/sbin/ipmi-sensors"){ $IPMI='/usr/sbin/ipmi-sensors'; }
unless($IPMI){
$IPMI = `which ipmi-sensors 2>/dev/null|sed 's/.*no ipmi-sensors//'`;
#$IPMI = `echo -n \$(which ipmi-sensors)`;
}
chomp($IPMI);
unless($IPMI){ exit 1; }
if ($ARGV[0] && $ARGV[0] eq "autoconf"){
if (-f $IPMI){
print "yes\n";
}else{
print "no ($IPMI does not exist)\n";
exit(1);
}
}else{
my $cmd = "$IPMI|grep Temp";
my @result = `$cmd`;
my (%val, $index);
$index=0;
my $count=0;
#Four of these seem to be unlabled, I'm going to guess that they are the CPU(s) and HDD(s)
my @unknown = ('CPU0','CPU1','HDD0','HDD1');
foreach my $line (@result) {
$line =~ s/\s+/ /g;
$line =~ s/\s$//g;
next if ($line eq "");
my ($list, $field, $value, $state) = split(/\: /, $line);
#print "L: $list F: $field V: $value S: $state\n";
if($field=~m/^(Temp|Ambient|Planar|Riser)/) {
my $f=$1;
if($f eq 'Temp'){
$f = $unknown[$count];
$count++;
}
my @data = split / /, $value;
$data[2]=~s/^\(//;
$data[2]=~s/\)$//;
if($f){
my($warn,$crit) = split/\//, $data[2];
unless($warn=~m/\d+/){ $warn = 0; }
unless($crit=~m/\d+/){ $crit = 200; }
$val{$index}{'Probe Name'} = "$f";
$val{$index}{'Reading'} = "$data[0]";
$val{$index}{'Warning Threshold'} = ($crit - $warn);
$val{$index}{'Critical Threshold'} = "$crit";
$index++;
}
}
}
if ($ARGV[0] && $ARGV[0] eq "config") {
print "graph_title IPMI sensors - Temperature Probes\n";
print "graph_args --base 1000 -l 0\n";
print "graph_vlabel Temperature in Celsius\n";
print "graph_category Sensors\n";
foreach my $j (sort keys %val) {
print "probe_$j\.label $val{$j}{'Probe Name'}\n";
print "probe_$j\.warning $val{$j}{'Warning Threshold'}\n";
print "probe_$j\.critical $val{$j}{'Critical Threshold'}\n";
}
}else{
foreach my $j (sort keys %val) {
if($val{$j}{'Reading'}){
print "probe_$j.value $val{$j}{'Reading'}\n";
}
}
}
}
exit(0);

View File

@ -1,865 +0,0 @@
#!/usr/bin/perl -w
#
# ipmisens3
# Munin plugin to read IPMI sensor data
# Zoltan HERPAI (c) 2009 <wigyori@uid0.hu>
#
# Symlink this script into your /etc/munin/plugins directory in the
# following way:
#
# ipmisens2_[machine]_[sensors]
#
# Supported machines:
# - Asus K8N-LR: asmb2 (temp, volt, fan)
# - Dell DCS-XS23: xs23 (temp, volt, fan)
# - Dell M610 blade: m610 (temp)
# - Dell PowerEdge 2650: pe2650 (temp, volt, fan)
# - Fujitsu TX120: tx120 (temp, volt, fan)
# - HP Proliant ML350G5: proliantg5 (temp)
# - HP Proliant DL380G5: proliantg5 (temp)
# - HP Proliant DL385G1: hpasmcli (temp, fan)
# - IBM HS21/HS22/Dataplex DX360: ibmhsxx (volt)
# - IBM LS20/LS21: ibmlsxx (temp, volt)
# - IBM LS41: ibmls4x (temp, volt)
# - IBM x3200/x3550: ibmx3xx0 (temp, volt, fan)
# - IBM x346: x346 (temp, volt, fan)
# - Intel SHG2 mainboard: shg2 (temp, volt, fan)
# - Sun x2100/2100m2/2200/2200m2: x2100 (temp, volt, fan)
# - Sun x2250: x2250 (temp, volt, fan)
# - Sun x2270: x2270 (temp, volt, fan)
# - Sun x4100/4100m2/4200/4200m2/4600: x4x00 (temp, volt, fan)
# - Sun x4150: x4150 (temp, volt, fan)
# - Sun V20z (V40z?): v20z (temp, volt, fan)
# - Supermicro X7DB8/X7DCL: aocipmi20e (temp, volt, fan)
# - Supermicro X8DT6/X8DTT-F: hermon (temp, volt, fan)
# - Verari VB1205XM: vb1205 (temp, volt)
#
# Supported but not tested:
# - HP DL145G2: asmb2 (temp, volt, fan)
#
# Notes:
# - hpasmcli machtype requires HP's hpasmcli package, and the additional
# hpasmcliget script.
#
# Outputs submitted by:
# - Zoltan LAJBER <lajbi@lajli.gau.hu>
# - Gergely MADARASZ <gorgo@broadband.hu>
# - Louis van Belle <louis@van-belle.nl>
# - Andras GOT <andrej@antiszoc.hu>
# - Andras KORN <korn@chardonnay.math.bme.hu>
# - Tamas TEVESZ <ice@extreme.hu>
# - Gergely TOMKA <gergely@tomka.hu>
# - Gabor SZOLLOSI <dev@localnet.hu>
# - Reka KAROLYI <reka@karolyi.eu>
# - Andras HORVATH <Andras.Horvath@cern.ch>
#
# CHANGELOG
#
# Revision 3.01 2010/09/23 Zoltan HERPAI <wigyori@uid0.hu>
# * Add support for handling non-ipmitool-based machtypes
# * Add support for HP Proliant DL385G1
#
# Revision 3.00 2010/05/25 Zoltan HERPAI <wigyori@uid0.hu>
# * Add support for Supermicro X7DB8 via AOC IPMI20-E (aocipmi20e)
# * Add support for Supermicro X7DCL via AOC IPMI20-E (aocipmi20e)
# * Add support for Supermicro X8DT6 via Winbond Hermon BMC (hermon)
# * Add support for Supermicro X8DTT-F via Winbond Hermon BMC (hermon)
# * Add support for Dell M610 (m610)
# * Add support for HP DL380G5 (proliantg5)
# * Add support for HP ML350G5 (proliantg5)
# * Re-add support for Asus K8N-LR via ASMB2 (asmb2)
# * Add to-be-tested support for HP DL145G2 as per Paulo@muninexchange (asmb2)
#
# Revision 3.00early4 2010/01/09 Zoltan HERPAI <wigyori@uid0.hu>
# * Add support for IBM HS22 (ibmhsxx)
# * Add support for IBM iDataplex DX360 (ibmhsxx)
# * Add support for Dell DCS XS23-sc (xs23)
#
# Revision 3.00early3 2009/12/30 Zoltan HERPAI <wigyori@uid0.hu>
# * Support for easier debugging ($debug)
# * Add support for IBM LS41 (ibmls4x)
# * Add complete support for Sun x2270 (x2270)
# * Add support for Sun x4500 (x4x00)
# * Add support for Fujitsu-Siemens TX120 (tx120)
#
# Revision 3.00early2 2009/09/09 Zoltan HERPAI <wigyori@uid0.hu>
# * Minor bugfix due to munin brain damage
#
# Revision 3.00early 2009/09/01 Zoltan HERPAI <wigyori@uid0.hu>
# * Complete rewrite in perl.
# * Sun x2100, x2100M2 and x2200 are now supported in 'x2100' machtype
# * Bunch of new machtypes are supported
#
use strict;
use warnings;
use POSIX;
use FindBin qw($Script);
my $IPMITOOL = '/usr/bin/ipmitool';
my $curtime = time();
my $TEMPFILE = "/var/lib/munin/plugin-state/ipmisens3";
# set the ipmidump expiration to 1 day
my $TEMPREFRESH = 86400;
my $debug = 0;
my $devel = 0;
##############
# You should not need to edit anything below here
#
$ENV{PATH} = '/bin:/usr/bin:/usr/sbin';
$ENV{IFS} = "\n";
$0 =~ /.*_(.*)_(.*)/;
my $machine = $1;
my $sensor = $2;
# Test if ipmitool is available
if ( !$devel )
{
if ( $machine ne 'hpasmcli' ) {
`$IPMITOOL help 2> /dev/null`;
if ($?)
{
print "no ($IPMITOOL not found)";
exit 1;
}
}
}
print "Machine: $machine , sensor: $sensor\n" if ($debug);
# check expiration time of the dumpfile
if ( !$devel )
{
if ( $machine ne 'hpasmcli' ) {
if ( -f $TEMPFILE && $curtime - (stat($TEMPFILE))[9] >= $TEMPREFRESH )
{
print "Unlinking $TEMPFILE...\n" if ($debug);
unlink ($TEMPFILE);
}
}
}
if ( !$devel )
{
if ( $machine ne 'hpasmcli' ) {
if ( ! -f $TEMPFILE )
{
print "Writing dumpfile $TEMPFILE...\n" if ($debug);
`$IPMITOOL sdr dump $TEMPFILE` || die $!;
if ($?)
{
print "no (retcode $?)\n";
exit 2;
}
}
}
}
my @ipmioutput;
# Read the sensors
if ( $machine ne 'hpasmcli' ) {
@ipmioutput = `$IPMITOOL sdr -S $TEMPFILE`;
}
else {
@ipmioutput = `cat /tmp/ipmi-sensors`;
}
#my @ipmioutput = `cat ~wigyori/ipmisens2/outputs/hp_ml350g5`;
if ($?)
{
print "no (retcode $?)\n";
exit 3;
}
my $arg;
if ( defined($ARGV[0]) && $ARGV[0] ne "" )
{
print "argv: ".$ARGV[0]."\n" if ($debug);
if ( $ARGV[0] eq 'config' ) { $arg = 'config'; }
if ( $ARGV[0] eq 'autoconf' ) { $arg = 'autoconf'; }
if ( $arg eq 'autoconf' ) { print "no\n"; exit 0; }
my %cnf;
if ( $arg eq 'config' )
{
# Base sensor config
if ( $sensor eq 'temp' )
{
%cnf = (
'graph_title' => 'Temperature',
'graph_vlabel' => 'C',
'graph_category' => 'sensors',
);
}
if ( $sensor eq 'volt' )
{
%cnf = (
'graph_title' => 'Voltages',
'graph_vlabel' => 'Volts',
'graph_category' => 'sensors',
);
}
if ( $sensor eq 'fan' )
{
if ( $machine ne 'hpasmcli' ) {
%cnf = (
'graph_title' => 'Fan speeds',
'graph_vlabel' => 'RPM',
'graph_category' => 'sensors',
);
}
else {
%cnf = (
'graph_title' => 'Fan speeds',
'graph_vlabel' => '%',
'graph_category' => 'sensors',
);
}
}
# Static descriptors
my %base;
# Sun x4100
$base{'x4x00'}->{'mbt_amb'} = 'Mainboard';
$base{'x4x00'}->{'fpt_amb'} = 'FP';
$base{'x4x00'}->{'pdbt_amb'} = 'PSU';
$base{'x4x00'}->{'iot_amb'} = 'Disks';
$base{'x4x00'}->{'p0t_core'} = 'CPU0';
$base{'x4x00'}->{'p1t_core'} = 'CPU1';
$base{'x4x00'}->{'ft0fm0f0'} = 'ft0.fm0.f0';
$base{'x4x00'}->{'ft0fm1f0'} = 'ft0.fm1.f0';
$base{'x4x00'}->{'ft0fm2f0'} = 'ft0.fm2.f0';
$base{'x4x00'}->{'ft0fm0f1'} = 'ft0.fm0.f1';
$base{'x4x00'}->{'ft0fm1f1'} = 'ft0.fm1.f1';
$base{'x4x00'}->{'ft0fm2f1'} = 'ft0.fm2.f1';
$base{'x4x00'}->{'ft1fm0f0'} = 'ft1.fm0.f0';
$base{'x4x00'}->{'ft1fm1f0'} = 'ft1.fm1.f0';
$base{'x4x00'}->{'ft1fm2f0'} = 'ft1.fm2.f0';
$base{'x4x00'}->{'ft1fm0f1'} = 'ft1.fm0.f1';
$base{'x4x00'}->{'ft1fm1f1'} = 'ft1.fm1.f1';
$base{'x4x00'}->{'ft1fm2f1'} = 'ft1.fm2.f1';
$base{'x4x00'}->{'mbv_bat'} = 'BAT';
$base{'x4x00'}->{'mbv_3v3stby'} = '3.3VSTBY';
$base{'x4x00'}->{'mbv_3v3'} = '3.3V';
$base{'x4x00'}->{'mbv_5v'} = '5V';
$base{'x4x00'}->{'mbv_12v'} = '+12V';
$base{'x4x00'}->{'mbv_dash12v'} = '-12V';
$base{'x4x00'}->{'mbv_2v5core'} = 'MB 2.5V';
$base{'x4x00'}->{'mbv_1v8core'} = 'MB 1.8V';
$base{'x4x00'}->{'mbv_1v2core'} = 'MB 1.2V';
$base{'x4x00'}->{'p0v_1v5'} = 'CPU0 1.5V';
$base{'x4x00'}->{'p0v_2v5core'} = 'CPU0 2.5V';
$base{'x4x00'}->{'p0v_1v25core'} = 'CPU0 1.25V';
$base{'x4x00'}->{'p1v_1v5'} = 'CPU1 1.5V';
$base{'x4x00'}->{'p1v_2v5core'} = 'CPU1 2.5V';
$base{'x4x00'}->{'p1v_1v25core'} = 'CPU1 1.25V';
# Sun x4100m2 extents
$base{'x4x00'}->{'mbv_1v5core'} = 'MB 1.5V';
$base{'x4x00'}->{'p0v_vddio'} = 'CPU0 VDDIO';
$base{'x4x00'}->{'p0v_vdd'} = 'CPU0 VDD';
$base{'x4x00'}->{'p0v_vtt'} = 'CPU0 VTT';
$base{'x4x00'}->{'p1v_vddio'} = 'CPU1 VDDIO';
$base{'x4x00'}->{'p1v_vdd'} = 'CPU1 VDD';
$base{'x4x00'}->{'p1v_vtt'} = 'CPU1 VTT';
# Sun x4600 voltage extents
$base{'x4x00'}->{'mbv_1v2'} = 'MB +1.2V';
$base{'x4x00'}->{'mbv_1v5'} = 'MB +1.5V';
$base{'x4x00'}->{'mbv_2v5'} = 'MB +2.5V';
$base{'x4x00'}->{'mbv_3v3aux_r'} = 'MB +3.3VAUX';
$base{'x4x00'}->{'p0v_12v'} = 'CPU0 module +12V';
$base{'x4x00'}->{'p1v_12v'} = 'CPU1 module +12V';
$base{'x4x00'}->{'p2v_12v'} = 'CPU2 module +12V';
$base{'x4x00'}->{'p3v_12v'} = 'CPU3 module +12V';
$base{'x4x00'}->{'p4v_12v'} = 'CPU4 module +12V';
$base{'x4x00'}->{'p5v_12v'} = 'CPU5 module +12V';
$base{'x4x00'}->{'p6v_12v'} = 'CPU6 module +12V';
$base{'x4x00'}->{'p7v_12v'} = 'CPU7 module +12V';
$base{'x4x00'}->{'p0v_2v5'} = 'CPU0 module +2.5V';
$base{'x4x00'}->{'p1v_2v5'} = 'CPU1 module +2.5V';
$base{'x4x00'}->{'p2v_2v5'} = 'CPU2 module +2.5V';
$base{'x4x00'}->{'p3v_2v5'} = 'CPU3 module +2.5V';
$base{'x4x00'}->{'p4v_2v5'} = 'CPU4 module +2.5V';
$base{'x4x00'}->{'p5v_2v5'} = 'CPU5 module +2.5V';
$base{'x4x00'}->{'p6v_2v5'} = 'CPU6 module +2.5V';
$base{'x4x00'}->{'p7v_2v5'} = 'CPU7 module +2.5V';
$base{'x4x00'}->{'p0v_1v2'} = 'CPU0 module +1.2V';
$base{'x4x00'}->{'p1v_1v2'} = 'CPU1 module +1.2V';
$base{'x4x00'}->{'p2v_1v2'} = 'CPU2 module +1.2V';
$base{'x4x00'}->{'p3v_1v2'} = 'CPU3 module +1.2V';
$base{'x4x00'}->{'p4v_1v2'} = 'CPU4 module +1.2V';
$base{'x4x00'}->{'p5v_1v2'} = 'CPU5 module +1.2V';
$base{'x4x00'}->{'p6v_1v2'} = 'CPU6 module +1.2V';
$base{'x4x00'}->{'p7v_1v2'} = 'CPU7 module +1.2V';
$base{'x4x00'}->{'p0v_3v3aux_r'} = 'CPU0 module +3.3VAUX';
$base{'x4x00'}->{'p1v_3v3aux_r'} = 'CPU1 module +3.3VAUX';
$base{'x4x00'}->{'p2v_3v3aux_r'} = 'CPU2 module +3.3VAUX';
$base{'x4x00'}->{'p3v_3v3aux_r'} = 'CPU3 module +3.3VAUX';
$base{'x4x00'}->{'p4v_3v3aux_r'} = 'CPU4 module +3.3VAUX';
$base{'x4x00'}->{'p5v_3v3aux_r'} = 'CPU5 module +3.3VAUX';
$base{'x4x00'}->{'p6v_3v3aux_r'} = 'CPU6 module +3.3VAUX';
$base{'x4x00'}->{'p7v_3v3aux_r'} = 'CPU7 module +3.3VAUX';
$base{'x4x00'}->{'p0v_3v3led'} = 'CPU0 module +3.3V LED';
$base{'x4x00'}->{'p1v_3v3led'} = 'CPU1 module +3.3V LED';
$base{'x4x00'}->{'p2v_3v3led'} = 'CPU2 module +3.3V LED';
$base{'x4x00'}->{'p3v_3v3led'} = 'CPU3 module +3.3V LED';
$base{'x4x00'}->{'p4v_3v3led'} = 'CPU4 module +3.3V LED';
$base{'x4x00'}->{'p5v_3v3led'} = 'CPU5 module +3.3V LED';
$base{'x4x00'}->{'p6v_3v3led'} = 'CPU6 module +3.3V LED';
$base{'x4x00'}->{'p7v_3v3led'} = 'CPU7 module +3.3V LED';
$base{'x4x00'}->{'p2v_1v25core'} = 'CPU2 1.25V';
$base{'x4x00'}->{'p3v_1v25core'} = 'CPU3 1.25V';
$base{'x4x00'}->{'p4v_1v25core'} = 'CPU4 1.25V';
$base{'x4x00'}->{'p5v_1v25core'} = 'CPU5 1.25V';
$base{'x4x00'}->{'p6v_1v25core'} = 'CPU6 1.25V';
$base{'x4x00'}->{'p7v_1v25core'} = 'CPU7 1.25V';
$base{'x4x00'}->{'p0v_core'} = 'CPU0 Vcore';
$base{'x4x00'}->{'p1v_core'} = 'CPU1 Vcore';
$base{'x4x00'}->{'p2v_core'} = 'CPU2 Vcore';
$base{'x4x00'}->{'p3v_core'} = 'CPU3 Vcore';
$base{'x4x00'}->{'p4v_core'} = 'CPU4 Vcore';
$base{'x4x00'}->{'p5v_core'} = 'CPU5 Vcore';
$base{'x4x00'}->{'p6v_core'} = 'CPU6 Vcore';
$base{'x4x00'}->{'p7v_core'} = 'CPU7 Vcore';
# Sun x4600 temp extents
$base{'x4x00'}->{'p2t_core'} = 'CPU2';
$base{'x4x00'}->{'p3t_core'} = 'CPU3';
$base{'x4x00'}->{'p4t_core'} = 'CPU4';
$base{'x4x00'}->{'p5t_core'} = 'CPU5';
$base{'x4x00'}->{'p6t_core'} = 'CPU6';
$base{'x4x00'}->{'p7t_core'} = 'CPU7';
$base{'x4x00'}->{'p0t_amb'} = 'CPU0 module';
$base{'x4x00'}->{'p1t_amb'} = 'CPU1 module';
$base{'x4x00'}->{'p2t_amb'} = 'CPU2 module';
$base{'x4x00'}->{'p3t_amb'} = 'CPU3 module';
$base{'x4x00'}->{'p4t_amb'} = 'CPU4 module';
$base{'x4x00'}->{'p5t_amb'} = 'CPU5 module';
$base{'x4x00'}->{'p6t_amb'} = 'CPU6 module';
$base{'x4x00'}->{'p7t_amb'} = 'CPU7 module';
$base{'x4x00'}->{'mbt_amb0'} = 'System board 0';
$base{'x4x00'}->{'mbt_amb1'} = 'System board 1';
$base{'x4x00'}->{'mbt_amb2'} = 'System board 2';
# Sun x4500 voltage extents
$base{'x4x00'}->{'procp0v_1v25'} = 'CPU0 1.25V';
$base{'x4x00'}->{'procp1v_1v25'} = 'CPU1 1.25V';
$base{'x4x00'}->{'procp0v_1v5'} = 'CPU0 1.5V';
$base{'x4x00'}->{'procp1v_1v5'} = 'CPU1 1.5V';
$base{'x4x00'}->{'procp0v_2v5'} = 'CPU0 2.5V';
$base{'x4x00'}->{'procp1v_2v5'} = 'CPU1 2.5V';
$base{'x4x00'}->{'procv_1v8'} = 'CPU 1.8V';
$base{'x4x00'}->{'iov_1v5'} = 'IO 1.5V';
$base{'x4x00'}->{'iov_2v5'} = 'IO 2.5V';
$base{'x4x00'}->{'iov_5v_disk'} = 'IO 5V disk';
$base{'x4x00'}->{'iov_dash12v'} = 'IO -12V';
# Sun x4500 temp extents
$base{'x4x00'}->{'iofrontt_amb'} = 'IO front';
$base{'x4x00'}->{'ioreart_amb'} = 'IO rear';
$base{'x4x00'}->{'procfrontt_amb'} = 'CPU front';
$base{'x4x00'}->{'procreart_amb'} = 'CPU rear';
$base{'x4x00'}->{'procp0t_core'} = 'CPU0 temp';
$base{'x4x00'}->{'procp1t_core'} = 'CPU1 temp';
$base{'x4x00'}->{'dbpt_amb'} = 'DBP';
# Sun V20z (V40z?)
$base{'v20z'}->{'ambient'} = 'System';
$base{'v20z'}->{'cpu0die'} = 'CPU0 die';
$base{'v20z'}->{'cpu0mem'} = 'CPU0 mem';
$base{'v20z'}->{'cpu1die'} = 'CPU1 die';
$base{'v20z'}->{'cpu1mem'} = 'CPU1 mem';
$base{'v20z'}->{'gbeth'} = 'GBNIC';
$base{'v20z'}->{'hddbp'} = 'HDD backplane';
$base{'v20z'}->{'sp'} = 'Service CPU';
# Sun x2100
$base{'x2100'}->{'cpucorevoltage'} = 'CPU core';
$base{'x2100'}->{'batteryvolt'} = 'VBAT';
$base{'x2100'}->{'ddr26v'} = 'DDR 2.6V';
$base{'x2100'}->{'vcc33v'} = '+3.3V';
$base{'x2100'}->{'vcc5v'} = '+5V';
$base{'x2100'}->{'vcc12v'} = '+12V';
$base{'x2100'}->{'cputemp'} = 'CPU';
$base{'x2100'}->{'system'} = 'System';
# Sun x2100M2 extents
$base{'x2100'}->{'ddrp118v'} = 'DDR P1 1.8V';
$base{'x2100'}->{'vcc33vstb'} = '+3.3VSTBY';
$base{'x2100'}->{'ambienttemp'} = 'System';
# Sun x2200 extents
$base{'x2100'}->{'ddrp018v'} = 'DDR P0 1.8V';
$base{'x2100'}->{'ambienttemp0'} = 'System temp 0';
$base{'x2100'}->{'ambienttemp1'} = 'System temp 1';
$base{'x2100'}->{'cpu0temp'} = 'CPU0 temp';
$base{'x2100'}->{'cpu1temp'} = 'CPU1 temp';
# Intel SHG2
$base{'shg2'}->{'baseboard12v'} = 'MB 12V';
$base{'shg2'}->{'baseboard15v'} = 'MB 1.5V';
$base{'shg2'}->{'baseboard25v'} = 'MB 2.5V';
$base{'shg2'}->{'baseboard33v'} = 'MB 3.3V';
$base{'shg2'}->{'baseboard33vsb'} = '3.3VSTBY';
$base{'shg2'}->{'baseboard5v'} = 'MB 5V';
$base{'shg2'}->{'baseboarddash12v'} = 'MB -12V';
$base{'shg2'}->{'batteryvoltage'} = 'VBAT';
$base{'shg2'}->{'processorvrm'} = 'VRM';
# IBM x346
$base{'x346'}->{'125vsense'} = '+1.25V';
$base{'x346'}->{'12vasense'} = '+12V A';
$base{'x346'}->{'12vbsense'} = '+12V B';
$base{'x346'}->{'12vcsense'} = '+12V C';
$base{'x346'}->{'13vsense'} = '+1.3V';
$base{'x346'}->{'15vsense'} = '+1.5V';
$base{'x346'}->{'18vsense'} = '+1.8V';
$base{'x346'}->{'25vsense'} = '+2.5V';
$base{'x346'}->{'5vsense'} = '+5V';
$base{'x346'}->{'cpu1vcore'} = 'CPU1 Vcore';
$base{'x346'}->{'cpu2vcore'} = 'CPU2 Vcore';
$base{'x346'}->{'cpuvtt'} = 'CPU VTT';
$base{'x346'}->{'dash12vsense'} = '-12V';
$base{'x346'}->{'vbat'} = 'VBAT';
$base{'x346'}->{'cpu1'} = 'CPU1';
$base{'x346'}->{'cpu2'} = 'CPU2';
$base{'x346'}->{'dasd'} = 'DASD';
$base{'x346'}->{'ambient'} = 'System';
# Sun x2250
$base{'x2250'}->{'3v3_stby'} = '3.3VSTBY';
$base{'x2250'}->{'3v3'} = '+3.3V';
$base{'x2250'}->{'5v'} = '+5V';
$base{'x2250'}->{'12v'} = '+12V';
$base{'x2250'}->{'1v5'} = '+1.5V';
$base{'x2250'}->{'1v8'} = '+1.8V';
$base{'x2250'}->{'0v9'} = '+0.9V';
$base{'x2250'}->{'vtt'} = 'VTT';
$base{'x2250'}->{'1v5_esb'} = 'ESB +1.5V';
$base{'x2250'}->{'1v2_nic'} = 'NIC +1.2V';
$base{'x2250'}->{'1v8_nic'} = 'NIC +1.8V';
$base{'x2250'}->{'1v5_fbd'} = 'FBDIMM +1.5V';
# Sun x2270
$base{'x2270'}->{'3v3_stby'} = '3.3VSTBY';
$base{'x2270'}->{'3v3'} = '+3.3V';
$base{'x2270'}->{'5v'} = '+5V';
$base{'x2270'}->{'12v'} = '+12V';
$base{'x2270'}->{'3v3_vbat'} = '3.3VBAT';
$base{'x2270'}->{'1v5'} = '+1.5V';
$base{'x2270'}->{'p0_1v5_ddr'} = 'DDR P0 +1.5V';
$base{'x2270'}->{'p1_1v5_ddr'} = 'DDR P1 +1.5V';
$base{'x2270'}->{'p0_1v8'} = 'P0 +1.8V';
$base{'x2270'}->{'p1_1v8'} = 'P1 +1.8V';
$base{'x2270'}->{'p0_vtt'} = 'P0 VTT';
$base{'x2270'}->{'p1_vtt'} = 'P1 VTT';
$base{'x2270'}->{'p0_vccp'} = 'P0 VCCp';
$base{'x2270'}->{'p1_vccp'} = 'P1 VCCp';
# Sun x4150
$base{'x4150'}->{'mb_t_amb0'} = 'MB Sensor 0';
$base{'x4150'}->{'mb_t_amb1'} = 'MB Sensor 1';
$base{'x4150'}->{'mb_t_amb2'} = 'MB Sensor 2';
$base{'x4150'}->{'mb_t_amb3'} = 'MB Sensor 3';
$base{'x4150'}->{'ps0_t_amb'} = 'PS 1 temp';
$base{'x4150'}->{'ps1_t_amb'} = 'PS 2 temp';
$base{'x4150'}->{'t_amb'} = 'System';
$base{'x4150'}->{'ps0_f0'} = 'PS 1 fan';
$base{'x4150'}->{'ps1_f0'} = 'PS 2 fan';
$base{'x4150'}->{'mb_p0_v_vcc'} = 'CPU0 VCC';
$base{'x4150'}->{'mb_p1_v_vcc'} = 'CPU1 VCC';
$base{'x4150'}->{'mb_v_12v'} = '+12V';
$base{'x4150'}->{'mb_v_1v5'} = '+1.5V';
$base{'x4150'}->{'mb_v_1v8'} = '+1.8V';
$base{'x4150'}->{'mb_v_2v5stby'} = '+2.5VSTBY';
$base{'x4150'}->{'mb_v_3v3'} = '+3.3V';
$base{'x4150'}->{'mb_v_3v3stby'} = '+3.3VSTBY';
$base{'x4150'}->{'mb_v_5v'} = '+5V';
$base{'x4150'}->{'mb_v_nic'} = 'NIC';
$base{'x4150'}->{'mb_v_vtt'} = 'VTT';
$base{'x4150'}->{'ps0_v_in'} = 'PS 1 voltage in';
$base{'x4150'}->{'ps0_v_out'} = 'PS 1 voltage out';
$base{'x4150'}->{'ps1_v_in'} = 'PS 2 voltage in';
$base{'x4150'}->{'ps1_v_out'} = 'PS 2 voltage out';
# Verari VB1205XM
$base{'vb1205'}->{'12v'} = '+12V';
$base{'vb1205'}->{'1_2v'} = '+1.2V';
$base{'vb1205'}->{'1_5v'} = '+1.5V';
$base{'vb1205'}->{'3_3v'} = '+3.3V';
$base{'vb1205'}->{'5v'} = '+5V';
$base{'vb1205'}->{'5vsb'} = '+5VSTBY';
$base{'vb1205'}->{'cpu1vcore'} = 'CPU1 Vcore';
$base{'vb1205'}->{'cpu2vcore'} = 'CPU2 Vcore';
$base{'vb1205'}->{'dash12v'} = '-12V';
$base{'vb1205'}->{'vbat'} = 'VBAT';
$base{'vb1205'}->{'cputemp1'} = 'CPU 1 temp';
$base{'vb1205'}->{'cputemp2'} = 'CPU 2 temp';
$base{'vb1205'}->{'systemp'} = 'System';
# Dell PowerEdge 2650
$base{'pe2650'}->{'esmmbfan1'} = 'Fan 1';
$base{'pe2650'}->{'esmmbfan2'} = 'Fan 2';
$base{'pe2650'}->{'esmmbfan3'} = 'Fan 3';
$base{'pe2650'}->{'esmmbfan4'} = 'Fan 4';
$base{'pe2650'}->{'esmmbfan5'} = 'Fan 5';
$base{'pe2650'}->{'esmmbfan6'} = 'Fan 6';
$base{'pe2650'}->{'esmmbfan7'} = 'Fan 7';
$base{'pe2650'}->{'esmmb12'} = 'MB +12V';
$base{'pe2650'}->{'esmmb25'} = 'MB +2.5V';
$base{'pe2650'}->{'esmmb33'} = 'MB +3.3V';
$base{'pe2650'}->{'esmmb5'} = 'MB +5V';
$base{'pe2650'}->{'esmmbbat'} = 'VBAT';
$base{'pe2650'}->{'esmmbdash12'} = 'MB -12V';
$base{'pe2650'}->{'esmrombpk'} = 'ROMB PK';
$base{'pe2650'}->{'esmvtt'} = 'VTT';
$base{'pe2650'}->{'esmcpu'} = 'CPU';
$base{'pe2650'}->{'esm5aux'} = '5V AUX';
$base{'pe2650'}->{'esmcpu1'} = 'CPU1';
$base{'pe2650'}->{'esmcpu2'} = 'CPU2';
$base{'pe2650'}->{'esmfrti_o'} = 'Front I/O';
$base{'pe2650'}->{'esmriser'} = 'Riser';
# IBM x3200
$base{'ibmx3xx0'}->{'planar12v'} = '+12V';
$base{'ibmx3xx0'}->{'planar15v'} = '+1.5V';
$base{'ibmx3xx0'}->{'planar18v'} = '+1.8V';
$base{'ibmx3xx0'}->{'planar33v'} = '+3.3V';
$base{'ibmx3xx0'}->{'planar5v'} = '+5V';
$base{'ibmx3xx0'}->{'cpuvcore'} = 'CPU Vcore';
$base{'ibmx3xx0'}->{'cpuvtt'} = 'VTT';
$base{'ibmx3xx0'}->{'ambient'} = 'System';
$base{'ibmx3xx0'}->{'cpu'} = 'CPU';
# IBM x3550 extents
$base{'ibmx3xx0'}->{'planarvbat'} = 'VBAT';
# IBM LS41
$base{'ibmlsxx'}->{'12vsense'} = '+12V';
$base{'ibmlsxx'}->{'3_3vsense'} = '+3.3V';
$base{'ibmlsxx'}->{'5vsense'} = '+5V';
$base{'ibmlsxx'}->{'planarvbat'} = 'VBAT';
# IBM LS20 extents
$base{'ibmlsxx'}->{'1_8vsense'} = '+1.8V';
$base{'ibmlsxx'}->{'1_8vsbsense'} = '+1.8VSB';
$base{'ibmlsxx'}->{'12vsbsense'} = '+12VSB';
$base{'ibmlsxx'}->{'12v_isense'} = '+12V_I';
# IBM HS21
$base{'ibmhsxx'}->{'planar0_9v'} = '+0.9V';
$base{'ibmhsxx'}->{'planar12v'} = '+12V';
$base{'ibmhsxx'}->{'planar3_3v'} = '+3.3V';
$base{'ibmhsxx'}->{'planar5v'} = '+5V';
$base{'ibmhsxx'}->{'planarvbat'} = 'VBAT';
# IBM iDataplex DX320 extents
$base{'ibmhsxx'}->{'cpu1vcore'} = 'CPU1 Vcore';
$base{'ibmhsxx'}->{'cpu2vcore'} = 'CPU2 Vcore';
# Fujitsu-Siemens TX120
$base{'tx120'}->{'12v'} = '12V';
$base{'tx120'}->{'15v'} = '1.5V';
$base{'tx120'}->{'18v'} = '1.8V';
$base{'tx120'}->{'33v'} = '3.3V';
$base{'tx120'}->{'5v'} = '5V';
$base{'tx120'}->{'dash12v'} = '-12V';
$base{'tx120'}->{'stdby33v'} = '3.3VSTBY';
$base{'tx120'}->{'vtt'} = 'VTT';
$base{'tx120'}->{'battery3v'} = '3VBAT';
$base{'tx120'}->{'fanpsu'} = 'Fan PSU';
$base{'tx120'}->{'fan1sys'} = 'Fan Sys 1';
$base{'tx120'}->{'fan2sys'} = 'Fan Sys 2';
$base{'tx120'}->{'fancpu'} = 'Fan CPU';
$base{'tx120'}->{'ambient'} = 'Ambient';
$base{'tx120'}->{'systemboard'} = 'System board';
$base{'tx120'}->{'cpu'} = 'CPU';
# Dell DCS XS23-sc
$base{'xs23'}->{'systemfan'} = 'System fan';
$base{'xs23'}->{'cpu0'} = 'CPU 0';
$base{'xs23'}->{'cpu1'} = 'CPU 1';
$base{'xs23'}->{'midplane'} = 'Midplane';
$base{'xs23'}->{'p12v'} = 'Planar 12V';
$base{'xs23'}->{'p15v'} = 'Planar 1.5V';
$base{'xs23'}->{'p18v'} = 'Planar 1.8V';
$base{'xs23'}->{'p33v'} = 'Planar 3.3V';
$base{'xs23'}->{'p5v'} = 'Planar 5V';
$base{'xs23'}->{'vtt'} = 'Vtt';
$base{'xs23'}->{'vcc33vaux'} = 'Vcc 3.3V AUX';
# Supermicro X8DT6 / X8DTT-F via Winbond Hermon BMC
$base{'hermon'}->{'fan1'} = 'Fan 1';
$base{'hermon'}->{'fan2'} = 'Fan 2';
$base{'hermon'}->{'fan3'} = 'Fan 3';
$base{'hermon'}->{'fan4'} = 'Fan 4';
$base{'hermon'}->{'fan5'} = 'Fan 5';
$base{'hermon'}->{'fan6'} = 'Fan 6';
$base{'hermon'}->{'fan7'} = 'Fan 7';
$base{'hermon'}->{'fan8'} = 'Fan 8';
$base{'hermon'}->{'system'} = 'System';
$base{'hermon'}->{'cpu1temp'} = 'CPU1 temp';
$base{'hermon'}->{'cpu2temp'} = 'CPU2 temp';
$base{'hermon'}->{'12v'} = '+12V';
$base{'hermon'}->{'15v'} = '+1.5V';
$base{'hermon'}->{'33v'} = '+3.3V';
$base{'hermon'}->{'33vsb'} = '+3.3VSB';
$base{'hermon'}->{'5v'} = '+5V';
$base{'hermon'}->{'vbat'} = 'VBAT';
$base{'hermon'}->{'cpu1dimm'} = 'CPU1 DIMM';
$base{'hermon'}->{'cpu2dimm'} = 'CPU2 DIMM';
$base{'hermon'}->{'cpu1vcore'} = 'CPU1 Vcore';
$base{'hermon'}->{'cpu2vcore'} = 'CPU2 Vcore';
# Most of these are similar on the Supermicro X* boards
$base{'aocipmi20e'} = $base{'hermon'};
$base{'aocipmi20e'}->{'dash12v'} = '-12V';
$base{'aocipmi20e'}->{'5vsb'} = '+5VSB';
$base{'aocipmi20e'}->{'fan7_cpu1'} = 'Fan7 / CPU1';
$base{'aocipmi20e'}->{'fan8_cpu2'} = 'Fan8 / CPU2';
$base{'aocipmi20e'}->{'sys'} = 'System';
# Asus K8N-LR / HP DL145G2
$base{'asmb2'}->{'cpufan1'} = 'CPU Fan 1';
$base{'asmb2'}->{'cpufan2'} = 'CPU Fan 2';
$base{'asmb2'}->{'frontfan1'} = 'Front Fan 1';
$base{'asmb2'}->{'frontfan2'} = 'Front Fan 2';
$base{'asmb2'}->{'rearfan1'} = 'Rear Fan 1';
$base{'asmb2'}->{'rearfan2'} = 'Rear Fan 2';
$base{'asmb2'}->{'cpu1thermal'} = 'CPU1';
$base{'asmb2'}->{'systemthermal'} = 'System';
$base{'asmb2'}->{'25vor18v'} = '+2.5V / +1.8V';
$base{'asmb2'}->{'bat_cmos'} = 'VBAT';
$base{'asmb2'}->{'cpuvcore1'} = 'CPU1 Vcore';
$base{'asmb2'}->{'system12v'} = '+12V';
$base{'asmb2'}->{'system15v'} = '+1.5V';
$base{'asmb2'}->{'system5v'} = '+5V';
$base{'asmb2'}->{'system3v'} = '+3V';
$base{'asmb2'}->{'system5vsb'} = '+5VSTBY';
# Dell M610 blade
$base{'m610'}->{'ambienttemp'} = 'Ambient temp';
$base{'m610'}->{'temp'} = 'Blade temp';
# hpasmcli / Proliant DL385G1
$base{'hpasmcli'}->{'cpu-1'} = 'CPU 1';
$base{'hpasmcli'}->{'cpu-2'} = 'CPU 2';
$base{'hpasmcli'}->{'i_o_zone'} = 'I/O zone';
$base{'hpasmcli'}->{'power_supply_bay'} = 'PSU bay';
$base{'hpasmcli'}->{'processor_zone'} = 'CPU zone';
# Machine config, run through the file/output
my $label; my $tmp;
foreach my $line ( @ipmioutput )
{
$line =~ s/\s+/ /g;
if ( $sensor eq 'fan' && $line =~ /.*RPM.*ok/ )
{
if ( $machine eq 'x4x00' ) { $line =~ /(.*)\.speed.*/; $label = $1; }
if ( $machine eq 'v20z' ) { $line =~ /(.*)\.tach.*/; $label = $1; }
if ( $machine eq 'x2100') { $line =~ s/(.*)\s+\|.*RPM.*/\L$1/; $label = $line; }
if ( $machine eq 'x346' ) { $line =~ /(.*) Tach.*/; $label = $1; }
if ( $machine eq 'shg2' ) { $line =~ s/(.*)\s+\|.*RPM.*\|\s+ok/$1/; $label = $1; }
if ( $machine eq 'x2250' ) { $line =~ /(.*)\/TACH.*RPM.*/; $label = $1; }
if ( $machine eq 'x2270' ) { $line =~ /(.*)\/TACH.*RPM.*/; $label = $1; }
if ( $machine eq 'x4150' ) { $line =~ /(.*)\/TACH.*RPM.*/; $label = $1; }
if ( $machine eq 'pe2650' ) { $line =~ /(.*) RPM\s+\|.*RPM.*/; $label = $1; }
if ( $machine eq 'ibmx3xx0' ) { $line =~ /(.*) Tach.*/; $label = $1; }
if ( $machine eq 'tx120' ) { $line =~ /(.*)\s+\|.*RPM.*\|\s+ok/; $label = $1; }
if ( $machine eq 'xs23' ) { $line =~ /(.*)\s+\|.*RPM.*\|\s+ok/; $label = $1; }
if ( $machine eq 'hermon' ) { $line =~ /(.*)\s+\|.*RPM.*\|\s+ok/; $label = $1; }
if ( $machine eq 'aocipmi20e' ) { $line =~ /(.*)\s+\|.*RPM.*\|\s+ok/; $label = $1; }
if ( $machine eq 'asmb2' ) { $line =~ /(.*)\s+\|.*RPM.*\|\s+ok/; $label = $1; }
}
elsif ( $sensor eq 'fan' && $line =~ /\#\d+\s+\S+\s+Yes.*\%/ ) {
if ( $machine eq 'hpasmcli' ) { $line =~ /\#(\d+)\s+(.*)\s+Yes.*\%.*/; $label = "$2_$1"; }
}
if ( $sensor eq 'temp' && $line =~ /.*degree.*ok/ )
{
if ( $machine eq 'x4x00' ) { $line =~ /(.*)\ \|.*deg.*/; $label = $1; }
if ( $machine eq 'v20z' ) { $line =~ /(.*)temp.*/; $label = $1; }
if ( $machine eq 'x2100') { $line =~ s/(.*)\s+\|.*deg.*/\L$1/; $label = $line; }
if ( $machine eq 'x346' ) { $line =~ /(.*) Temp.*/; $label = $1; }
if ( $machine eq 'ibmls4x' ) { $line =~ /(.*) TEMP.*/; $label = $1; }
if ( $machine eq 'shg2' ) { $line =~ /(.*)\s+\|.*deg.*/; $label = $1; }
if ( $machine eq 'x2250' ) { $line =~ /MB\/T\_(.*)\s+\|.*deg.*/; $label = $1; }
if ( $machine eq 'x2270' ) { $line =~ /MB\/T\_(.*)\s+\|.*deg.*/; $label = $1; }
if ( $machine eq 'x4150' ) { $line =~ /(.*)\s+\|.*deg.*/; $label = $1; }
if ( $machine eq 'vb1205' ) { $line =~ /(.*)\s+\|.*deg.*/; $label = $1; }
if ( $machine eq 'pe2650' ) { $line =~ /(.*) Temp.*/; $label = $1; }
if ( $machine eq 'ibmx3xx0' ) { $line =~ /(.*) Temp.*/; $label = $1; }
if ( $machine eq 'ibmlsxx' ) { $line =~ /(.*) TEMP.*/; $label = $1; }
if ( $machine eq 'tx120' ) { $line =~ /(.*)\ \|.*deg.*/; $label = $1; }
if ( $machine eq 'xs23' ) { $line =~ /(.*)\ Temp\s+|.*deg.*/; $label = $1; }
if ( $machine eq 'hermon' ) { $line =~ /(.*)\ Temp\s+|.*deg.*/; $label = $1; }
if ( $machine eq 'aocipmi20e' ) { $line =~ /(.*)\ Temp\s+|.*deg.*/; $label = $1; }
if ( $machine eq 'asmb2' ) { $line =~ /(.*)\s+\|.*deg.*/; $label = $1; }
if ( $machine eq 'm610' ) { $line =~ /(.*)\s+\|.*deg.*/; $label = $1; }
if ( $machine eq 'proliantg5' ) { $line =~ /(.*)\s+\|.*deg.*/; $label = $1; }
}
elsif ( $sensor eq 'temp' && $line =~ /\d+C\/\d+F/ ) {
if ( $machine eq 'hpasmcli' ) { $line =~ /.*\s+(.*)\s+\d+C\/\d+F\s+\d+C\/\d+F/; $label = $1; }
}
if ( $sensor eq 'volt' && $line =~ /.*Volts.*/ )
{
if ( $machine eq 'x4x00' ) { $line =~ /(.*)\ \|.*Volts.*/; $label = $1; }
if ( $machine eq 'v20z' ) { $line =~ /(.*)\ \|.*Volts.*/; $label = $1; }
if ( $machine eq 'x2100') { $line =~ s/(.*)\s+\|.*Volts.*/\L$1/; $label = $line; }
if ( $machine eq 'x346' ) { $line =~ /(.*)\s+\|.*Volts.*/; $label = $1; }
if ( $machine eq 'ibmls4x' ) { $line =~ /(.*)\s+\|.*Volts.*/; $label = $1; }
if ( $machine eq 'shg2' ) { $line =~ /(.*)\s+\|.*Volts.*/; $label = $1; }
if ( $machine eq 'x2250' ) { $line =~ /MB\/V\_(.*)\s+\|.*Volts.*/; $label = $1; }
if ( $machine eq 'x2270' ) { $line =~ /MB\/(.*)\s+\|.*Volts.*/; $label = $1; }
if ( $machine eq 'x4150' ) { $line =~ /(.*)\s+\|\s+.*Volts.*/; $label = $1; }
if ( $machine eq 'vb1205' ) { $line =~ /(.*)\s+\|\s+.*Volts.*/; $label = $1; $label =~ s/\./_/g; }
if ( $machine eq 'pe2650' ) { $line =~ /(.*) Volt\s+\|.*Volts.*/; $label = $1; }
if ( $machine eq 'ibmx3xx0' ) { $line =~ /(.*)\s+\|\s+.*Volts.*/; $label = $1; }
if ( $machine eq 'ibmlsxx' ) { $line =~ /(.*)\s+\|\s+.*Volts.*/; $label = $1; $label =~ s/\./_/g; }
if ( $machine eq 'ibmhsxx' ) { $line =~ /(.*)\s+\|\s+.*Volts.*/; $label = $1; $label =~ s/\./_/g; }
if ( $machine eq 'tx120' ) { $line =~ /(.*)\ \|.*Volts.*/; $label = $1; }
if ( $machine eq 'xs23' ) { $line =~ /(.*)\s+\|.*Volts.*/; $label = $1; }
if ( $machine eq 'hermon' ) { $line =~ /(.*)\s+\|\s+.*Volts.*/; $label = $1; }
if ( $machine eq 'aocipmi20e' ) { $line =~ /(.*)\s+\|\s+.*Volts.*/; $label = $1; }
if ( $machine eq 'asmb2' ) { $line =~ /(.*)\s+\|\s+.*Volts.*/; $label = $1; }
}
if ( $label )
{
$label =~ s/\.//g;
$label =~ s/\-/dash/g;
$label =~ s/\+//;
$label =~ s/\s+//g;
$label =~ s/(.*)/\L$1/;
$label =~ s/\//_/g;
$label =~ s/\#/_/g;
# Random fixups
if ( $machine eq 'x2270' ) { $label =~ s/v_//; }
if ( $machine eq 'x4x00' ) { $label =~ s/^sysv\_/mbv\_/; }
if ( $machine eq 'tx120' ) { $label =~ s/main//; }
if ( $base{$machine}->{$label} )
{
$cnf{ $label. '.label' } = $base{$machine}->{$label};
}
else
{
$cnf{ $label. '.label' } = $label;
}
}
undef ($label);
}
foreach my $key ( sort(keys(%cnf)) )
{
print "$key $cnf{$key}\n";
}
}
exit 0;
}
my %res; my $label; my $value;
foreach my $line ( @ipmioutput )
{
$line =~ s/\s+/ /g;
if ( $sensor eq 'fan' && $line =~ /.*RPM.*ok/ )
{
if ( $machine eq 'x4x00' ) { $line =~ /(.*)\.speed\s+\|\s+(\d+) RPM.*/; $label = $1; $value = $2; }
if ( $machine eq 'v20z' ) { $line =~ /(.*)\.tach\s+\|\s+(\d+) RPM.*/; $label = $1; $value = $2; }
if ( $machine eq 'x2100' ) { $line =~ s/(.*)\s+\|\s+(\S+) RPM.*/\L$1/; $label = $line; $value = $2; }
if ( $machine eq 'x346' ) { $line =~ /(.*) Tach\s+\| (\d+) RPM.*/; $label = $1; $value = $2; }
if ( $machine eq 'shg2' ) { $line =~ /(.*)\s+\|\s+(.*) RPM.*\|.*ok/; $label = $1; $value = $2; }
if ( $machine eq 'x2250' ) { $line =~ /(.*)\/TACH\s+\|\s+(.*) RPM.*/; $label = $1; $value = $2; }
if ( $machine eq 'x2270' ) { $line =~ /(.*)\/TACH\s+\|\s+(.*) RPM.*/; $label = $1; $value = $2; }
if ( $machine eq 'x4150' ) { $line =~ /(.*)\/TACH\s+\|\s+(\S+) RPM.*/; $label = $1; $value = $2; }
if ( $machine eq 'pe2650' ) { $line =~ /(.*) RPM\s+\|\s+(\S+) RPM.*/; $label = $1; $value = $2; }
if ( $machine eq 'ibmx3xx0' ) { $line =~ /(.*) Tach\s+\|\s+(\S+) RPM.*/; $label = $1; $value = $2; }
if ( $machine eq 'tx120' ) { $line =~ /(.*)\s+\|\s+(.*) RPM.*\|\s+ok/; $label = $1; $value = $2; }
if ( $machine eq 'xs23' ) { $line =~ /(.*)\s+\|\s+(.*) RPM.*\|\s+ok/; $label = $1; $value = $2; }
if ( $machine eq 'hermon' ) { $line =~ /(.*)\s+\|\s+(.*) RPM.*\|\s+ok/; $label = $1; $value = $2; }
if ( $machine eq 'aocipmi20e' ) { $line =~ /(.*)\s+\|\s+(.*) RPM.*\|\s+ok/; $label = $1; $value = $2; }
if ( $machine eq 'asmb2' ) { $line =~ /(.*)\s+\|\s+(.*) RPM.*\|\s+ok/; $label = $1; $value = $2; }
}
elsif ( $sensor eq 'fan' && $line =~ /\#\d+\s+\S+\s+Yes.*\%/ ) {
if ( $machine eq 'hpasmcli' ) { $line =~ /\#(\d+)\s+(.*)\s+Yes\s+\w+\s+(\d+)\%.*/; $label = "$2_$1"; $value = $3; }
}
if ( $sensor eq 'temp' && $line =~ /.*degree.*ok/ )
{
if ( $machine eq 'x4x00' ) { $line =~ /(.*)\s+\|\s+(\S+)\ deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'v20z' ) { $line =~ /(.*)temp\s+\|\s+(\S+)\ deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'x2100' ) { $line =~ s/(.*)\s+\|\s+(\d+) deg.*/\L$1/; $label = $line; $value = $2; }
if ( $machine eq 'x346' ) { $line =~ /(.*) Temp\s+\|\s+(\d+) deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'ibmls4x' ) { $line =~ /(.*) TEMP\s+\|\s+(\d+) deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'shg2' ) { $line =~ /(.*)\s+\|\s+(\d+) deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'x2250' ) { $line =~ /MB\/T\_(.*)\s+\|\s+(\d+) deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'x2270' ) { $line =~ /MB\/T\_(.*)\s+\|\s+(\d+) deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'x4150' ) { $line =~ /(.*)\s+\|\s+(\S+) deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'vb1205' ) { $line =~ /(.*)\s+\|\s+(\S+) deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'pe2650' ) { $line =~ /(.*) Temp\s+\|\s+(\S+) deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'ibmx3xx0' ) { $line =~ /(.*) Temp\s+\|\s+(\S+) deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'ibmlsxx' ) { $line =~ /(.*) TEMP\s+\|\s+(\S+) deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'tx120' ) { $line =~ /(.*)\s+\|\s+(\S+)\ deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'xs23' ) { $line =~ /(.*)\ Temp\s+\|\s+(\S+)\ deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'hermon' ) { $line =~ /(.*)\ Temp\s+\|\s+(\S+)\ deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'aocipmi20e' ) { $line =~ /(.*)\ Temp\s+\|\s+(\S+)\ deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'asmb2' ) { $line =~ /(.*)\s+\|\s+(\S+)\ deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'm610' ) { $line =~ /(.*)\s+\|\s+(\S+)\ deg.*/; $label = $1; $value = $2; }
if ( $machine eq 'proliantg5' ) { $line =~ /(.*)\s+\|\s+(\S+)\ deg.*/; $label = $1; $value = $2; }
}
elsif ( $sensor eq 'temp' && $line =~ /\d+C\/\d+F/ ) {
if ( $machine eq 'hpasmcli' ) { $line =~ /.*\s+(.*)\s+(\d+)C\/\d+F\s+\d+C\/\d+F/; $label = $1; $value = $2; }
}
if ( $sensor eq 'volt' && $line =~ /.*Volt.*ok/ )
{
if ( $machine eq 'x4x00' ) { $line =~ /(.*)\ \|\s+(\S+)\ Volt.*/; $label = $1; $value = $2; }
if ( $machine eq 'v20z' ) { $line =~ /(.*)\s+\|\s+(\S+)\ Volt.*/; $label = $1; $value = $2; }
if ( $machine eq 'x2100' ) { $line =~ s/(.*)\s+\|\s+(\S+)\ Volt.*/\L$1/; $label = $line; $value = $2; }
if ( $machine eq 'x346' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
if ( $machine eq 'ibmls4x' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
if ( $machine eq 'shg2' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
if ( $machine eq 'x2250' ) { $line =~ /MB\/V\_(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
if ( $machine eq 'x2270' ) { $line =~ /MB\/(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
if ( $machine eq 'x4150' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
if ( $machine eq 'vb1205' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; $label =~ s/\./_/g; }
if ( $machine eq 'pe2650' ) { $line =~ /(.*) Volt\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
if ( $machine eq 'ibmx3xx0' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
if ( $machine eq 'ibmlsxx' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; $label =~ s/\./_/g; }
if ( $machine eq 'ibmhsxx' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; $label =~ s/\./_/g; }
if ( $machine eq 'tx120' ) { $line =~ /(.*)\ \|\s+(\S+)\ Volt.*/; $label = $1; $value = $2; }
if ( $machine eq 'xs23' ) { $line =~ /(.*)\ \|\s+(\S+)\ Volt.*/; $label = $1; $value = $2; }
if ( $machine eq 'hermon' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
if ( $machine eq 'aocipmi20e' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
if ( $machine eq 'asmb2' ) { $line =~ /(.*)\s+\|\s+(\S+) Volts.*/; $label = $1; $value = $2; }
}
if ( $label )
{
$label =~ s/\.//g;
$label =~ s/\-/dash/g;
$label =~ s/\+//;
$label =~ s/\s+//g;
$label =~ s/(.*)/\L$1/;
$label =~ s/\//_/g;
$label =~ s/\#/_/g;
# Random fixups
if ( $machine eq 'x2270' ) { $label =~ s/v_//; }
if ( $machine eq 'x4x00' ) { $label =~ s/^sysv\_/mbv\_/; }
if ( $machine eq 'tx120' ) { $label =~ s/main//; }
$res{$label} = $value;
}
undef ($label);
}
my $key;
foreach $key ( sort(keys(%res)) )
{
print "$key.value ".$res{$key}."\n";
}

Binary file not shown.

View File

@ -1,461 +0,0 @@
#!/usr/bin/perl -w
#
# Wildcard plugin to monitor sensor by using ipmitool sensor program.
#
# Contributed by Jun Futagawa
# This script is based on sensors_ plugin.
#
# Usage:
# ln -s /usr/share/munin/plugins/ipmitool_sensor_ /etc/munin/plugins/ipmitool_sensor_fan
# ln -s /usr/share/munin/plugins/ipmitool_sensor_ /etc/munin/plugins/ipmitool_sensor_temp
# ln -s /usr/share/munin/plugins/ipmitool_sensor_ /etc/munin/plugins/ipmitool_sensor_volt
#
# Requirements:
# - OpenIPMI tool (ipmitool command)
#
# Note:
# - Sensor names are read from the output of the ipmitool sensor program.
#
# Add the following to your /etc/munin/plugin-conf.d/munin-node:
#
# [ipmitool_sensor*]
# user root
# timeout 20
#
# If you want to use "ipmitool sdr", add the following:
# Note: When you use this, the threshold provided by the sensor board is not used.
#
# [ipmitool_sensor*]
# user root
# timeout 20
# env.ipmitool_options sdr
#
# Parameters supported:
#
# config
# autoconf
# suggest
#
# Configurable variables
#
# ipmitool - ipmitool command (default: ipmitool)
# ipmitool_options - ipmitool command options (default: sensor)
# sdr: you can use 'sdr' instead of sensor.
# cache_file - cache file
# (default: /var/lib/munin/plugin-state/plugin-ipmitool_sensor.cache)
# cache_expires - cache expires (default: 275)
#
# fan_type_regex - Regular expression for unit of fan (default: RPM)
# temp_type_regex - Regular expression for unit of temp (default: degrees C)
# volt_type_regex - Regular expression for unit of volt (default: (Volts|Watts|Amps))
#
# fan_warn_percent - Percentage over mininum for warning (default: 5)
# fan_lower_critical - Preferred lower critical value for fan
# fan_upper_critical - Preferred upper critical value for fan
# temp_lower_critical - Preferred lower critical value for temp
# temp_lower_warning - Preferred lower warining value for temp
# temp_upper_warning - Preferred upper warning value for temp
# temp_upper_critical - Preferred upper critical value for temp
# volt_warn_percent - Percentage over mininum/under maximum for warning
# Narrow the voltage bracket by this. (default: 20)
#
# $Log$
# Revision 1.6 2011/02/07 12:50:00 jfut
# Bug fix: Check temp_upper_warning and temp_upper_critical was not working again.
#
# Revision 1.5 2011/01/28 00:39:00 jfut
# Bug fix: Check temp_upper_warning and temp_upper_critical was not working.
#
# Revision 1.4 2009/02/08 23:51:00 jfut
# Support "ipmitool sdr".
# Add Watts and Amp as voltage unit.
# Add fan_type_regex/temp_type_regex/volt_type_regex as option of sensor type.
#
# Revision 1.3 2008/11/11 13:55:00 jfut
# Add infinity value check for HP ProLiant DL160.
# Add preferred value option for fan and temp.
#
# Revision 1.2 2008/10/28 19:21:22 jfut
# Add file check.
#
# Revision 1.1 2008/10/27 18:52:31 jfut
# Add cache mechanism.
#
# Revision 1.0 2008/10/27 14:25:12 jfut
# Initial release.
#
# Magic markers:
#%# family=manual
#%# capabilities=autoconf suggest
use strict;
$ENV{'LANG'} = "C"; # Force parseable output from sensors.
$ENV{'LC_ALL'} = "C"; # Force parseable output from sensors.
my $IPMITOOL = $ENV{'ipmitool'} || 'ipmitool';
my @IPMITOOL_OPTS = exists $ENV{'ipmitool_options'} ? split(/\s+/, $ENV{'ipmitool_options'}) : ('sensor');
my $CACHE_DIR = "/var/lib/munin/plugin-state";
my $CACHE_FILE = $ENV{'cache_file'} || "$CACHE_DIR/plugin-ipmitool_sensor.cache";
my $CACHE_EXPIRES = $ENV{'cache_expires'} || 275;
my %config = (
fan => {
regex => exists $ENV{'fan_type_regex'} ? qr/$ENV{'fan_type_regex'}/im : qr/RPM/im,
title => 'IPMITool Sensor: Fans',
vtitle => 'RPM',
print_threshold => \&fan_threshold,
graph_args => '--base 1000 -l 0'
},
temp => {
regex => exists $ENV{'temp_type_regex'} ? qr/$ENV{'temp_type_regex'}/im : qr/degrees C/im,
title => 'IPMITool Sensor: Temperatures',
vtitle => 'Celsius',
print_threshold => \&temp_threshold,
graph_args => '--base 1000 -l 0'
},
volt => {
regex => exists $ENV{'volt_type_regex'} ? qr/$ENV{'volt_type_regex'}/im : qr/(Volts|Watts|Amps)/im,
title => 'IPMITool Sensor: Voltages',
vtitle => '_AUTO_DETECT_FAILED_',
print_threshold => \&volt_threshold,
graph_args => '--base 1000'
},
);
if (defined $ARGV[0] and $ARGV[0] eq 'autoconf') {
close(STDERR);
my $ret = system($IPMITOOL);
open (STDERR, ">&STDOUT");
if ($ret == 0 || $ret == 256) {
print "yes\n";
exit 0;
} else {
print "no (program $IPMITOOL not found)\n";
}
exit 1;
}
if (defined $ARGV[0] and $ARGV[0] eq 'suggest') {
my $text = get_sensor_data();
my $alltext = join('\n', @{$text});
foreach my $func (keys %config) {
print $func, "\n" if $alltext =~ $config{$func}->{regex};
}
exit;
}
$0 =~ /ipmitool_sensor_(.+)*$/;
my $func = $1;
exit 2 unless defined $func;
my $text = get_sensor_data();
my $sensor = 1;
if (defined $ARGV[0] and $ARGV[0] eq 'config') {
# detect the unit of volt
if ($func eq 'volt') {
foreach my $line (@{$text}) {
if ($line =~ /$config{$func}->{regex}/) {
my ($label, $value, $unit, $lcr, $lnc, $unc, $ucr) = &get_sensor_items($line, $config{$func}->{regex});
$config{$func}->{vtitle} = $unit;
last;
}
}
$text = get_sensor_data();
}
# print header
print "graph_title $config{$func}->{title}\n";
print "graph_vtitle $config{$func}->{vtitle}\n";
print "graph_args $config{$func}->{graph_args}\n";
print "graph_category sensors\n";
# print data
foreach my $line (@{$text}) {
if ($line =~ /$config{$func}->{regex}/) {
my ($label, $value, $unit, $lcr, $lnc, $unc, $ucr) = &get_sensor_items($line, $config{$func}->{regex});
if (&is_valid_value($value)) {
print "$func$sensor.label $label\n";
$config{$func}->{print_threshold}->($func.$sensor, $lcr, $lnc, $unc, $ucr);
print "$func$sensor.graph no\n" if exists $ENV{"ignore_$func$sensor"};
$sensor++;
}
}
}
exit 0;
}
foreach my $line (@{$text}) {
if ($line =~ /$config{$func}->{regex}/) {
my ($label, $value, $unit, $lcr, $lnc, $unc, $ucr) = &get_sensor_items($line, $config{$func}->{regex});
# for debug
# print "$func$sensor.value [$label] [$value] [$lcr] [$lnc] [$unc] [$ucr]\n";
if (&is_valid_value($value)) {
print "$func$sensor.value $value\n";
$sensor++;
}
}
}
sub get_sensor_data {
my $text = undef;
if (-f $CACHE_FILE) {
my $cache_timestamp = (stat($CACHE_FILE))[9];
if ($CACHE_EXPIRES == -1 || time - $cache_timestamp <= $CACHE_EXPIRES) {
open(IN, "<", $CACHE_FILE) or die "Could not open \"$CACHE_FILE\" for reading\n";
while (<IN>) {
push (@{$text}, $_);
}
close(IN);
}
}
if (! defined $text) {
my $pid = open(EXE, '-|');
if ($pid == 0) {
exec($IPMITOOL, @IPMITOOL_OPTS);
} elsif (defined $pid) {
while(<EXE>) {
push (@{$text}, $_);
}
close(EXE);
} else {
die "fork failed: $!";
}
if (-w $CACHE_DIR) {
open(OUT, ">", $CACHE_FILE) or die "Could not open \"$CACHE_FILE\" for writing\n";
foreach my $line (@{$text}) {
print OUT "$line";
}
close OUT;
}
}
return $text;
}
sub get_sensor_items {
my ($line, $regex) = @_;
my @items = split(/\s*\|\s*/, $line);
my ($label, $value, $unit, $lcr, $lnc, $unc, $ucr)
= (trim($items[0]), trim($items[1]), trim($items[2]), trim($items[5]), trim($items[6]), trim($items[7]), trim($items[8]));
if ($#items == 9) {
# ipmitool sensor
} elsif ($#items == 2) {
# ipmitool sdr
if ($value =~ /$regex/) {
$value = trim($`);
$unit = trim($1);
}
}
# some boards show data in incorrect order.
# - HP ProLiant ML110 G5
# CPU FAN | 1434.309 | RPM | ok | 5537.099 | 4960.317 | 4859.086 | na | 937.383 | na
# SYSTEM FAN | 1506.932 | RPM | ok | 5952.381 | 5668.934 | 5411.255 | na | 937.383 | na
# - HP ProLiant DL160
# FAN1 ROTOR1 | 7680.492 | RPM | ok | na | inf | na | na | 1000.400 | na
if (&is_valid_value($lcr) && &is_valid_value($ucr) && $lcr > $ucr || $lcr eq 'inf') {
($lcr, $lnc, $unc, $ucr) = ($ucr, $unc, $lnc, $lcr);
}
if (&is_valid_value($lnc) && &is_valid_value($unc) && $lnc > $unc || $lnc eq 'inf') {
($lcr, $lnc, $unc, $ucr) = ($ucr, $unc, $lnc, $lcr);
}
return ($label, $value, $unit, $lcr, $lnc, $unc, $ucr);
}
sub fan_threshold {
my ($name, $lcr, $lnc, $unc, $ucr) = @_;
my $warn_percent = exists $ENV{fan_warn_percent} ? $ENV{fan_warn_percent} : 5;
# lcr: lower critical
if (exists $ENV{fan_lower_critical}) {
$lcr = $ENV{fan_lower_critical};
} elsif (! &is_valid_value($lcr)) {
if ($lcr eq 'inf') { $lcr = ''; }
else { $lcr = '50'; }
}
# lnc: lower warning
if (! &is_valid_value($lnc)) {
if ($lnc eq 'inf') { $lnc = ''; }
else { $lnc = ($lcr eq '') ? '' : $lcr * (100 + $warn_percent) / 100; }
}
# ucr: upper critical
if (exists $ENV{fan_upper_critical}) {
$ucr = $ENV{fan_upper_critical};
} elsif (! &is_valid_value($ucr)) {
if ($ucr eq 'inf') { $ucr = ''; }
else { $ucr = '6000'; }
}
# unc: upper warning
if (! &is_valid_value($unc)) {
if ($unc eq 'inf') { $unc = ''; }
else { $unc = ($ucr eq '') ? '' : $ucr * (100 - $warn_percent) / 100; }
}
return unless ($lcr ne '' || $lnc ne '' || $unc ne '' || $ucr ne '');
printf "$name.warning $lnc:$unc\n";
printf "$name.critical $lcr:$ucr\n";
}
sub temp_threshold {
my ($name, $lcr, $lnc, $unc, $ucr) = @_;
# lcr: lower critical
if (exists $ENV{temp_lower_critical}) {
$lcr = $ENV{temp_lower_critical};
} elsif (! &is_valid_value($lcr)) {
if ($lcr eq 'inf') { $lcr = ''; }
else { $lcr = 5; }
}
# lnc: lower warning
if (exists $ENV{temp_lower_warning}) {
$lnc = $ENV{temp_lower_warning};
} elsif (! &is_valid_value($lnc)) {
if ($lnc eq 'inf') { $lnc = ''; }
else { $lnc = 10; }
}
# unc: upper warning
if (exists $ENV{temp_upper_warning}) {
$unc = $ENV{temp_upper_warning};
} elsif (! &is_valid_value($unc)) {
if ($unc eq 'inf') { $unc = ''; }
else { $unc = '65'; }
}
# ucr: upper critical
if (exists $ENV{temp_upper_critical}) {
$ucr = $ENV{temp_upper_critical};
} elsif (! &is_valid_value($ucr)) {
if ($ucr eq 'inf') { $ucr = ''; }
else { $ucr = '70'; }
}
return unless ($lcr ne '' || $lnc ne '' || $unc ne '' || $ucr ne '');
printf "$name.warning $lnc:$unc\n";
printf "$name.critical $lcr:$ucr\n";
}
sub volt_threshold {
my ($name, $lcr, $lnc, $unc, $ucr) = @_;
my $warn_percent = exists $ENV{volt_warn_percent} ? $ENV{volt_warn_percent} : 20;
if (! &is_valid_value($lcr)) { $lcr = ''; }
if (! &is_valid_value($lnc)) { $lnc = ($lcr eq '') ? '' : $lcr * (100 + $warn_percent) / 100; }
if (! &is_valid_value($ucr)) { $ucr = ''; }
if (! &is_valid_value($unc)) { $unc = ($ucr eq '') ? '' : $ucr * (100 - $warn_percent) / 100; }
return unless ($lcr ne '' || $lnc ne '' || $unc ne '' || $ucr ne '');
printf "$name.warning $lnc:$unc\n";
printf "$name.critical $lcr:$ucr\n";
}
sub trim {
my $value = shift;
if (defined $value) {
$value =~ s/^\s*(.*?)\s*$/$1/;
} else {
$value = 'na'
}
return $value;
}
sub is_valid_value() {
my $value = shift;
if ($value eq 'na' || $value eq 'inf' || $value eq '') {
return 0;
} else {
return 1;
}
}
########################################
=head1 How to test
cache_file=ipmitool_sensor_ cache_expires=-1 ./ipmitool_sensor_volt
cache_file=ipmitool_sensor_ cache_expires=-1 ./ipmitool_sensor_volt config
cache_file=ipmitool_sensor_ cache_expires=-1 ./ipmitool_sensor_volt suggest
cache_file=ipmitool_sensor_ cache_expires=-1 ./ipmitool_sensor_volt autoconf
fan_warn_percent=50 fan_lower_critical=100 fan_upper_critical=1000 cache_file=ipmitool_sensor_ \
cache_expires=-1 ./ipmitool_sensor_fan config
temp_lower_warning=1 temp_lower_critical=2 temp_upper_critical=71 temp_upper_warning=72 \
cache_file=ipmitool_sensor_ cache_expires=-1 ./ipmitool_sensor_temp config
volt_warn_percent=50 \
cache_file=ipmitool_sensor_ cache_expires=-1 ./ipmitool_sensor_volt config
=head1 Test Data
unr Upper Non-Recoverable
ucr Upper Critical
unc Upper Non-Critical
lnc Lower Non-Critical
lcr Lower Critical
lnr Lower Non-Recoverable
=head2 ipmitool sensor
# HP ProLiant ML110 G5
CPU FAN | 1434.309 | RPM | ok | 5537.099 | 4960.317 | 4859.086 | na | 937.383 | na
SYSTEM FAN | 1497.454 | RPM | ok | 5952.381 | 5668.934 | 5411.255 | na | 937.383 | na
System 12V | 12.152 | Volts | ok | na | na | na | na | na | na
System 5V | 5.078 | Volts | ok | na | na | na | na | na | na
System 3.3V | 3.271 | Volts | ok | na | na | na | na | na | na
CPU0 Vcore | 1.127 | Volts | ok | na | na | na | na | na | na
System 1.25V | 1.254 | Volts | ok | na | na | na | na | na | na
System 1.8V | 1.842 | Volts | ok | na | na | na | na | na | na
System 1.2V | 1.107 | Volts | ok | na | na | na | na | na | na
CPU0 Diode | na | degrees C | na | na | 20.000 | 25.000 | 85.000 | 90.000 | 95.000
CPU0 Dmn 0 Temp | 24.500 | degrees C | ok | na | 0.000 | 0.000 | 97.000 | 100.000 | 100.500
CPU0 Dmn 1 Temp | 29.000 | degrees C | ok | na | 0.000 | 0.000 | 97.000 | 100.000 | 100.500
# HP ProLiant DL160
FAN1 ROTOR1 | 7680.492 | RPM | ok | na | inf | na | na | 1000.400 | na
# HP ProLiant DL360 G5
Fan Block 1 | 34.888 | unspecified | nc | na | na | 75.264 | na | na | na
Fan Block 2 | 29.792 | unspecified | nc | na | na | 75.264 | na | na | na
Fan Block 3 | 37.240 | unspecified | nc | na | na | 75.264 | na | na | na
Fan Blocks | 0.000 | unspecified | nc | na | na | 0.000 | na | na | na
Temp 1 | 40.000 | degrees C | ok | na | na | -64.000 | na | na | na
Temp 2 | 21.000 | degrees C | ok | na | na | -64.000 | na | na | na
Temp 3 | 30.000 | degrees C | ok | na | na | -64.000 | na | na | na
Temp 4 | 30.000 | degrees C | ok | na | na | -64.000 | na | na | na
Temp 5 | 28.000 | degrees C | ok | na | na | -64.000 | na | na | na
Temp 6 | na | degrees C | na | na | na | 32.000 | na | na | na
Temp 7 | na | degrees C | na | na | na | 32.000 | na | na | na
Power Meter | 214.000 | Watts | cr | na | na | 384.000 | na | na | na
Power Meter 2 | 220.000 | watts | cr | na | na | 384.000 | na | na | na
=head2 ipmitool sdr
# HP ProLiant ML110 G5
CPU FAN | 1434.31 RPM | ok
SYSTEM FAN | 1497.45 RPM | ok
System 12V | 12.10 Volts | ok
System 5V | 5.08 Volts | ok
System 3.3V | 3.27 Volts | ok
CPU0 Vcore | 1.14 Volts | ok
System 1.25V | 1.25 Volts | ok
System 1.8V | 1.84 Volts | ok
System 1.2V | 1.11 Volts | ok
CPU0 Diode | disabled | ns
CPU0 Dmn 0 Temp | 23.50 degrees C | ok
CPU0 Dmn 1 Temp | 29 degrees C | ok
# HP ProLiant DL360 G5
Fan Block 1 | 34.89 unspecifi | nc
Fan Block 2 | 29.79 unspecifi | nc
Fan Block 3 | 37.24 unspecifi | nc
Fan Blocks | 0 unspecified | nc
Temp 1 | 41 degrees C | ok
Temp 2 | 19 degrees C | ok
Temp 3 | 30 degrees C | ok
Temp 4 | 30 degrees C | ok
Temp 5 | 26 degrees C | ok
Temp 6 | disabled | ns
Temp 7 | disabled | ns
Power Meter | 208 Watts | cr
Power Meter 2 | 210 watts | cr
=cut
# vim:syntax=perl