- Renamed package to monitoring-plugins-qlogic_sanbox

- update to 1.3 (thanks to Christian Fertig):
  + added configurable warning and critical options for sensor 4
    (the CPU sensor)
  + added explanation for --filename option in help text

- license update following SPDX format

- increase the temperature warnings for sensor 4 to 70/75 - looks 
  more useful (and shown in manual, too)

- temp sensor 4 (only with firmware 8.x) seems to be
  cpu-temperature, use special warn and crit levels

- specify timeout also for snmp-session 

- add maxmsgsize, more useful error output 

- initial version

OBS-URL: https://build.opensuse.org/package/show/server:monitoring/monitoring-plugins-qlogic_sanbox?expand=0&rev=2
This commit is contained in:
Lars Vogdt 2014-07-30 21:26:50 +00:00 committed by Git OBS Bridge
commit d6ee13fb7e
5 changed files with 641 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.osc

503
check_qlogic_sanbox Normal file
View File

@ -0,0 +1,503 @@
#!/usr/bin/perl -w
# nagios: -epn
#
# Copyright (c) 2012, SUSE Linux Products GmbH
# Author: Lars Vogdt <lrupp@suse.de>
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# * Neither the name of the Novell nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 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.
#
use strict;
use Net::SNMP;
use Getopt::Long;
use Net::Ping;
use Pod::Usage;
use bignum qw/hex/;
Getopt::Long::Configure('bundling');
# cleanup the environment
$ENV{'PATH'} = '/bin:/usr/bin:/sbin:/usr/sbin:';
$ENV{'BASH_ENV'} = '';
$ENV{'ENV'} = '';
our $conf = {
'VERSION' => '1.3',
'PROGNAME' => 'check_qlogic_sanbox',
'timeout' => '60',
'critical' => '45',
'warning' => '35',
'sensor_4_warn' => '70',
'sensor_4_crit' => '75',
'debug' => 0,
'hostname' => 'localhost',
'community' => 'public',
'snmp_version' => '2c',
'snmp_port' => '161',
'maxmsgsize' => '65535',
};
our $print_version = 0;
our $print_help = 0;
our $exitcode = 0;
our $output = '';
# The Name_Identifier of the Fabric Element
our $fcFeElementName = '.1.3.6.1.2.1.75.1.1.2.0';
# The basic information about the Fabric Element
our $base_table_query = '.1.3.6.1.2.1.1';
our %ERRORS = (
'OK' => 0,
'WARNING' => 1,
'CRITICAL' => 2,
'UNKNOWN' => 3,
'DEPENDENT' => 4
);
our %BASE_OIDs = (
'sysDescr' => '.1.3.6.1.2.1.1.1.0',
'sysUpTime' => '.1.3.6.1.2.1.1.3.0',
'sysName' => '.1.3.6.1.2.1.1.5.0',
'sysContact' => '.1.3.6.1.2.1.1.4.0',
'sysLocation' => '.1.3.6.1.2.1.1.6.0',
);
#######################################################################
# Functions
#######################################################################
sub snmp_get_table($$$){
my ($conf,$session,$query) = @_;
my ($answer,$response);
if ( ! defined ( $response = $session->get_table($query))){
$answer=$session->error;
$session->close;
print "CRITICAL: no response with SNMP version $conf->{'snmp_version'} for get_table on $query (error $answer)\n";
exit $ERRORS{'CRITICAL'};
}
return $response;
}
sub snmp_get_request($$$){
my ($conf,$session,$query) = @_;
my ($answer,$response);
if ( ! defined ( $response = $session->get_request($query))){
$answer=$session->error;
$session->close;
print "CRITICAL: no response with SNMP version $conf->{'snmp_version'} for get_request on $query (error $answer)\n";
exit $ERRORS{'CRITICAL'};
}
return($response->{$query});
}
sub DEBUG($) {
my ($output) = @_;
print "DEBUG: $output\n" if ( $conf->{'debug'} );
}
sub print_myrevision ($$) {
my ($commandName,$pluginRevision) = @_;
print "$commandName v$pluginRevision\n";
}
#######################################################################
# Main
#######################################################################
Getopt::Long::Configure('bundling');
GetOptions(
"H=s" => \$conf->{'hostname'},
"hostname=s" => \$conf->{'hostname'},
"f=s" => \$conf->{'filename'},
"filename=s" => \$conf->{'filename'},
"v" => \$print_version,
"version" => \$print_version,
"h" => \$print_help,
"help" => \$print_help,
"d" => \$conf->{'debug'},
"debug" => \$conf->{'debug'},
"w=f" => \$conf->{'warning'},
"warning=f" => \$conf->{'warning'},
"c=f" => \$conf->{'critical'},
"critical=f" => \$conf->{'critical'},
"sensor4_warn=f"=> \$conf->{'sensor_4_warn'},
"sensor4_crit=f"=> \$conf->{'sensor_4_crit'},
"t=i" => \$conf->{'timeout'},
"timeout=i" => \$conf->{'timeout'},
"C=s" => \$conf->{'community'},
"community=s" => \$conf->{'community'},
"p=i" => \$conf->{'snmp_port'},
"port=i" => \$conf->{'snmp_port'},
"V=s" => \$conf->{'snmp_version'},
"snmp-version=s"=> \$conf->{'snmp_version'},
) or pod2usage(2);
pod2usage(
-exitstatus => 0,
-verbose => 2, # 2 to print full pod
) if $print_help;
# Just in case of problems, let's not hang Nagios
$SIG{'ALRM'} = sub {
print "UNKNOWN: No snmp response from ".$conf->{'hostname'}." (alarm timeout)\n";
exit $ERRORS{'UNKNOWN'};
};
alarm( $conf->{'timeout'} );
if ($print_version) {
print_myrevision( $conf->{'PROGNAME'}, $conf->{'VERSION'} );
exit $ERRORS{'OK'};
}
#
# Check the given options...
#
if (defined($conf->{'filename'})){
use Config::IniFiles;
my $ini = new Config::IniFiles( -file => "$conf->{'filename'}");
if( ! $ini ){
print "ERROR: Could not open $conf->{'filename'} : $!\n";
exit $ERRORS{'UNKNOWN'};
}
if (! $ini->SectionExists($conf->{'hostname'})){
print "ERROR: Could not find section [$conf->{'hostname'}] in $conf->{'filename'}\n";
exit $ERRORS{'UNKNOWN'};
}
$conf->{'community'} = $ini->val($conf->{'hostname'}, 'community') if (defined($ini->val($conf->{'hostname'},'community')));
$conf->{'snmp_version'} = $ini->val($conf->{'hostname'}, 'snmp_version') if (defined($ini->val($conf->{'hostname'},'snmp_version')));
$conf->{'snmp_port'} = $ini->val($conf->{'hostname'}, 'snmp_port') if (defined($ini->val($conf->{'hostname'},'snmp_port')));
$conf->{'warning'} = $ini->val($conf->{'hostname'}, 'warning') if (defined($ini->val($conf->{'hostname'},'warning')));
$conf->{'critical'} = $ini->val($conf->{'hostname'}, 'critical') if (defined($ini->val($conf->{'hostname'},'critical')));
$conf->{'sensor_4_warn'}= $ini->val($conf->{'hostname'}, 'sensor4_warn') if (defined($ini->val($conf->{'hostname'},'sensor4_warn')));
$conf->{'sensor_4_crit'}= $ini->val($conf->{'hostname'}, 'sensor4_crit') if (defined($ini->val($conf->{'hostname'},'sensor4_crit')));
}
if ( !defined($conf->{'hostname'}) ) {
print "ERROR - no hostname given\n";
pod2usage(2);
alarm(0);
exit $ERRORS{'UNKNOWN'};
}
if ($conf->{'warning'} gt $conf->{'critical'}){
print "ERROR: warning level ($conf->{'warning'}) should not be greater than critical level ($conf->{'critical'})\n";
pod2usage(2);
alarm(0);
exit $ERRORS{'UNKNOWN'};
}
if ($conf->{'sensor_4_warn'} gt $conf->{'sensor_4_crit'}){
print "ERROR: sensor 4 warning level ($conf->{'sensor_4_warn'}) should not be greater than sensor 4 critical level ($conf->{'sensor_4_crit'})\n";
pod2usage(2);
alarm(0);
exit $ERRORS{'UNKNOWN'};
}
if ($conf->{'debug'}){
use Data::Dumper;
print STDERR "Internal configuration:\n".Data::Dumper->Dump([$conf]);
}
#
# Basic defines / checks
#
my $ret_str='UNKNOWN';
my $error='UNKNOWN';
my $session;
# First try to ping the Sanbox, this gives faster results
my $p = Net::Ping->new();
if (! $p->ping($conf->{'hostname'}) ){
print "CRITICAL: could not ping your Sanbox ($conf->{'hostname'})\n";
exit $ERRORS{'CRITICAL'};
}
$p->close();
#
# Prepare SNMP Session
#
($session, $error) = Net::SNMP->session(
-hostname => $conf->{'hostname'},
-community => $conf->{'community'},
-port => $conf->{'snmp_port'},
-version => $conf->{'snmp_version'},
-maxmsgsize => $conf->{'maxmsgsize'},
-timeout => $conf->{'timeout'},
);
if (!defined($session)){
print "ERROR: $error";
exit $ERRORS{'UNKNOWN'};
}
#
# Query SNMP informations from the single switch
#
# first get the WWPN of the SANBox and convert it into octal number
my $WWPN=snmp_get_request($conf,$session,$fcFeElementName);
my @array = unpack ("C*", pack ("H*", $WWPN));
my $sanbox_id=join(".",splice(@array,-4,4));
my $snmp_status_query=".1.3.6.1.3.94.1.8.1.6.16.0.0.192.$sanbox_id.0.0.0.0.0.0.0.0";
# The installed Firmware of the Fabric Element
our $firmware_oid = ".1.3.6.1.3.94.1.7.1.3.16.0.0.192.$sanbox_id.0.0.0.0.0.0.0.0.1";
# Now get some basic parameters
my $baseinfo=snmp_get_table($conf,$session,$base_table_query);
# and also the currently running Firmware
my $firmware=snmp_get_request($conf,$session,$firmware_oid);
# Get the status output from the switch
my $status=snmp_get_table($conf,$session,$snmp_status_query);
# Get the names for the status output
my $snmp_status_names='.1.3.6.1.3.94.1.8.1.3.16.0.0.192.'.$sanbox_id.'.0.0.0.0.0.0.0.0';
my $status_names_ref=snmp_get_table($conf,$session,$snmp_status_names);
my %status_names=%$status_names_ref;
#
# Close the session and reset the alarm
#
$session->close;
alarm(0);
if ($conf->{'debug'}){
print STDERR "\nSanbox ID: $sanbox_id ($WWPN)\n";
print STDERR "Firmware : $firmware\n";
print STDERR "Basic information:\n";
print STDERR Data::Dumper->Dump([$baseinfo]);
print STDERR "\nQuerying : $snmp_status_query";
print STDERR "\nStatus Names Table:\n";
print STDERR Data::Dumper->Dump([$status_names_ref]);
print STDERR "\nStatus Table:\n";
print STDERR Data::Dumper->Dump([$status]);
}
#
# Analyze the tables...
#
my $perfdata='';
foreach my $value (sort(keys(%status_names))){
my ($is_temp, $is_temp_status, $is_status)=0;
my ($sensor_number,$sensor_name);
$output.="$status_names{$value}: ";
if ( $status_names{$value} =~ /.*Temperature Sensor (.*) Value/ ){
$perfdata.="'Temp ".$1."'=";
$sensor_number=$1;
$is_temp=1;
}
elsif ( $status_names{$value} =~ /Temperature Status/ ){
$is_temp_status=1;
$sensor_name=$status_names{$value};
}
elsif ( $status_names{$value} =~ /Power supply (.*) Status/ ){
$is_status=1;
$sensor_number=$1;
$sensor_name=$status_names{$value};
}
elsif ( $status_names{$value} =~ /Fan (.*) Status/ ){
$is_status=1;
$sensor_number=$1;
$sensor_name=$status_names{$value};
}
# convert the OID for the name to match the OID for the value:
$value =~ s/.1.3.6.1.3.94.1.8.1.3.16.0.0.192/.1.3.6.1.3.94.1.8.1.6.16.0.0.192/;
$output.="$status->{$value}; ";
# now check the results depending on the sensors:
if ($is_temp){
my $temp="$status->{$value}";
$temp=~ s/\D//g;
my $conf_warn = $conf->{'warning'};
my $conf_crit = $conf->{'critical'};
if ($sensor_number == 4) {
$conf_warn = $conf->{'sensor_4_warn'};
$conf_crit = $conf->{'sensor_4_crit'};
}
$perfdata.="$temp;$conf_warn;$conf_crit;; ";
if ($temp gt $conf_crit){
$exitcode=$ERRORS{'CRITICAL'};
$output="CRITICAL: temperatur $status->{$value} on sensor $sensor_number exceeds critical level ($conf_crit); ".$output;
}
elsif ($temp gt $conf_warn){
$exitcode=$ERRORS{'WARNING'};
$output="WARNING: temperatur $status->{$value} on sensor $sensor_number exceeds warning level ($conf_warn); ".$output;
}
}
if ($is_temp_status){
if ($status->{$value} !~ /Normal/){
$exitcode=$ERRORS{'CRITICAL'};
$output="CRITICAL: $sensor_name is $status->{$value}; ".$output;
}
}
if ($is_status){
if ($status->{$value} !~ /Good/){
$exitcode=$ERRORS{'CRITICAL'};
$output="CRITICAL: $sensor_name is $status->{$value}; ".$output;
}
}
}
foreach my $value (sort(keys(%BASE_OIDs))){
$output.="$value: $baseinfo->{$BASE_OIDs{$value}}; ";
}
$output.="Firmware: $firmware; ";
#
# Finished : output what we have so far...
#
print "$output | $perfdata\n";
exit $exitcode;
__END__
=head1 check_qlogic_sanbox
check_qlogic_sanbox is a Nagios plugin, allowing to check QLogic FC Sanboxes.
This plugin has been tested with the following QLogic switches:
=over 4
=item SANbox 5200 FC Switch
=item SANbox 5202 FC Switch
=item SANbox 5600 FC Switch
=item SANbox 5602 FC Switch
=item SANbox 5800 FC Switch
=back
=head1 SYNOPSIS
./check_qlogic_sanbox -H $HOSTNAME$ --community public
Options:
-H <HOSTNAME> | --hostname <HOSTNAME>
-w <int> | --warning <int>
-c <int> | --critical <int>
-t <int> | --timeout <int>
-C <string> | --community <string>
-V <string> | --snmp-version <string>
-p <int> | --port <int>
-f <file> | --filename <file>
--sensor4_warn <int>
--sensor4_crit <int>
-h | --help
-d | --debug
=head1 OPTIONS
=over 8
=item B<--hostname> F<hostname>
The name of the Sanbox. Default: localhost (which makes no sense).
=item B<--critical> F<int>
Critical temperature level. Default is 45 degrees Celsius.
=item B<--warning> F<int>
Warning temperature level. Default is 35 degrees Celsius.
=item B<--timeout> F<int>
Timeout until the plugin times out with result UNKNOWN.
=item B<--community> F<string>
SNMP community string to use. Default: public.
=item B<--port> F<int>
SNMP port to use. Default: 161.
=item B<--snmp-version> F<string>
SNMP version to use. Default: 2c.
=item B<--filename F<path_to_file>
You can put the configuration in a file with ini-file syntax (using the hostname as section separator) using the long format of the available options.
Example:
[192.168.0.1]
warning=37
critical=39
community=public
sensor4_warn=50
sensor4_crit=55
[192.168.0.2]
warning=40
critical=45
community=secure
sensor4_warn=60
sensor4_crit=65
The script should be called with the hostname/IP and the filename option like:
B<$USER1$/check_qlogic_sanbox -H 192.168.0.1 --filename /etc/nagios-plugins/sanboxes.ini>
=item B<--sensor4_warn F<int>
Warning temperature level for the CPU sensor (Sensor 4). Default is 70 degrees Celsius.
=item B<--sensor4_crit F<int>
Critical temperature level for the CPU sensor (Sensor 4). Default is 75 degrees Celsius.
=item B<--help>
Produces this output.
=item B<--debug>
Print debug output on STDERR.
=back
=head1 DESCRIPTION
=head1 AUTHORS
Written by Lars Vogdt <lrupp@suse.de>
=head1 SUPPORT
Please use https://bugzilla.novell.com to submit patches or suggest improvements.
Include version information with all correspondence (when possible use output from
the --version option of the plugin itself).

