network: Add missing freeaddrinfo on error path.
[collectd.git] / contrib / snmp-probe-host.px
index 1d8f975..9776af6 100755 (executable)
@@ -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);
       }
@@ -258,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.
@@ -276,9 +306,9 @@ 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.
@@ -294,6 +324,7 @@ my $file = '/etc/collectd/collectd.conf';
 my $community = 'public';
 my $conf;
 my $working_data;
+my @excludes = ();
 
 =head1 OPTIONS
 
@@ -318,6 +349,19 @@ Defaults to F</etc/collectd/collectd.conf>.
 
 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
@@ -325,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)
@@ -333,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'})
@@ -343,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);