⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ber.pm

📁 主要用于监控网络流量并动态产生可视化结果
💻 PM
📖 第 1 页 / 共 2 页
字号:
    $uptime %= (60 * 60 * 24);    $hours = int ($uptime / (60 * 60));    $uptime %= (60 * 60);    $minutes = int ($uptime / 60);    $seconds = $uptime % 60;    if ($days == 0){	$result = sprintf ("%d:%02d:%02d", $hours, $minutes, $seconds);    } elsif ($days == 1) {	$result = sprintf ("%d day, %d:%02d:%02d", 			   $days, $hours, $minutes, $seconds);    } else {	$result = sprintf ("%d days, %d:%02d:%02d", 			   $days, $hours, $minutes, $seconds);    }    return $result;}sub pretty_ip_address ($) {    my $pdu = shift;    my ($length, $rest);    return error ("IP Address tag (".snmp_ip_address_tag.") expected")	unless ord (substr ($pdu, 0, 1)) == snmp_ip_address_tag;    $pdu = substr ($pdu, 1);    ($length,$pdu) = decode_length ($pdu);    return error ("Length of IP address should be four")	unless $length == 4;    sprintf "%d.%d.%d.%d", unpack ("CCCC", $pdu);}sub hex_string ($) {    &hex_string_of_type ($_[0], octet_string_tag);}sub hex_string_of_type ($$) {    my ($pdu, $wanted_type) = @_;    my ($length);    return error ("BER tag ".$wanted_type." expected")	unless ord (substr ($pdu, 0, 1)) == $wanted_type;    $pdu = substr ($pdu, 1);    ($length,$pdu) = decode_length ($pdu);    hex_string_aux ($pdu);}sub hex_string_aux ($) {    my ($binary_string) = @_;    my ($c, $result);    $result = '';    for $c (unpack "C*", $binary_string) {	$result .= sprintf "%02x", $c;    }    $result;}sub decode_oid ($) {    my ($pdu) = @_;    my ($result,$pdu_rest);    my (@result);    $result = ord (substr ($pdu, 0, 1));    return error ("Object ID expected") unless $result == object_id_tag;    ($result, $pdu_rest) = decode_length (substr ($pdu, 1));    @result = (substr ($pdu, 0, $result + (length ($pdu) - length ($pdu_rest))),	       substr ($pdu_rest, $result));    @result;}sub decode_by_template {    my ($pdu) = shift;    local ($_) = shift;    return decode_by_template_2 ($pdu, $_, 0, 0, @_);}my $template_debug = 0;sub decode_by_template_2 {    my ($pdu, $template, $pdu_index, $template_index);    local ($_);    $pdu = shift;    $template = $_ = shift;    $pdu_index = shift;    $template_index = shift;    my (@results);    my ($length,$expected,$read,$rest);    while (0 < length ($_)) {	if (substr ($_, 0, 1) eq '%') {	    print STDERR "template $_ ", length $pdu," bytes remaining\n"		if $template_debug;	    $_ = substr ($_,1);	    ++$template_index;	    if (($expected) = /^(\d*|\*)\{(.*)/) {		## %{		$template_index += length ($expected) + 1;		print STDERR "%{\n" if $template_debug;		$_ = $2;		$expected = shift | constructor_flag if ($expected eq '*');		$expected = sequence_tag | constructor_flag		    if $expected eq '';		return template_error ("Expected sequence tag $expected, got ".				       ord (substr ($pdu, 0, 1)),				      $template,				      $template_index)		    unless (ord (substr ($pdu, 0, 1)) == $expected);		$pdu = substr ($pdu,1);		(($length,$pdu) = decode_length ($pdu))		    || return template_error ("cannot read length",					      $template, $template_index);		return template_error ("Expected length $length, got ".length $pdu ,				      $template, $template_index)		  unless length $pdu == $length;	    } elsif (($expected,$rest) = /^(\*|)s(.*)/) {		## %s		$template_index += length ($expected) + 1;		($expected = shift) if $expected eq '*';		(($read,$pdu) = decode_string ($pdu))		    || return template_error ("cannot read string",					      $template, $template_index);		print STDERR "%s => $read\n" if $template_debug;		if ($expected eq '') {		    push @results, $read;		} else {		    return template_error ("Expected $expected, read $read",					   $template, $template_index)			unless $expected eq $read;		}		$_ = $rest;	    } elsif (($rest) = /^A(.*)/) {		## %A		$template_index += 1;		{		    my ($tag, $length, $value);		    $tag = ord (substr ($pdu, 0, 1));		    return error ("Expected IP address, got tag ".$tag)			unless $tag == snmp_ip_address_tag;		    ($length, $pdu) = decode_length (substr ($pdu, 1));		    return template_error ("IP address must be four bytes long",					   $template, $template_index)			unless $length == 4;		    $read = substr ($pdu, 0, $length);		    $pdu = substr ($pdu, $length);		}		print STDERR "%A => $read\n" if $template_debug;		push @results, $read;		$_ = $rest;	    } elsif (/^O(.*)/) {		## %O		$template_index += 1;		$_ = $1;		(($read,$pdu) = decode_oid ($pdu))		  || return template_error ("cannot read OID",					    $template, $template_index);		print STDERR "%O => ".pretty_oid ($read)."\n"		    if $template_debug;		push @results, $read;	    } elsif (($expected,$rest) = /^(\d*|\*|)i(.*)/) {		## %i		$template_index += length ($expected) + 1;		print STDERR "%i\n" if $template_debug;		$_ = $rest;		(($read,$pdu) = decode_int ($pdu))		  || return template_error ("cannot read int",					    $template, $template_index);		if ($expected eq '') {		    push @results, $read;		} else {		    $expected = int (shift) if $expected eq '*';		    return template_error (sprintf ("Expected %d (0x%x), got %d (0x%x)",						    $expected, $expected, $read, $read),					   $template, $template_index)			unless ($expected == $read)		}	    } elsif (($rest) = /^u(.*)/) {		## %u		$template_index += 1;		print STDERR "%u\n" if $template_debug;		$_ = $rest;		(($read,$pdu) = decode_unsignedlike ($pdu))		  || return template_error ("cannot read uptime",					    $template, $template_index);		push @results, $read;	    } elsif (/^\@(.*)/) {		## %@		$template_index += 1;		print STDERR "%@\n" if $template_debug;		$_ = $1;		push @results, $pdu;		$pdu = '';	    } else {		return template_error ("Unknown decoding directive in template: $_",				       $template, $template_index);	    }	} else {	    if (substr ($_, 0, 1) ne substr ($pdu, 0, 1)) {		return template_error ("Expected ".substr ($_, 0, 1).", got ".substr ($pdu, 0, 1),				       $template, $template_index);	    }	    $_ = substr ($_,1);	    $pdu = substr ($pdu,1);	}    }    return template_error ("PDU too long", $template, $template_index)      if length ($pdu) > 0;    return template_error ("PDU too short", $template, $template_index)      if length ($_) > 0;    @results;}sub decode_sequence ($) {    my ($pdu) = @_;    my ($result);    my (@result);    $result = ord (substr ($pdu, 0, 1));    return error ("Sequence expected") unless $result == sequence_tag | constructor_flag;    ($result, $pdu) = decode_length (substr ($pdu, 1));    @result = (substr ($pdu, 0, $result), substr ($pdu, $result));    @result;}sub decode_int ($) {    my ($pdu) = @_;    my $tag = ord (substr ($pdu, 0, 1));    return error ("Integer expected, found tag ".$tag)	unless $tag == int_tag;    decode_intlike ($pdu);}sub decode_intlike ($) {    decode_intlike_s ($_[0], 1);}sub decode_unsignedlike ($) {    decode_intlike_s ($_[0], 0);}sub decode_intlike_s ($$) {    my ($pdu, $signedp) = @_;    my ($length,$result);    $length = ord (substr ($pdu, 1, 1));    my $ptr = 2;    $result = unpack ($signedp ? "c" : "C", substr ($pdu, $ptr++, 1));    while (--$length > 0) {	$result *= 256;	$result += unpack ("C", substr ($pdu, $ptr++, 1));    }    ($result, substr ($pdu, $ptr));}sub decode_string ($) {    my ($pdu) = shift;    my ($result);    $result = ord (substr ($pdu, 0, 1));    return error ("Expected octet string, got tag ".$result)	unless $result == octet_string_tag;    ($result, $pdu) = decode_length (substr ($pdu, 1));    return (substr ($pdu, 0, $result), substr ($pdu, $result));}sub decode_length ($) {    my ($pdu) = shift;    my ($result);    my (@result);    $result = ord (substr ($pdu, 0, 1));    if ($result & long_length) {	if ($result == (long_length | 1)) {	    @result = (ord (substr ($pdu, 1, 1)), substr ($pdu, 2));	} elsif ($result == (long_length | 2)) {	    @result = ((ord (substr ($pdu, 1, 1)) << 8)		       + ord (substr ($pdu, 2, 1)), substr ($pdu, 3));	} else {	    return error ("Unsupported length");	}    } else {	@result = ($result, substr ($pdu, 1));    }    @result;}#### OID prefix check### encoded_oid_prefix_p OID1 OID2###### OID1 and OID2 should be BER-encoded OIDs.### The function returns non-zero iff OID1 is a prefix of OID2.### This can be used in the termination condition of a loop that walks### a table using GetNext or GetBulk.###sub encoded_oid_prefix_p ($$) {    my ($oid1, $oid2) = @_;    my ($i1, $i2);    my ($l1, $l2);    my ($subid1, $subid2);    return error ("OID tag expected") unless ord (substr ($oid1, 0, 1)) == object_id_tag;    return error ("OID tag expected") unless ord (substr ($oid2, 0, 1)) == object_id_tag;    ($l1,$oid1) = decode_length (substr ($oid1, 1));    ($l2,$oid2) = decode_length (substr ($oid2, 1));    for ($i1 = 0, $i2 = 0;	 $i1 < $l1 && $i2 < $l2;	 ++$i1, ++$i2) {	($subid1,$i1) = &decode_subid ($oid1, $i1, $l1);	($subid2,$i2) = &decode_subid ($oid2, $i2, $l2);	return 0 unless $subid1 == $subid2;    }    return $i2 if $i1 == $l1;    return 0;}### decode_subid OID INDEX###### Decodes a subid field from a BER-encoded object ID.### Returns two values: the field, and the index of the last byte that### was actually decoded.###sub decode_subid ($$$) {    my ($oid, $i, $l) = @_;    my $subid = 0;    my $next;    while (($next = ord (substr ($oid, $i, 1))) >= 128) {	$subid = ($subid << 7) + ($next & 0x7f);	++$i;	return error ("decoding object ID: short field")	    unless $i < $l;    }    return (($subid << 7) + $next, $i);}sub error (@) {  $BER::errmsg = join ("",@_);  return undef;}sub template_error ($$$) {  my ($errmsg, $template, $index) = @_;  return error ($errmsg."\n  ".$template."\n  ".(' ' x $index)."^");}1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -