mirror of
https://github.com/munin-monitoring/contrib.git
synced 2025-07-26 02:48:28 +00:00
bugfix
This commit is contained in:
parent
98841b772d
commit
455445e1e0
1 changed files with 94 additions and 127 deletions
|
@ -1,139 +1,106 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/perl -w
|
||||||
"""
|
|
||||||
USAGE
|
|
||||||
|
|
||||||
dell_changeme [config] [autoconfig]
|
|
||||||
|
|
||||||
Copy script to two files: dell_fans and dell_temps.
|
|
||||||
Example: cat dell_changeme | tee dell_fans > dell_temps
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
|
|
||||||
A Munin plugin to graph the fan speeds and chassis temperatures of Dell
|
|
||||||
hardware. Requires Dell's OpenManage software, specifically omreport. OMSA
|
|
||||||
services must be started prior to plugins use. Script expects omreport to
|
|
||||||
be in /usr/sbin/, you may need to add a symlink.
|
|
||||||
|
|
||||||
omreport accesses the proc filesystem and as such this plugin must be ran
|
|
||||||
as root. Alternatively, you could modify script to use sudoers, or setuid.
|
|
||||||
|
|
||||||
To run script as root add the following lines to munin's plugin-conf.d dir.
|
|
||||||
|
|
||||||
[dell*]
|
|
||||||
user root
|
|
||||||
group root
|
|
||||||
|
|
||||||
Troubleshooting info: http://www.ryanbowlby.com/infotech/munin-plugin-dell/
|
|
||||||
|
|
||||||
AUTHOR
|
|
||||||
|
|
||||||
Ryan Bowlby <rbowlby83 yahoo>
|
|
||||||
|
|
||||||
LICENSE
|
|
||||||
|
|
||||||
This script is in the public domain, free from copyrights or restrictions.
|
|
||||||
"""
|
|
||||||
# Magic markers (optional) - used by munin-node-configure:
|
|
||||||
#
|
#
|
||||||
|
# Plugin to monitor BGP table summary statistics on a cisco router.
|
||||||
|
#
|
||||||
|
# Original Author: Peter Holzleitner
|
||||||
|
#
|
||||||
|
# Revision 1.1 2010/10/14 19:19
|
||||||
|
#
|
||||||
|
# Configuration variables:
|
||||||
|
#
|
||||||
|
# iosuser - username (default "")
|
||||||
|
# iospass - password (default "")
|
||||||
|
#
|
||||||
|
# Parameters:
|
||||||
|
#
|
||||||
|
# config (required)
|
||||||
|
#
|
||||||
|
# Magic markers (optional - only used by munin-config and some
|
||||||
|
# installation scripts):
|
||||||
#%# family=auto
|
#%# family=auto
|
||||||
#%# capabilities=autoconf
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import subprocess as sp
|
|
||||||
|
|
||||||
class Statistics(object):
|
|
||||||
"""A base class that runs omreport and prints the filtered results."""
|
|
||||||
|
|
||||||
def __init__(self, command):
|
|
||||||
self.command = command.split()
|
|
||||||
self.data = sp.Popen(self.command,stdout=sp.PIPE).stdout.readlines()
|
|
||||||
self.count = 0
|
|
||||||
# Make sure omreport returns at least one sensor block.
|
|
||||||
for item in self.data:
|
|
||||||
if item.startswith("Probe Name") or item.startswith("Reading"):
|
|
||||||
self.count += 1
|
|
||||||
if self.count < 2:
|
|
||||||
raise ValueError("No output from omreport. Is OMSA running?")
|
|
||||||
|
|
||||||
def print_omreport_results(self):
|
|
||||||
"""Prints names and values for each sensor."""
|
|
||||||
self.count = 0
|
|
||||||
for item in self.data:
|
|
||||||
if "Reading" in item:
|
|
||||||
# Extract variable length integer.
|
|
||||||
self.value = float(item.split(":")[1].split()[0])
|
|
||||||
print "%s_%s.value %s" % (self.command[-1], self.count, self.value)
|
|
||||||
self.count += 1
|
|
||||||
|
|
||||||
def print_config_dynamic(self):
|
|
||||||
"""Prints Munin config data with "label" values from omreport data."""
|
|
||||||
self.name = []
|
|
||||||
for item in self.data:
|
|
||||||
if "Probe Name" in item:
|
|
||||||
self.name.append(item.split(":")[1].replace("RPM","").strip())
|
|
||||||
for index, item in enumerate(self.name):
|
|
||||||
print "%s_%s.label %s" % (self.command[-1], index, item)
|
|
||||||
|
|
||||||
|
|
||||||
class FanSpeed(Statistics):
|
use Net::Telnet::Cisco;
|
||||||
"""A subclass that includes the Munin "config" output."""
|
use Sys::Syslog;
|
||||||
|
|
||||||
def __init__(self, command):
|
|
||||||
Statistics.__init__(self, command)
|
|
||||||
|
|
||||||
def print_config(self):
|
|
||||||
print "graph_title Dell Fan Speeds"
|
|
||||||
print "graph_args --base 1000 -l 0"
|
|
||||||
print "graph_vlabel speed (RPM)"
|
|
||||||
print "graph_category Chassis"
|
|
||||||
print "graph_info This graph shows the speed in RPM of all fans."
|
|
||||||
print "graph_period second"
|
|
||||||
# Print remaining non-static values.
|
|
||||||
self.print_config_dynamic()
|
|
||||||
|
|
||||||
|
|
||||||
class ChassisTemps(Statistics):
|
if ($0 =~ /^(?:|.*\/)cisco_bgp_([^_]+)$/) {
|
||||||
"""A subclass that includes the Munin "config" output."""
|
$host = $1;
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, command):
|
($^O eq "linux" || $^O eq "openbsd") && Sys::Syslog::setlogsock('unix');
|
||||||
Statistics.__init__(self, command)
|
openlog('munin.bgp', 'cons,pid', 'daemon');
|
||||||
|
|
||||||
def print_config(self):
|
|
||||||
print "graph_title Dell Temperature Readings"
|
|
||||||
print "graph_args --base 1000 -l 0"
|
|
||||||
print "graph_vlabel Temp in Degrees Celsius"
|
|
||||||
print "graph_category Chassis"
|
|
||||||
print "graph_info This graph shows the temperature for all sensors."
|
|
||||||
print "graph_period second"
|
|
||||||
# Print remaining non-static values.
|
|
||||||
self.print_config_dynamic()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
my @BGP_nbr;
|
||||||
try:
|
my @BGP_pfx;
|
||||||
if "fans" in sys.argv[0]:
|
my $tot_pfx;
|
||||||
cmd = "/usr/sbin/omreport chassis fans"
|
my $iosuser = $ENV{iosuser} || "";
|
||||||
omdata = FanSpeed(cmd)
|
my $iospass = $ENV{iospass} || "";
|
||||||
elif "temps" in sys.argv[0]:
|
|
||||||
cmd = "/usr/sbin/omreport chassis temps"
|
|
||||||
omdata = ChassisTemps(cmd)
|
|
||||||
else:
|
|
||||||
print >> sys.stderr, "Change filename to dell_fans or dell_temps."
|
|
||||||
sys.exit(1)
|
|
||||||
except (OSError, ValueError), e:
|
|
||||||
# omreport returns 0 results if OMSA services aren't started.
|
|
||||||
print >> sys.stderr, "Error running '%s', %s" % (cmd, e)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Munin populates sys.argv[1] with "" (an empty argument), let's remove it.
|
&fetch_bgpstats($host, $iosuser, $iospass);
|
||||||
sys.argv = [x for x in sys.argv if x]
|
|
||||||
|
|
||||||
if len(sys.argv) > 1:
|
|
||||||
if sys.argv[1].lower() == "autoconf":
|
|
||||||
# omreport ran earlier, since we got this far autoconf is good.
|
|
||||||
print "true"
|
|
||||||
elif sys.argv[1].lower() == "config":
|
|
||||||
omdata.print_config()
|
|
||||||
else:
|
|
||||||
omdata.print_omreport_results()
|
|
||||||
|
|
||||||
|
if ($ARGV[0] and $ARGV[0] eq "config") {
|
||||||
|
print "host_name $host\n";
|
||||||
|
print "graph_args --base 1024 -l 0 --vertical-label Prefixes\n";
|
||||||
|
print "graph_title BGP Neighbour Statistics\n";
|
||||||
|
print "graph_category network\n";
|
||||||
|
print "graph_info This graph shows the number of BGP prefixes received by neighbour.\n";
|
||||||
|
|
||||||
|
my($n, $i); $n = scalar @BGP_nbr; $i = 0;
|
||||||
|
while($n--) {
|
||||||
|
my $neigh = $BGP_nbr[$i++];
|
||||||
|
print "n$i.label $neigh\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# print "total.label Total\n";
|
||||||
|
# print "total.info Total number of prefixes in the BGP table\n";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
my($n, $i); $n = scalar @BGP_nbr; $i = 0;
|
||||||
|
while($n--) {
|
||||||
|
my $pfx = $BGP_pfx[$i++];
|
||||||
|
print "n$i.value $pfx\n";
|
||||||
|
}
|
||||||
|
# print "total.value $tot_pfx\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sub fetch_bgpstats
|
||||||
|
{
|
||||||
|
my $hostname = shift;
|
||||||
|
my $username = shift;
|
||||||
|
my $password = shift;
|
||||||
|
my $session = Net::Telnet::Cisco->new(Host => $host);
|
||||||
|
|
||||||
|
$session->login($username, $password);
|
||||||
|
$session->cmd('terminal length 200');
|
||||||
|
$session->cmd('terminal width 200');
|
||||||
|
my @output = $session->cmd('show ip bgp summary');
|
||||||
|
|
||||||
|
# example output of router
|
||||||
|
# ------------------------
|
||||||
|
# [...]
|
||||||
|
# Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
|
||||||
|
# 11.111.11.111 4 98765 12403694 509571 308911893 0 0 1d23h 329193
|
||||||
|
# 122.122.122.122 4 1234 13242856 383827 308911879 0 0 00:08:22 330761
|
||||||
|
|
||||||
|
foreach(@output) {
|
||||||
|
chomp; s/\r//g;
|
||||||
|
$tot_pfx = $1 if /^BGP activity (\d+)\/(\d+) prefixes/;
|
||||||
|
syslog('debug', "$hostname: $_\n");
|
||||||
|
|
||||||
|
next unless /^(\d+\.\d+\.\d+\.\d+)\s+\d+\s+(\d+)\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+[0-9a-z:]+\s+(\d+)/;
|
||||||
|
my ($neigh, $as, $pfx) = ($1, $2, $3);
|
||||||
|
syslog('debug', "$neigh (AS $as)");
|
||||||
|
push @BGP_nbr, "$neigh (AS $as)";
|
||||||
|
push @BGP_pfx, $pfx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# vim:syntax=perl:ts=8
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue