[Comm] IPMI monitoring daemon
Денис Ягофаров
denyago на rambler.ru
Вт Июн 29 14:55:14 UTC 2010
Добрый день.
Я применяю вот такой (немножко допиленный) скрипт для nagios:
#!/usr/bin/perl
# Nagios plugin for IPMI sensors status checking.
# Especially useful on Dell Poweredge servers, and others that
# implement the Intelligent Platform Management Interface (IPMI)
# interface.
# Tested against the 1850, 1950, 2850, 2950, SC1420, PE830 BMCs
#
# (C) Chris Wilson <check_ipmi на qwirx.com>, 2005-06-04
# Released under the GNU General Public License (GPL)
# Re-written by Bill Moran <wmoran на collaborativefusion.com>
# and Brian Seklecki <bseklecki на collaborativefusion.com>
# 06/20/06
# $Id: check_ipmi.pl 192 2007-04-11 19:51:33Z seklecki $
#/*
# * Copyright (c) 2006-2007 Collaborative Fusion, Inc. All rights reserved.
# *
# * Developed by: Collaborative Fusion, Inc.
# *
http://www.collaborativefusion.com
# *
# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR
# * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# * COLLABORATIVE FUSION, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL,
# * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO,
# * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS;
# * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# */
#
#/*
# * This code was written under funding by Collaborative Fusion, Inc..
# */
# Strategy:
# Take a hostname (or IP) on the command line argv[1]
# e.g. check_ipmi.pl 10.1.1.1
# Look for a file in directory that matches the name
# i.e. ipmi_credentials_${1/hostname}
#
# Format of said file would be the username/password to use (syntax as
passed
# on the command line of ipmitool(1) ) : $ "-U username -P password"
# NOTE: If not found, look for a generic "ipmi_credientials" file before
failing
#use warnings;
use strict;
use lib "/usr/lib/nagios/plugins/";
use utils qw(%ERRORS $TIMEOUT);
# Watch your permissions here (because you know IPMI uses high encryption)
my $pwfile_prefix = '/etc/check_ipmi/passwd.';
my $monfile_prefix = '/etc/check_ipmi/mon.';
my $ipmitool = '/usr/bin/ipmitool';
my $command;
my %NAGIOS_API_ECODES = ( 'OK' => 0, 'WARNING' => 1, 'CRITICAL' => 2,
'UNKNOWN' => 3);
# default
my $USAGE="Usage Syntax: $0 [remoteHost]";
# define globally
#$nagios_ecode=$NAGIOS_API_ECODES{UNKNOWN};
my $nagios_ecode="NONE";
my $nagios_prefdata="";
my $nagios_retdata="";
$NAGIOS_API_ECODES{$nagios_ecode} = -1;
sub nagios_diode ($ $) {
(my $new_ecode, my $prefdata) = @_;
# This fucntion is a one-way transition for the return code
# it allow the global error code to increment upward only
# it also concatenates the performance data
# The tricky part is that we want to default to sane "3" uknown
# but instead we'll have to default to -1 (out of bounds, coach)
#print "DEBUG: new error code: " . $new_ecode . "\n";
#print "DEBUG: new error code #: " .
$NAGIOS_API_ECODES{$new_ecode} . "\n";
#print "DEBUG: previous error code: " . $nagios_ecode . "\n";
#print "DEBUG: previous error code #: " .
$NAGIOS_API_ECODES{$nagios_ecode} . "\n";
if ( $NAGIOS_API_ECODES{$new_ecode} gt
$NAGIOS_API_ECODES{$nagios_ecode} ) {
#print "DEBUG: transitioning from: " . $nagios_ecode .
" -> " . $new_ecode . "\n";
$nagios_ecode = $new_ecode;
}
#print "DEBUG: Appending pref data: " . $prefdata . "\n";
$nagios_prefdata = $nagios_prefdata . "|" . $prefdata;
}
sub cane_one() {
print $nagios_retdata;
print $nagios_prefdata;
exit $NAGIOS_API_ECODES{$nagios_ecode};
}
if ( scalar(@ARGV) < 1 || scalar(@ARGV) > 2 || $ARGV[0] !~
m/^[a-z0-9\.\-]+$/ ) {
nagios_diode('UNKNOWN', $USAGE);
cane_one;
} else {
my $passwdfile;
my $username="ADMIN";
$passwdfile = "${pwfile_prefix}$ARGV[0]";
if (! -r $passwdfile) {
$passwdfile = "${pwfile_prefix}default";
# set code to warning because using default passwd file
nagios_diode('WARNING', "WARNING: No credentials found
for $ARGV[0] - trying to use default!");
}
$command = "$ipmitool -H $ARGV[0] -U $username -f $passwdfile
sdr 2>&1 | grep -f $monfile_prefix$ARGV[0]";
# $command = "cat /badvals 2>&1 | grep -f $monfile_prefix$ARGV[0]";
}
if (! open(IPMI, "$command |") ) {
nagios_diode('UNKNOWN', "Unable to exec ipmitool(8)");
cane_one;
}
#print("DEBUG:".$command."\r\n");
my %found;
my %bad;
sub trim ($) {
my ($v) = @_;
$v =~ s/^ +//;
$v =~ s/ +$//;
return $v;
}
while (my $line = <IPMI>)
{
chomp $line;
unless ($line =~ m'^(.*) \| (.*) \| (\w+)$')
{
nagios_diode('CRITICAL', "Unrecognized response from
ipmitool: $line");
cane_one;
}
my $name = trim $1;
my $value = trim $2;
my $state = trim $3;
$name =~ tr| |_|;
my $counter = 1;
my $uname = "$name";
while ($found{$uname}) {
$uname = $name . $counter++;
}
next if $state eq "ns";
if ($state ne "ok") {
$bad{$uname} = $state;
}
$found{$uname} = $value;
}
if (keys %bad) {
my @bad;
foreach my $name (sort keys %bad) {
push @bad, "$name is $bad{$name}";
}
$nagios_retdata = "CRITICAL:" . "(" . join(", ", @bad) . ") ";
nagios_diode('CRITICAL', "IPMI Critical Value: ");
} else {
$nagios_retdata = "OK.";
nagios_diode('OK', "IPMI OK: ");
}
my @out;
# Directly toch pref_data - assume that iit is safe to
foreach my $name (sort keys %found) {
next unless $name =~ m|Fan| or $name =~ m|Temp|;
#print "DEBUG: $name = $found{$name}\n";
#$nagios_prefdata = $nagios_prefdata. "$name = $found{$name},";
push @out, "$name = $found{$name}";
}
$nagios_prefdata = $nagios_prefdata . "(" . join(", ", @out) . ") ";
cane_one;
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : denyago.vcf
Тип : text/x-vcard
Размер : 370 байтов
Описание: отсутствует
Url : <http://lists.altlinux.org/pipermail/community/attachments/20100629/c7d5b583/attachment.vcf>
Подробная информация о списке рассылки community