diff options
Diffstat (limited to 'perl/OID/OID.pm')
-rw-r--r-- | perl/OID/OID.pm | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/perl/OID/OID.pm b/perl/OID/OID.pm new file mode 100644 index 0000000..fa6b162 --- /dev/null +++ b/perl/OID/OID.pm @@ -0,0 +1,256 @@ +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.0702'; + +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 |