Blame local/snmpdump.pl

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
}