View File

@ -0,0 +1,45 @@
-------------------------------------------------------------------
Wed Jul 30 19:20:22 UTC 2014 - lars@linux-schulserver.de
- Renamed package to monitoring-plugins-qlogic_sanbox
-------------------------------------------------------------------
Fri Mar 8 10:08:53 UTC 2013 - lars@linux-schulserver.de
- update to 1.3 (thanks to Christian Fertig):
+ added configurable warning and critical options for sensor 4
(the CPU sensor)
+ added explanation for --filename option in help text
-------------------------------------------------------------------
Wed Jan 23 10:28:10 UTC 2013 - lars@linux-schulserver.de
- license update following SPDX format
-------------------------------------------------------------------
Tue Jun 12 12:08:35 UTC 2012 - lars@linux-schulserver.de
- increase the temperature warnings for sensor 4 to 70/75 - looks
more useful (and shown in manual, too)
-------------------------------------------------------------------
Wed Jun 6 20:47:18 CEST 2012 - ro@suse.de
- temp sensor 4 (only with firmware 8.x) seems to be
cpu-temperature, use special warn and crit levels
-------------------------------------------------------------------
Tue Jun 5 01:52:56 CEST 2012 - ro@suse.de
- specify timeout also for snmp-session
-------------------------------------------------------------------
Tue Jun 5 01:33:11 CEST 2012 - ro@suse.de
- add maxmsgsize, more useful error output
-------------------------------------------------------------------
Sat May 5 17:11:23 UTC 2012 - lars@linux-schulserver.de
- initial version

