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