- Repository
- Munin (2.0)
- Last change
- 2021-04-30
- Graph Categories
- Family
- snmpauto
- Capabilities
- Language
- Perl
- Authors
snmp__df
Name
snmp__df - Plugin to check disk usage of a remote host via SNMP
Configuration
The following environment variables are used
host - SNMP hostname to probe (default undef)
port - SNMP port to use (default 161)
community - SNMP community string (default "public")
interface - (default undef)
Author
Copyright (C) 2004 Jimmy Olsen
License
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; version 2 dated June, 1991.
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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Magic Markers
#%# family=snmpauto
#%# capabilities=snmpconf
Bugs
The “interface” environment variable does not seem to be used in this script.
#!@@PERL@@ -w
# -*- perl -*-
=head1 NAME
snmp__df - Plugin to check disk usage of a remote host via SNMP
=head1 CONFIGURATION
The following environment variables are used
host - SNMP hostname to probe (default undef)
port - SNMP port to use (default 161)
community - SNMP community string (default "public")
interface - (default undef)
=head1 AUTHOR
Copyright (C) 2004 Jimmy Olsen
=head1 LICENSE
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; version 2 dated June,
1991.
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, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
=head1 MAGIC MARKERS
#%# family=snmpauto
#%# capabilities=snmpconf
=head1 BUGS
The "interface" environment variable does not seem to be used in this
script.
=cut
use strict;
use Munin::Plugin::SNMP;
my $MAXLABEL = 20;
my $iface = $ENV{interface} || undef;
my $response;
if (defined $ARGV[0] and $ARGV[0] eq "snmpconf")
{
print "require 1.3.6.1.2.1.25.2.3.1.1.\n";
print "require 1.3.6.1.2.1.25.2.3.1.2. 1.3.6.1.2.1.25.2.1.4\n"; # Type=fixed disk
print "require 1.3.6.1.2.1.25.2.3.1.5. [1-9]\n"; # Size > 0
exit 0;
}
# Partition level
my $hrFSIndex = "1.3.6.1.2.1.25.3.8.1.1."; # Should be more than 0
my $hrFSMountPoint = "1.3.6.1.2.1.25.3.8.1.2."; # Used to look up filesystem
my $hrFSStorageIndex = "1.3.6.1.2.1.25.3.8.1.7."; # Used to map filesystem to storage
# Filesystem level
my $hrStorageType = "1.3.6.1.2.1.25.2.3.1.2."; # Backup for hrFS*
my $hrStorageDesc = "1.3.6.1.2.1.25.2.3.1.3."; # Used as key from partitions
my $hrStorageSize = "1.3.6.1.2.1.25.2.3.1.5."; # Data point 1
my $hrStorageUsed = "1.3.6.1.2.1.25.2.3.1.6."; # Data point 2
my $session = Munin::Plugin::SNMP->session();
# Take a look at the partitions...
my %partitions;
my $filesystems = get_by_regex ($session, $hrFSIndex, "[1-9]");
foreach my $filesys (keys %$filesystems)
{
my $mp = get_single ($session, $hrFSMountPoint . $filesys);
my $st = get_single ($session, $hrFSStorageIndex . $filesys);
$partitions{$mp}{partition} = $filesys;
$partitions{$mp}{disk} = $st;
print "# Added mountpoint \"$mp\" as \"$filesys\" on disk \"$st\”...\n" if $Munin::Plugin::SNMP::DEBUG;
}
my $stor_id;
my $foundpartitions = keys %partitions;
if ($foundpartitions == 0 or defined $partitions{""})
{ # Oh bugger. Some (or all) mountpoints were undeterminable. The backup
# solution is to just graph everything that claims to be a FixedDisk,
# without checking if it's removable etc
print "# Unable to map mountpoints from filesystems to storages. Bugger.\n" if $Munin::Plugin::SNMP::DEBUG;
$stor_id = get_by_regex ($session, $hrStorageType, "1.3.6.1.2.1.25.2.1.4");
%partitions = ();
foreach my $id (keys %$stor_id)
{
my $part = get_single ($session, $hrStorageDesc . $id);
my $spart = $part;
$spart =~ s/:\\ Label:.*/:/;
$partitions{$spart}{storage} = $id;
$partitions{$spart}{extinfo} = $part;
$stor_id->{$id} = $spart;
}
} else
{ # Get the ones we're sure are really fixed
$stor_id = get_by_regex ($session, $hrStorageDesc, '(^'.join('$|^',keys(%partitions)).'$)');
}
foreach my $storage (keys %$stor_id)
{
$partitions{$stor_id->{$storage}}{storage} = $storage;
$partitions{$stor_id->{$storage}}{size} = get_single ($session, $hrStorageSize . $storage);
print "# found $storage with size $partitions{$stor_id->{$storage}}{size}\n" if $Munin::Plugin::SNMP::DEBUG;
if ($partitions{$stor_id->{$storage}}{size} == 0) {
delete $stor_id->{$storage} ;
}
}
# If there are still no size definitions, use the mapping to storage
# ($hrFSStorageIndex) to get the size. Make sure, we only add each storage
# device only once
my %newpartitions;
foreach my $part (keys %partitions)
{
if ( (!defined $partitions{$part}{size} or $partitions{$part}{size} == 0) and defined $partitions{$part}{disk}) {
my $disk = $partitions{$part}{disk};
my $name = get_single($session, $hrStorageDesc . $disk);
if (!defined $newpartitions{$name} ) {
$newpartitions{$name}{size} = get_single ($session, $hrStorageSize . $disk);
$newpartitions{$name}{storage} = $disk;
$newpartitions{$name}{used} = get_single ($session, $hrStorageUsed . $disk);
print "# added size \"$newpartitions{$name}{size}\" to \"$name\" for \"$part\" from disk \"$disk\"\n" if $Munin::Plugin::SNMP::DEBUG;
}
}
}
if (keys %newpartitions != 0) { %partitions = %newpartitions; }
foreach my $part (keys %partitions)
{
if ($partitions{$part}{size} == 0) { delete $partitions{$part} ; }
}
if (defined $ARGV[0] and $ARGV[0] eq "config")
{
my ($host) = Munin::Plugin::SNMP->config_session();
print "host_name $host\n" unless $host eq 'localhost';
print "graph_title Disk usage in percent\n";
print "graph_args --upper-limit 100 -l 0\n";
print "graph_vlabel %\n";
print "graph_category disk\n";
print "graph_info This graph shows partition usage in percent.\n";
foreach my $part (sort(keys %partitions))
{
print (&get_name_by_mp ($part), ".label ");
print (length($part)<=$MAXLABEL ? $part : "...".substr($part,-($MAXLABEL-3)));
print ("\n");
print (&get_name_by_mp ($part), ".warning 92\n");
print (&get_name_by_mp ($part), ".critical 98\n");
print (&get_name_by_mp ($part), ".info Usage for ". ($partitions{$part}{extinfo}||$part)."\n");
}
exit 0;
}
foreach my $storage (keys %$stor_id)
{
$partitions{$stor_id->{$storage}}{used} = get_single ($session, $hrStorageUsed . $storage);
}
foreach my $part (keys %partitions)
{
print (&get_name_by_mp ($part), ".value ", ($partitions{$part}{used}*100/$partitions{$part}{size}), "\n");
}
sub get_single
{
my $handle = shift;
my $oid = shift;
print "# Getting single $oid..." if $Munin::Plugin::SNMP::DEBUG;
$response = $handle->get_request ($oid);
if (!defined $response->{$oid})
{
print "undef\n" if $Munin::Plugin::SNMP::DEBUG;
return undef;
}
else
{
print "\"$response->{$oid}\"\n" if $Munin::Plugin::SNMP::DEBUG;
return $response->{$oid};
}
}
sub get_by_regex
{
my $handle = shift;
my $oid = shift;
my $regex = shift;
my $result = {};
my $num = 0;
my $ret = $oid . "0";
my $response;
print "# Starting browse of $oid...\n" if $Munin::Plugin::SNMP::DEBUG;
while (1)
{
if ($num == 0)
{
print "# Checking for $ret...\n" if $Munin::Plugin::SNMP::DEBUG;
$response = $handle->get_request ($ret);
}
if ($num or !defined $response)
{
print "# Checking for sibling of $ret...\n" if $Munin::Plugin::SNMP::DEBUG;
$response = $handle->get_next_request ($ret);
}
if (!$response)
{
return undef;
}
my @keys = keys %$response;
$ret = $keys[0];
print "# Analyzing $ret (compared to $oid)...\n" if $Munin::Plugin::SNMP::DEBUG;
last unless ($ret =~ /^$oid/);
$num++;
next unless ($response->{$ret} =~ /$regex/);
@keys = split (/\./, $ret);
$result->{$keys[-1]} = $response->{$ret};;
print "# Index $num: ", $keys[-1], " (", $response->{$ret}, ")\n" if $Munin::Plugin::SNMP::DEBUG;
};
return $result;
}
sub get_name_by_mp
{
my $mp = shift;
$mp =~ s/[^a-z0-9_]/_/gi;
$mp =~ tr/A-Z/a-z/;
return "p" . $mp;
}