View File

@ -0,0 +1,69 @@
#
# spec file for package monitoring-plugins-qlogic_sanbox
#
# Copyright (c) 2013-2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
# Author: Lars Vogdt
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
Name: monitoring-plugins-qlogic_sanbox
Summary: Check QLogic FC Sanboxes
License: BSD-3-Clause
Group: System/Monitoring
Version: 1.3
Release: 100
Url: http://en.opensuse.org/Monitoring-plugins-qlogic_sanbox
Source0: check_qlogic_sanbox
Requires: perl(Getopt::Long)
Requires: perl(Net::Ping)
Requires: perl(Net::SNMP)
Requires: perl(Pod::Usage)
Recommends: perl(Config::IniFiles)
Recommends: perl(Data::Dumper)
BuildArch: noarch
BuildRequires: nagios-rpm-macros
Provides: nagios-plugins-qlogic_sanbox = %{version}-%{release}
Obsoletes: nagios-plugins-qlogic_sanbox < %{version}-%{release}
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
Nagios plugin, allowing to check QLogic FC Sanboxes.
This plugin has been tested with the following QLogic switches:
SANbox 5200 FC Switch
SANbox 5202 FC Switch
SANbox 5600 FC Switch
SANbox 5602 FC Switch
SANbox 5800 FC Switch
%prep
%build
%install
install -D -m755 %{SOURCE0} %buildroot/%{nagios_plugindir}/check_qlogic_sanbox
%clean
rm -rf %buildroot
%files
%defattr(-,root,root)
# avoid build dependecy of nagios - own the dirs
%dir %{nagios_libdir}
%dir %{nagios_plugindir}
%{nagios_plugindir}/check_qlogic_sanbox
%changelog