X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=contrib%2Fsnmp-probe-host.px;h=9776af6265e46030addd82572d3a2a7f16fe5740;hp=1cfaa0729f0c33617e2419d63e7efdb55dca01e5;hb=de407dd4e036f73e9bd4658af9d71f504fc11109;hpb=e6c7276f2e1294601f35d8ff852f6e4cd345f2f2 diff --git a/contrib/snmp-probe-host.px b/contrib/snmp-probe-host.px index 1cfaa072..9776af62 100755 --- a/contrib/snmp-probe-host.px +++ b/contrib/snmp-probe-host.px @@ -1,7 +1,8 @@ #!/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 @@ -27,6 +28,12 @@ use Config::General ('ParseConfig'); 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; @@ -50,6 +57,7 @@ sub probe_one { my $sess = shift; my $conf = shift; + my $excludes = @_ ? shift : []; my @oids; my $cmd = 'GET'; my $vl; @@ -90,6 +98,14 @@ sub probe_one $oid_orig = $tmp; } + for (@$excludes) + { + if ($oid_orig =~ $_) + { + return; + } + } + $vb = SNMP::Varbind->new ([$oid_orig]); if ($cmd eq 'GET') @@ -148,6 +164,7 @@ sub probe_all my $host = shift; my $community = shift; my $data = shift; + my $excludes = @_ ? shift : []; my $version = 2; my @valid_data = (); my $begin; @@ -203,7 +220,7 @@ sub probe_all for (keys %$data) { my $name = $_; - if (probe_one ($sess, $data->{$name})) + if (probe_one ($sess, $data->{$name}, $excludes)) { push (@valid_data, $name); } @@ -224,11 +241,6 @@ sub probe_all $version--; } # while ($version > 0) - if (!@valid_data) - { - return; - } - print < Address "$address" @@ -239,6 +251,14 @@ EOF { print " Collect \"$_\"\n"; } + if (!@valid_data) + { + print < @@ -255,11 +275,24 @@ Options are: -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. @@ -273,9 +306,9 @@ snmp-probe-host.px - Find out what information an SNMP device provides. The C script can be used to automatically generate SNMP configuration snippets for collectd's snmp plugin (see L). -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. @@ -291,6 +324,7 @@ my $file = '/etc/collectd/collectd.conf'; my $community = 'public'; my $conf; my $working_data; +my @excludes = (); =head1 OPTIONS @@ -315,6 +349,19 @@ Defaults to F. SNMP community to use. Should be pretty straight forward. +=item B<--exclude> I + +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 + +Exclude interface information, such as I and I. + +=back + =back =cut @@ -322,6 +369,7 @@ SNMP community to use. Should be pretty straight forward. 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) @@ -330,6 +378,28 @@ 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'}) @@ -340,7 +410,7 @@ 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);