diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2010-11-09 16:23:40 -0800 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2010-11-09 16:23:40 -0800 |
commit | e262024889614e1e20718497ff03eb88efaecc2b (patch) | |
tree | 3dca68111089a9e005704e6d1d38ed6b076d2fef /scripts/vyatta-show-snmp.pl | |
parent | 002783d4e34a51ba54690170fd6c950f960810c9 (diff) | |
download | vyatta-op-e262024889614e1e20718497ff03eb88efaecc2b.tar.gz vyatta-op-e262024889614e1e20718497ff03eb88efaecc2b.zip |
Enhance show snmp command
Resolve usability issues with 'show snmp' by adding some more control
1. show snmp -- find usable community for loopback
2. show snmp community <name> -- check connectivity
3. show snmp community <name> host <addr> -- check remote connectivity
Diffstat (limited to 'scripts/vyatta-show-snmp.pl')
-rwxr-xr-x | scripts/vyatta-show-snmp.pl | 87 |
1 files changed, 73 insertions, 14 deletions
diff --git a/scripts/vyatta-show-snmp.pl b/scripts/vyatta-show-snmp.pl index 979234b..2346a6c 100755 --- a/scripts/vyatta-show-snmp.pl +++ b/scripts/vyatta-show-snmp.pl @@ -22,25 +22,84 @@ # use strict; use warnings; +use Getopt::Long; +use NetAddr::IP; -sub get_community { - my $snmpcfg = '/etc/snmp/snmpd.conf'; +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"; - open (my $cfg, '<', $snmpcfg) - or return; - my $community; while (<$cfg>) { - next unless m/^r[ow]community (\w+)/; - $community = $1; - last; + 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; + + return \%community; +} + +# expand list of available communities for allowed: tag +sub show_all { + my $community = read_config(); + + print join( ' ', keys( %{$community} ) ), "\n"; + exit 0; } -my $community = get_community(); -die "No SNMP communities configured\n" - unless $community; +# 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(); -exec 'snmpstatus', '-c', $community, '-v', '1', 'localhost' - or die "Can't exec snmpstatus: $!"; |