#! /usr/bin/perl # **** License **** # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # 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. # # This code was originally developed by Vyatta, Inc. # Portions created by Vyatta are Copyright (C) 2007 Vyatta, Inc. # All Rights Reserved. # # Author: Stephen Hemminger # Date: January 2010 # Description: Script to display SNMP information # # **** End License **** # use strict; use warnings; use Getopt::Long; use NetAddr::IP; my $SNMPDCFG = '/etc/snmp/snmpd.conf'; my $SNMPSTATUS = '/usr/bin/snmpstatus'; # generate list of communities in configuration file sub read_config { my %community; open( my $cfg, '<', $SNMPDCFG ) or die "Can't open $SNMPDCFG : $!\n"; while (<$cfg>) { chomp; s/#.*$//; my @cols = split; next unless ( $#cols > 0 && ( $cols[0] eq 'rocommunity' || $cols[0] eq 'rwcommunity' ) ); my $addr = ( $#cols > 1 ) ? $cols[2] : "0.0.0.0/0"; $community{ $cols[1] } = NetAddr::IP->new($addr); } close $cfg; return \%community; } # expand list of available communities for allowed: tag sub show_all { my $community = read_config(); print join( ' ', keys( %{$community} ) ), "\n"; exit 0; } # check status of any accessible community on localhost sub status_any { my $cref = read_config(); my %community = %{$cref}; my $localhost = new NetAddr::IP('localhost'); die "No SNMP community's configured\n" unless scalar(%community); foreach my $c ( keys %community ) { my $addr = $community{$c}; status( $c, $localhost->addr() ) if ( $addr->contains($localhost) ); } die "No SNMP community's accessible from ", $localhost->addr(), "\n"; } # check status of one community sub status { my ( $community, $host ) = @_; $host = 'localhost' unless defined($host); print "Status of SNMP community $community on $host\n"; exec $SNMPSTATUS, '-v1', '-c', $community, $host; die "Can't exec $SNMPSTATUS : $!"; } sub usage { print "usage: $0 [--community=name [--host=hostname]]\n"; print " $0 --allowed\n"; exit 1; } my ( $host, $community, $allowed ); GetOptions( "host=s" => \$host, "community=s" => \$community, "allowed" => \$allowed, ) or usage(); show_all() if ($allowed); status( $community, $host ) if ( defined($community) ); status_any();