#!/usr/bin/perl
#
# collectd - snmp-probe-host.px
-# Copyright (C) 2008 Florian octo Forster
+# Copyright (C) 2008,2009 Florian octo Forster
+# Copyright (C) 2009 noris network AG
#
# 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
use Getopt::Long ('GetOptions');
use Socket6;
+our %ExcludeOptions =
+(
+ 'IF-MIB64' => qr/^\.?1\.3\.6\.1\.2\.1\.31/,
+ 'IF-MIB32' => qr/^\.?1\.3\.6\.1\.2\.1\.2/
+);
+
sub get_config
{
my %conf;
{
my $sess = shift;
my $conf = shift;
+ my $excludes = @_ ? shift : [];
my @oids;
my $cmd = 'GET';
my $vl;
$oid_orig = $tmp;
}
+ for (@$excludes)
+ {
+ if ($oid_orig =~ $_)
+ {
+ return;
+ }
+ }
+
$vb = SNMP::Varbind->new ([$oid_orig]);
if ($cmd eq 'GET')
my $host = shift;
my $community = shift;
my $data = shift;
+ my $excludes = @_ ? shift : [];
my $version = 2;
my @valid_data = ();
my $begin;
for (keys %$data)
{
my $name = $_;
- if (probe_one ($sess, $data->{$name}))
+ if (probe_one ($sess, $data->{$name}, $excludes))
{
push (@valid_data, $name);
}
-C | --config Path to config file holding the SNMP data blocks.
-c | --community SNMP community to use. Default: `public'.
-h | --help Print this information and exit.
+ -x | --exclude Exclude a specific MIB. Call with "help" for more
+ information.
USAGE
exit (1);
}
+sub exit_usage_exclude
+{
+ print "Available exclude MIBs:\n\n";
+ for (sort (keys %ExcludeOptions))
+ {
+ print " $_\n";
+ }
+ print "\n";
+ exit (1);
+}
+
=head1 NAME
snmp-probe-host.px - Find out what information an SNMP device provides.
The C<snmp-probe-host.px> script can be used to automatically generate SNMP
configuration snippets for collectd's snmp plugin (see L<collectd-snmp(5)>).
-This script parses the collectd configuration and detecs all "data" blocks that
+This script parses the collectd configuration and detects all "data" blocks that
are defined for the SNMP plugin. It then queries the device specified on the
-command line for all OIDs and registeres which OIDs could be answered correctly
+command line for all OIDs and registers which OIDs could be answered correctly
and which resulted in an error. With that information the script figures out
which "data" blocks can be used with this hosts and prints an appropriate
"host" block to standard output.
my $community = 'public';
my $conf;
my $working_data;
+my @excludes = ();
=head1 OPTIONS
SNMP community to use. Should be pretty straight forward.
+=item B<--exclude> I<MIB>
+
+This option can be used to exclude specific data from being enabled in the
+generated config. Currently the following MIBs are understood:
+
+=over 4
+
+=item B<IF-MIB>
+
+Exclude interface information, such as I<ifOctets> and I<ifPackets>.
+
+=back
+
=back
=cut
GetOptions ('H|host|hostname=s' => \$host,
'C|conf|config=s' => \$file,
'c|community=s' => \$community,
+ 'x|exclude=s' => \@excludes,
'h|help' => \&exit_usage) or die;
if (!$host)
exit (1);
}
+if (@excludes)
+{
+ my $tmp = join (',', @excludes);
+ my @tmp = split (/\s*,\s*/, $tmp);
+
+ @excludes = ();
+ for (@tmp)
+ {
+ my $mib = uc ($_);
+ if ($mib eq 'HELP')
+ {
+ exit_usage_exclude ();
+ }
+ elsif (!exists ($ExcludeOptions{$mib}))
+ {
+ print STDERR "No such MIB: $mib\n";
+ exit_usage_exclude ();
+ }
+ push (@excludes, $ExcludeOptions{$mib});
+ }
+}
+
$conf = get_config ($file) or die ("Cannot read config");
if (!defined ($conf->{'plugin'})
exit (1);
}
-probe_all ($host, $community, $conf->{'plugin'}{'snmp'}{'data'});
+probe_all ($host, $community, $conf->{'plugin'}{'snmp'}{'data'}, \@excludes);
exit (0);