diff options
Diffstat (limited to 'local/snmpdump.pl')
-rwxr-xr-x | local/snmpdump.pl | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/local/snmpdump.pl b/local/snmpdump.pl new file mode 100755 index 0000000..0220beb --- /dev/null +++ b/local/snmpdump.pl @@ -0,0 +1,107 @@ +#!/usr/bin/perl +# +# Reformat 'snmpcmd -d' style raw dump output +# into something a little easier to understand. +# + + +sub parse_dump { + # + # Basic formatting technique: + # Display the contents of each nested SEQUENCE + # indented from the enclosing level. + # Individual data fields are all on one line + # + my @data = @_; + my $indent = shift( @data ); + my $datalen = shift( @data ); + + while ( $datalen > 0 ) { + my ($tag, $tlen, $tmp); + my ($tag1, $tag2 ); + $tag = shift( @data ); + $tmp = shift( @data ); + $tlen = hex($tmp); + # + # Handle 2-octet lengths + if ( $tlen >= 128 ) { + $tlen -= 128; + $tmp = shift( @data ); + $tlen += hex($tmp); + } + $datalen -= ($tlen + 2 ); + + $tag1 = substr($tag, 0, 1); + $tag2 = substr($tag, 1, 1); + + # + # Sequence-based tags - display and indent + # + if ( $tag1 eq 3 ) { + print " "x$indent, "$tag $tmp\n"; + parse_dump( $indent+3, $tlen, @data ); + } + elsif ( $tag1 eq "A" ) { + print " "x$indent, "$tag $tmp\n"; + parse_dump( $indent+3, $tlen, @data ); + } + + # + # Leaf-data tags - just display + # + else { + $val = ""; + while ( $tlen > 0 ) { + $val .= " "; + $val .= shift( @data ); + $tlen--; + } + if ( $tag1 eq "0" ) { # leaf data + print " "x$indent, "$tag $tmp$val\n"; + } + elsif ( $tag1 eq "8" ) { # exceptions + print " "x$indent, "$tag $tmp$val\n"; + } + else { # unknown + print " "x$indent, "$tag $tmp$val\n"; + } + } + } +} + +$inpacket=0; +$rawdump=""; + +while (<>) { + if ( $inpacket ) { + # + # Strip off the extraneous junk, and join + # the raw dump output into a single line + # + if ( /^[0-9]*: / ) { + chomp; + s/^[0-9]*: //; + s/ .*$//; + s/ / /g; + $rawdump = "$rawdump $_"; + } else { + # + # Once this line is complete, display the + # dump in a vaguely sensible layout + # + @rawdata = split( " ", $rawdump ); + parse_dump( 3, $#rawdata, @rawdata ); + $inpacket=0; + $rawdump=""; + } + } else { + # + # Pass everything else through untouched + # + print; + if ( /^Sending / || /^Received / ) { + $inpacket=1; + $rawdump=""; + } + } +} |