Blame perl/OID/OID.pm

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