Net-Frame-Layer-SNMP
view release on metacpan or search on metacpan
lib/Net/Frame/Layer/SNMP.pm view on Meta::CPAN
sub match {
my $self = shift;
my ($with) = @_;
my $sPduType = $self->pdu_type;
my $sReqId = $self->requestId;
my $wPduType = $with->pdu_type;
my $wReqId = $with->requestId;
if ((($sPduType == NF_SNMP_PDUTYPE_GET)
|| ($sPduType == NF_SNMP_PDUTYPE_GETNEXT)
|| ($sPduType == NF_SNMP_PDUTYPE_SET)
|| ($sPduType == NF_SNMP_PDUTYPE_GETBULK)
|| ($sPduType == NF_SNMP_PDUTYPE_INFORM))
&& ($wPduType == NF_SNMP_PDUTYPE_RESPONSE)
&& ($sReqId == $wReqId)) {
return 1;
}
0;
}
# XXX: may be better, by keying on type also
sub getKey { shift->layer }
sub getKeyReverse { shift->layer }
sub getLength {
my $self = shift;
return length($self->pack)
}
sub pack {
my $self = shift;
my $raw;
if (($self->pdu_type == NF_SNMP_PDUTYPE_GET)
|| ($self->pdu_type == NF_SNMP_PDUTYPE_GETNEXT)
|| ($self->pdu_type == NF_SNMP_PDUTYPE_RESPONSE)
|| ($self->pdu_type == NF_SNMP_PDUTYPE_SET)
|| ($self->pdu_type == NF_SNMP_PDUTYPE_INFORM)
|| ($self->pdu_type == NF_SNMP_PDUTYPE_V2TRAP)
|| ($self->pdu_type == NF_SNMP_PDUTYPE_REPORT)) {
$raw = $snmpasn->encode(
version => $self->version,
community => $self->community,
pdu_type => {
$PDUTYPES[$self->pdu_type] => {
requestId => $self->requestId,
errorStatus => $self->errorStatus,
errorIndex => $self->errorIndex,
varbindlist => [$self->varbindlist]
}
}
);
if (defined($snmpasn->error)) {
print $snmpasn->error;
return
}
} elsif ($self->pdu_type == NF_SNMP_PDUTYPE_TRAP) {
my $agent_addr;
if ($self->agentAddr =~ /:/) {
$agent_addr = inet6Aton($self->agentAddr)
} else {
$agent_addr = inetAton($self->agentAddr)
}
$raw = $snmpasn->encode(
version => $self->version,
community => $self->community,
pdu_type => {
$PDUTYPES[$self->pdu_type] => {
entOid => $self->entOid,
agentAddr => $agent_addr,
genericTrap => $self->genericTrap,
specificTrap => $self->specificTrap,
timeticks => $self->timeticks,
varbindlist => [$self->varbindlist]
}
}
);
if (defined($snmpasn->error)) {
print $snmpasn->error;
return
}
} elsif ($self->pdu_type == NF_SNMP_PDUTYPE_GETBULK) {
$raw = $snmpasn->encode(
version => $self->version,
community => $self->community,
pdu_type => {
$PDUTYPES[$self->pdu_type] => {
requestId => $self->requestId,
nonRepeaters => $self->nonRepeaters,
maxRepetitions => $self->maxRepetitions,
varbindlist => [$self->varbindlist]
}
}
);
if (defined($snmpasn->error)) {
print $snmpasn->error;
return
}
}
return $self->raw($raw);
}
sub unpack {
my $self = shift;
my $pdu = $snmpasn->decode($self->raw);
if (defined($snmpasn->error)) {
print $snmpasn->error;
return
}
$self->version($pdu->{version});
$self->community($pdu->{community});
my $pdutype = sprintf "%s", keys(%{$pdu->{pdu_type}});
$self->pdu_type($PDUTYPES{$pdutype});
if (($self->pdu_type == NF_SNMP_PDUTYPE_GET)
|| ($self->pdu_type == NF_SNMP_PDUTYPE_GETNEXT)
|| ($self->pdu_type == NF_SNMP_PDUTYPE_RESPONSE)
|| ($self->pdu_type == NF_SNMP_PDUTYPE_SET)
lib/Net/Frame/Layer/SNMP.pm view on Meta::CPAN
if ($params{'type'} eq 'null') {
$params{'value'} = 1
}
my %hash = (
oid => $params{'oid'},
value => {
$params{'type'} => $params{'value'}
}
);
return \%hash;
}
sub v2trap_varbinds {
my $self = shift;
my %params = (
oid => '1.3.6.1.4.1.50000',
timeticks => time(),
);
if (@_ == 1) {
return(undef)
} else {
my %cfg = @_;
for (keys(%cfg)) {
if (/^-?oid$/i) {
$params{'oid'} = $cfg{$_}
} elsif (/^-?time(?:ticks)?$/i) {
$params{'timeticks'} = $cfg{$_}
}
}
}
my %hash1 = (
oid => '1.3.6.1.2.1.1.3.0',
value => {
timeticks => $params{'timeticks'}
}
);
my %hash2 = (
oid => '1.3.6.1.6.3.1.1.4.1.0',
value => {
oid => $params{'oid'}
}
);
my @varbinds;
push @varbinds, \%hash1;
push @varbinds, \%hash2;
return @varbinds;
}
sub _inetNtoa {
my ($addr) = @_;
if (length($addr) == 4) {
return inet_ntoa($addr)
} else {
return inet6Ntoa($addr)
}
}
1;
__END__
=head1 NAME
Net::Frame::Layer::SNMP - Simple Network Management Protocol layer object
=head1 SYNOPSIS
use Net::Frame::Simple;
use Net::Frame::Layer::SNMP qw(:consts);
my $snmp = Net::Frame::Layer::SNMP->new(
version => NF_SNMP_VERSION_2,
community => 'public',
requestId => getRandom16bitsInt(),
errorStatus => 0,
errorIndex => 0,
varbindlist => [],
);
#
# Read a raw layer
#
my $layer = Net::Frame::Layer::SNMP->new(raw => $raw);
print $layer->print."\n";
print 'PAYLOAD: '.unpack('H*', $layer->payload)."\n"
if $layer->payload;
=head1 DESCRIPTION
This modules implements the encoding and decoding of the SNMP layer.
See also B<Net::Frame::Layer> for other attributes and methods.
=head1 ATTRIBUTES
=over 4
=item B<version>
SNMP version. This module supports version 1 and version 2(c).
=item B<community>
SNMP community string.
=item B<requestId>
=item B<errorStatus>
=item B<errorIndex>
SNMP fields for Get, GetNext, Response, Set, Inform, V2Trap and Report PDU types.
( run in 0.861 second using v1.01-cache-2.11-cpan-39bf76dae61 )