257 lines
5.2 KiB
Perl
257 lines
5.2 KiB
Perl
package NetSNMP::OID;
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Carp;
|
|
|
|
require Exporter;
|
|
require DynaLoader;
|
|
use AutoLoader;
|
|
|
|
sub compare($$);
|
|
|
|
use overload
|
|
'<=>' => \&compare,
|
|
'cmp' => \&oidstrcmp,
|
|
'""' => \"e_oid,
|
|
'+' => \&add,
|
|
;
|
|
|
|
use SNMP;
|
|
|
|
sub quote_oid {
|
|
return $_[0]->{'oidptr'}->to_string();
|
|
}
|
|
|
|
sub length {
|
|
return $_[0]->{'oidptr'}->length();
|
|
}
|
|
|
|
sub get_indexes {
|
|
return $_[0]->{'oidptr'}->get_indexes();
|
|
}
|
|
|
|
sub append {
|
|
my $this = shift;
|
|
my $str = shift;
|
|
|
|
if (ref($str) eq 'NetSNMP::OID') {
|
|
return $this->{'oidptr'}->append_oid($str->{'oidptr'});
|
|
}
|
|
$str = "." . $str if ($str =~ /^\d+/);
|
|
if ($str =~ /^[.\d]+/) {
|
|
# oid segment
|
|
return $this->{'oidptr'}->append($str);
|
|
}
|
|
if ($str =~ /^\"(.*)\"$/) {
|
|
# string index
|
|
my $newstr = "." . CORE::length($1);
|
|
map { $newstr .= ".$_" } unpack("c*",$1);
|
|
return $this->{'oidptr'}->append($newstr);
|
|
}
|
|
if ($str =~ /^\'(.*)\'$/) {
|
|
# string index, implied
|
|
my $newstr;
|
|
map { $newstr .= ".$_" } unpack("c*",$1);
|
|
return $this->{'oidptr'}->append($newstr);
|
|
}
|
|
# Just Parse it...
|
|
return $this->{'oidptr'}->append($str);
|
|
}
|
|
|
|
sub add {
|
|
my $this = shift;
|
|
my $str = shift;
|
|
my ($newoid, %newhash);
|
|
$newoid = \%newhash;
|
|
$newoid->{'oidptr'} = $this->{'oidptr'}->clone();
|
|
bless($newoid, ref($this));
|
|
$newoid->append($str);
|
|
return $newoid;
|
|
}
|
|
|
|
use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK @EXPORT $VERSION $AUTOLOAD);
|
|
|
|
@ISA = qw(Exporter DynaLoader);
|
|
|
|
# Items to export into callers namespace by default. Note: do not export
|
|
# names by default without a very good reason. Use EXPORT_OK instead.
|
|
# Do not simply export all your public functions/methods/constants.
|
|
|
|
# This allows declaration use NetSNMP::OID ':all';
|
|
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
|
|
# will save memory.
|
|
%EXPORT_TAGS = ( 'all' => [ qw(
|
|
snmp_oid_compare
|
|
compare
|
|
) ] );
|
|
|
|
@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
|
|
|
|
@EXPORT = qw(
|
|
snmp_oid_compare
|
|
compare
|
|
);
|
|
$VERSION = '5.08';
|
|
|
|
sub new {
|
|
my $type = shift;
|
|
my $arg = shift;
|
|
if (!$arg) {
|
|
$arg = $type;
|
|
$type = "NetSNMP::OID";
|
|
}
|
|
SNMP::init_snmp("perl");
|
|
my $ptr = NetSNMP::OID::newptr($arg);
|
|
if ($ptr) {
|
|
return newwithptr($type, $ptr);
|
|
}
|
|
}
|
|
|
|
sub newwithptr {
|
|
my $type = shift;
|
|
my $ptr = shift;
|
|
my $self = {};
|
|
if (!$ptr) {
|
|
$ptr = $type;
|
|
$type = "NetSNMP::OID";
|
|
}
|
|
SNMP::init_snmp("perl");
|
|
$self->{'oidptr'} = $ptr;
|
|
bless($self, $type);
|
|
return $self;
|
|
}
|
|
|
|
sub snmp_oid_compare($$) {
|
|
my ($oid1, $oid2) = @_;
|
|
return _snmp_oid_compare($oid1->{oidptr}, $oid2->{oidptr});
|
|
}
|
|
|
|
sub compare($$) {
|
|
my ($v1, $v2) = @_;
|
|
snmp_oid_compare($v1, $v2);
|
|
}
|
|
|
|
sub oidstrcmp {
|
|
my ($v1, $v2) = @_;
|
|
$v1->{'oidptr'}->to_string cmp $v2->{'oidptr'}->to_string;
|
|
}
|
|
|
|
sub to_array($) {
|
|
my $self = shift;
|
|
return $self->{oidptr}->to_array();
|
|
}
|
|
|
|
sub DESTROY {}
|
|
|
|
sub AUTOLOAD {
|
|
# This AUTOLOAD is used to 'autoload' constants from the constant()
|
|
# XS function. If a constant is not found then control is passed
|
|
# to the AUTOLOAD in AutoLoader.
|
|
|
|
my $constname;
|
|
($constname = $AUTOLOAD) =~ s/.*:://;
|
|
croak "& not defined" if $constname eq 'constant';
|
|
my $val;
|
|
($!, $val) = constant($constname);
|
|
if ($! != 0) {
|
|
if ($! =~ /Invalid/ || $!{EINVAL}) {
|
|
$AutoLoader::AUTOLOAD = $AUTOLOAD;
|
|
goto &AutoLoader::AUTOLOAD;
|
|
}
|
|
else {
|
|
croak "Your vendor has not defined NetSNMP::OID macro $constname";
|
|
}
|
|
}
|
|
{
|
|
no strict 'refs';
|
|
# Fixed between 5.005_53 and 5.005_61
|
|
if ($] >= 5.00561) {
|
|
*$AUTOLOAD = sub () { $val };
|
|
}
|
|
else {
|
|
*$AUTOLOAD = sub { $val };
|
|
}
|
|
}
|
|
goto &$AUTOLOAD;
|
|
}
|
|
|
|
bootstrap NetSNMP::OID $VERSION;
|
|
|
|
# Preloaded methods go here.
|
|
|
|
# Autoload methods go after =cut, and are processed by the autosplit program.
|
|
|
|
1;
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
NetSNMP::OID - Perl extension for manipulating OIDs
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
use NetSNMP::OID;
|
|
|
|
my $oid = new NetSNMP::OID('sysContact.0');
|
|
|
|
if ($oid < new NetSNMP::OID('ifTable')) {
|
|
do_something();
|
|
}
|
|
|
|
my @numarray = $oid->to_array();
|
|
|
|
# appending oids
|
|
$oid = new NetSNMP::OID('.1.3');
|
|
$oid += ".6.1";
|
|
# -> .1.3.6.1
|
|
|
|
# appending index strings
|
|
|
|
$oid2 = $oid + "\"wes\"";
|
|
# -> .1.3.6.1.3.119.101.115
|
|
|
|
$oid3 = $oid + "\'wes\'";
|
|
# -> .1.3.6.1.119.101.115
|
|
|
|
$len = $oid3->length();
|
|
# -> 7
|
|
|
|
# retrieving indexes from an oid:
|
|
$arrayref = $tableoid->get_indexes()
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
The NetSNMP::OID module is a simple wrapper around a C-based net-snmp
|
|
oid (which is an array of unsigned integers). The OID is internally
|
|
stored as a C array of integers for speed purposes when doing
|
|
comparisons, etc.
|
|
|
|
The standard logical expression operators (<, >, ==, ...) are
|
|
overloaded such that lexographical comparisons may be done with them.
|
|
|
|
The + operator is overloaded to allow you to append stuff on to the
|
|
end of a OID, like index segments of a table, for example.
|
|
|
|
=head2 EXPORT
|
|
|
|
int snmp_oid_compare(oid1, oid2)
|
|
int compare(oid1, oid2)
|
|
|
|
=head1 AUTHOR
|
|
|
|
Wes Hardaker, E<lt>hardaker@users.sourceforge.netE<gt>
|
|
|
|
=head1 SEE ALSO
|
|
|
|
L<SNMP>, L<perl>.
|
|
|
|
=head1 Copyright
|
|
|
|
Copyright (c) 2002 Networks Associates Technology, Inc. All
|
|
Rights Reserved. This program is free software; you can
|
|
redistribute it and/or modify it under the same terms as Perl
|
|
itself.
|
|
|
|
=cut
|