OID.pm
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:5k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. package NetSNMP::OID;
  2. use strict;
  3. use Carp;
  4. require Exporter;
  5. require DynaLoader;
  6. use AutoLoader;
  7. sub compare($$);
  8. use overload
  9.     '<=>' => &compare,
  10.     'cmp' => &oidstrcmp,
  11.     '""' => &quote_oid,
  12.     '+' => &add,
  13. ;
  14. use SNMP;
  15. sub quote_oid {
  16.     return $_[0]->{'oidptr'}->to_string();
  17. }
  18. sub length {
  19.     return $_[0]->{'oidptr'}->length();
  20. }
  21. sub get_indexes {
  22.     return $_[0]->{'oidptr'}->get_indexes();
  23. }
  24. sub append {
  25.     my $this = shift;
  26.     my $str = shift;
  27.     if (ref($str) eq 'NetSNMP::OID') {
  28. return $this->{'oidptr'}->append_oid($str->{'oidptr'});
  29.     }
  30.     $str = "." . $str if ($str =~ /^d+/);
  31.     if ($str =~ /^[.d]+/) {
  32. # oid segment
  33. return $this->{'oidptr'}->append($str);
  34.     }
  35.     if ($str =~ /^"(.*)"$/) {
  36. # string index
  37. my $newstr = "." . CORE::length($1);
  38. map { $newstr .= ".$_" } unpack("c*",$1);
  39. return $this->{'oidptr'}->append($newstr);
  40.     }
  41.     if ($str =~ /^'(.*)'$/) {
  42. # string index, implied
  43. my $newstr;
  44. map { $newstr .= ".$_" } unpack("c*",$1);
  45. return $this->{'oidptr'}->append($newstr);
  46.     }
  47.     # Just Parse it...
  48.     return $this->{'oidptr'}->append($str);
  49. }
  50. sub add {
  51.     my $this = shift;
  52.     my $str = shift;
  53.     my ($newoid, %newhash);
  54.     $newoid = %newhash;
  55.     $newoid->{'oidptr'} = $this->{'oidptr'}->clone();
  56.     bless($newoid, ref($this));
  57.     $newoid->append($str);
  58.     return $newoid;
  59. }
  60. use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK @EXPORT $VERSION $AUTOLOAD);
  61. @ISA = qw(Exporter DynaLoader);
  62. # Items to export into callers namespace by default. Note: do not export
  63. # names by default without a very good reason. Use EXPORT_OK instead.
  64. # Do not simply export all your public functions/methods/constants.
  65. # This allows declaration use NetSNMP::OID ':all';
  66. # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
  67. # will save memory.
  68. %EXPORT_TAGS = ( 'all' => [ qw(
  69. snmp_oid_compare
  70.         compare
  71. ) ] );
  72. @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
  73. @EXPORT = qw(
  74. snmp_oid_compare
  75.         compare
  76. );
  77. $VERSION = '5.2.2';
  78. sub new {
  79.     my $type = shift;
  80.     my $arg = shift;
  81.     if (!$arg) {
  82. $arg = $type;
  83. $type = "NetSNMP::OID";
  84.     }
  85.     SNMP::init_snmp("perl");
  86.     my $ptr = NetSNMP::OID::newptr($arg);
  87.     if ($ptr) {
  88.       return newwithptr($type, $ptr);
  89.     }
  90. }
  91. sub newwithptr {
  92.     my $type = shift;
  93.     my $ptr = shift;
  94.     my $self = {};
  95.     if (!$ptr) {
  96. $ptr = $type;
  97. $type = "NetSNMP::OID";
  98.     }
  99.     SNMP::init_snmp("perl");
  100.     $self->{'oidptr'} = $ptr;
  101.     bless($self, $type);
  102.     return $self;
  103. }
  104. sub snmp_oid_compare($$) {
  105.     my ($oid1, $oid2) = @_;
  106.     return _snmp_oid_compare($oid1->{oidptr}, $oid2->{oidptr});
  107. }
  108. sub compare($$) {
  109.     my ($v1, $v2) = @_;
  110.     snmp_oid_compare($v1, $v2);
  111. }
  112. sub oidstrcmp {
  113.     my ($v1, $v2) = @_;
  114.     $v1->{'oidptr'}->to_string cmp $v2->{'oidptr'}->to_string;
  115. }
  116. sub to_array($) {
  117.     my $self = shift;
  118.     return $self->{oidptr}->to_array();
  119. }
  120. sub AUTOLOAD {
  121.     # This AUTOLOAD is used to 'autoload' constants from the constant()
  122.     # XS function.  If a constant is not found then control is passed
  123.     # to the AUTOLOAD in AutoLoader.
  124.     my $constname;
  125.     ($constname = $AUTOLOAD) =~ s/.*:://;
  126.     croak "& not defined" if $constname eq 'constant';
  127.     my $val = constant($constname, @_ ? $_[0] : 0);
  128.     if ($! != 0) {
  129. if ($! =~ /Invalid/ || $!{EINVAL}) {
  130.     $AutoLoader::AUTOLOAD = $AUTOLOAD;
  131.     goto &AutoLoader::AUTOLOAD;
  132. }
  133. else {
  134.     croak "Your vendor has not defined NetSNMP::OID macro $constname";
  135. }
  136.     }
  137.     {
  138. no strict 'refs';
  139. # Fixed between 5.005_53 and 5.005_61
  140. if ($] >= 5.00561) {
  141.     *$AUTOLOAD = sub () { $val };
  142. }
  143. else {
  144.     *$AUTOLOAD = sub { $val };
  145. }
  146.     }
  147.     goto &$AUTOLOAD;
  148. }
  149. bootstrap NetSNMP::OID $VERSION;
  150. # Preloaded methods go here.
  151. # Autoload methods go after =cut, and are processed by the autosplit program.
  152. 1;
  153. __END__
  154. =head1 NAME
  155. NetSNMP::OID - Perl extension for manipulating OIDs
  156. =head1 SYNOPSIS
  157.   use NetSNMP::OID;
  158.   my $oid = new NetSNMP::OID('sysContact.0');
  159.   if ($oid < new NetSNMP::OID('ifTable')) {
  160.       do_something();
  161.   }
  162.   my @numarray = $oid->to_array();
  163.   # appending oids
  164.   $oid = new NetSNMP::OID('.1.3');
  165.   $oid += ".6.1";
  166.   # -> .1.3.6.1
  167.   # appending index strings
  168.   $oid2 = $oid + ""wes"";
  169.   # -> .1.3.6.1.3.119.101.115
  170.   $oid3 = $oid + "'wes'";
  171.   # -> .1.3.6.1.119.101.115
  172.   $len = $oid3->length();
  173.   # -> 7
  174.   # retrieving indexes from an oid:
  175.   $arrayref = $tableoid->get_indexes()
  176. =head1 DESCRIPTION
  177. The NetSNMP::OID module is a simple wrapper around a C-based net-snmp
  178. oid (which is an array of unsigned integers).  The OID is internally
  179. stored as a C array of integers for speed purposes when doing
  180. comparisons, etc.
  181. The standard logical expression operators (<, >, ==, ...) are
  182. overloaded such that lexographical comparisons may be done with them.
  183. The + operator is overloaded to allow you to append stuff on to the
  184. end of a OID, like index segments of a table, for example.
  185. =head2 EXPORT
  186. int snmp_oid_compare(oid1, oid2)
  187. int compare(oid1, oid2)
  188. =head1 AUTHOR
  189. Wes Hardaker, E<lt>hardaker@users.sourceforge.netE<gt>
  190. =head1 SEE ALSO
  191. L<SNMP>, L<perl>.
  192. =head1 Copyright
  193. Copyright (c) 2002 Networks Associates Technology, Inc.  All
  194. Rights Reserved.  This program is free software; you can
  195. redistribute it and/or modify it under the same terms as Perl
  196. itself.
  197. =cut