		  The Perl5 'SNMP' Extension Module
		      for the Net-SNMP Library

Contents:
   Introduction:
   Availability:
   Contact:
   Supported Platforms:
   Release Notes:
   Installation:
   Operational Description:
   Trouble Shooting:
   Acknowledgments:
   History:
   Copyright:

Introduction:

   ******************************NOTE NOTE NOTE**************************
     This module now relies on many other modules.  Ideally, do not try
     to build it independently, as it won't work as well.  Instead of
     running "perl Makefile.PL" in this directory, run it in the
     net-snmp/perl directory instead which has a global makefile used to
     build all the sub-modules in their proper order.
   ******************************NOTE NOTE NOTE**************************

   Note: The perl SNMP 5.x module which comes with net-snmp 5.0 and
   higher is different than previous versions in a number of ways.  Most
   importantly, it behaves like a proper net-snmp application and calls
   init_snmp properly, which means it will read configuration files and
   use those defaults where appropriate automatically parse MIB files,
   etc.  This will likely affect your perl applications if you have, for
   instance, default values set up in your snmp.conf file (as the perl
   module will now make use of those defaults).  The docmuentation,
   however, has sadly not been updated yet (aside from this note).

   This is the Perl5 'SNMP' extension module. The SNMP module provides a
   full featured, tri-lingual SNMP (SNMPv3, SNMPv2c, SNMPv1) API. The
   SNMP module also provides an interface to the SMI MIB parse-tree for
   run-time access to parsed MIB data.  The SNMP module internals rely on
   the Net-SNMP toolkit library (previously known as ucd-snmp). For
   information on the Net-SNMP library see the documentation provided
   with the Net-SNMP distribution or the project web page available on
   'Source Forge':

   http://www.net-snmp.org/

Availability:

   The most recent release of the Perl5 SNMP module can be found bundled
   with the latest Net-SNMP distibution available from:

     http://www.net-snmp.org/download.html

   (Note: The perl SNMP distribution obtained this way has the highest
   chance of being up to date and compatible with the Net-SNMP version
   with which it is bundled.)

   A seperately bundled package of the SNMP module can be obtained from CPAN.

   (Note: In previous releases this module was compatible with the CMU
   SNMP library. Starting with Perl5/SNMP-1.7 this module will *only*
   work with the Net-SNMP (aka ucd-snmp) library due to dependence on new
   features)

Contact:

   The following mailing list should be consider the primary support
   mechanism for this module:

   net-snmp-users ATATAT lists.sourceforge.net mail list

   (see http://www.net-snmp.org/lists/users/ to subscribe)

Supported Platforms:

   Linux 1.2.x, 2.x
   Solaris 2.x                (see the net-snmp README.solaris file!)
   MS Windows
   Many other UNIX variants
   Let us know what it *doesn't* work on, as it should on most systems

Release Notes:

   SNMP module version 5.x is being developed against NET-SNMP-5.0
   see http://www.net-snmp.org/ for details.

   Compatibility with earlier or later versions of Net-SNMP or
   UCD-SNMP is not guaranteed due to the dynamic nature of open
   software development :).  The perl module will check the version of
   net-snmp you have installed for a match and warn you if they don't
   match exactly.

KNOWN BUGS:

   The make test suite likely won't work perfectly.  It relies on
   running an existing Net-SNMP SNMP agent and various configuration
   which makes it very hard to ensure exact compatibility.  If "make
   test" fails on you we suggest you install the module anyway.

   (none?)  (HA!)

**********************************************************************
* the rest of this file is likely out of date ************************
* the rest of this file is likely out of date ************************
* the rest of this file is likely out of date ************************
**********************************************************************

Installation:

   Build and install the Net-SNMP package - see Net-SNMP README and
   INSTALL docs.

   (Note: To ensure that any previous Net-SNMP, ucd-snmp or cmu snmp
   installation's library or headers are not used by mistake, use the
   -NET-SNMP-CONFIG directive to explicitly set the path to the
   net-snmp-config command that knows about the net-snmp installation you
   want to use.)

   NOTE: build all the perl modules at once using the Makefile.PL in the
   net-snmp/perl directory rather than the one in this directory.

   Unix:

   cd net-snmp/perl
   perl Makefile.PL [-NET-SNMP-CONFIG="sh ../../net-snmp-config"] [-NET-SNMP-IN-SOURCE=true]
   make
   make test
   make install

   FreeBSD:

   cd net-snmp/perl
   perl Makefile.PL -NET-SNMP-CONFIG="sh ../../net-snmp-config" -NET-SNMP-IN-SOURCE=true
   make
   make test
   make install

   Win32 (MSVC++)

   This section covers installation of the Perl modules for Microsoft Visual 
   C++ 6.0 and Microsoft Microsoft Development Environment 2003/2003 
   (MSVC 7.0/7.1).  See the following sections for Cygwin and MinGW.

   ActiveState Perl is required.  

   Note: With ActiveState Perl (currently at 5.8.2 build 808) and possibly other 
         versions of Perl on Windows, if a Perl script modifies a
         system environment variable and then calls a C function, the
         C function will not see the new environment variable.  This
         problem can be seen with the failure of test #3 in the SNMP
         conf test (perl/SNMP/t/conf.t).  The change to the
         SNMPCONFPATH env variable is not seen by the calls to the C
         SNMP module.

   Note: The source code should *not* be in a folder that contains a space.  For
         example, compiling in your 'My Documents' or your Desktop (usually
         c:\Documents and Settings\xxxx\Desktop) is not supported.
        
   Automatic building / testing with nmakeperl.bat:

   1.  Ensure a static version of Net-SNMP has been compiled and
       installed.  Also ensure the DLL version of snmplib has been
       compiled and installed.  The Perl modules will not function
       correctly without a shared snmplib library or DLL.

   2.  Install the regex win32 package (gnu_regex.exe).  It is available from

       http://people.delphiforums.com/gjc/gnu_regex.html

       a.  Copy regex.h to the include folder of MSVC++

           Example: "C:\Program Files\Microsoft Visual Studio .NET 2003\
                     Vc7\include\regex.h"

       b.  Copy gnu_regex.lib to the lib folder of MSVC++

           Example: "C:\Program Files\Microsoft Visual Studio .NET 2003\
                     Vc7\lib\gnu_regex.lib"

       c.  Copy gnu_regex.dll to your %windir%\system32 folder

           Example: "C:\winnt\system32\gnu_regex.dll"

   3.  Set the environment PATH to locate "nmake", "cl", and "link".
       Visual Studio installs a VCVARS32.BAT batch file for this purpose.

   4.  Using a command prompt window, cd to the source base directory.

   5.  Invoke win32\nmakeperl.bat to build the Perl SNMP modules.  If you see 
       errors, review the "nmake.out" file first.  If no errors there,
       then the modules built correctly, but the tests did not rigourously
       prove the mettle of the modules.  Review "nmaketest.out".  If the
       first three sections mostly pass, the modules are well formed.

       NOTE: If the tests fail, there may be a perl application left hanging.
             Use the Task Manager to remove any stale perl or snmp*.exe process.

   6.  The final step is to invoke "nmake install".  If no errors occurred,
       then the SNMP modules are available for use by your Perl programs.


   Manual building / testing:

   1.  Ensure a static version of Net-SNMP has been compiled and
       installed.  Also ensure the DLL version of snmplib has been
       compiled and installed.  The Perl modules will not function
       correctly without a shared snmplib library or DLL.

   2.  Install the regex win32 package (gnu_regex.exe).  It is available from

       http://people.delphiforums.com/gjc/gnu_regex.html

       a.  Copy regex.h to the include folder of MSVC++

           Example: "C:\Program Files\Microsoft Visual Studio .NET 2003\
                     Vc7\include\regex.h"

       b.  Copy gnu_regex.lib to the lib folder of MSVC++

           Example: "C:\Program Files\Microsoft Visual Studio .NET 2003\
                     Vc7\lib\gnu_regex.lib"

       c.  Copy gnu_regex.dll to your %windir%\system32 folder

           Example: "C:\winnt\system32\gnu_regex.dll"

   3.  Set the environment PATH to locate "nmake", "cl", and "link".
       Visual Studio installs a VCVARS32.BAT for this purpose.

   4.  Using a command prompt window, cd to the perl directory.

   5.  Type: 

         perl Makefile.PL CAPI=TRUE -NET-SNMP-IN-SOURCE=TRUE

          to compile against the RELEASE version of Net-SNMP, or:

         perl Makefile.PL CAPI=TRUE -NET-SNMP-IN-SOURCE=TRUE -NET-SNMP-DEBUG=TRUE

          to compile against the DEBUG version of Net-SNMP.
    
         nmake
         nmake test
         nmake install

         Note: The --NET-SNMP-IN-SOURCE=TRUE causes the Makefile to use the 
               library files from the installed Net-SNMP directory.
               To specify the installed Net-SNMP directory, use:

               perl Makefile.PL CAPI=TRUE -NET-SNMP-PATH="c:\usr"

               Note: -NET-SNMP-DEBUG has no effect while compiling against an 
                     installed copy of Net-SNMP.

         Note: To include OpenSSL, see the net-snmp/README.win32 to compile 
               libsnmp with libeay32 and see that libeay.lib is in the
               lib folder, or in the lib folder of the installed
               Net-SNMP if using -NET-SNMP-PATH.  For example,
               c:\usr\lib

   Note: 'nmake test' will automatically start and stop the
          agent(snmpd) and trap receiver (snmptrapd) while testing the
          SNMP module.


   Win32 (Cygwin):

   cd net-snmp\perl
   perl Makefile.PL -NET-SNMP-IN-SOURCE=true
   make
   make test
   make install

   If you get an error saying your system can't compile, you are
   probably missing the regex library.  Install regex from
   http://mirrors.sunsite.dk/cygwin/release/regex/regex-4.4-2-src.tar.bz2

   Note: The source code should *not* be in a folder that contains a space.  For
         example, compiling in your 'My Documents' or your Desktop (usually
         c:\Documents and Settings\xxxx\Desktop) is not supported.


   Win32 (MinGW):

   Note:  As of February 25th, 2004, the MinGW build of Net-SNMP does not
          compile the DLL version of libsnmp.  Some modules will not function
          correctly without a shared library / DLL.  The OID module does not
          appear to work at all without the DLL, and some parts of other 
          modules may not work.  For example, sharing configurations between
          modules which is why the SNMP conf test fails.

   Note: The source code should *not* be in a folder that contains a space.  For
         example, compiling in your 'My Documents' or your Desktop (usually
         c:\Documents and Settings\xxxx\Desktop) is not supported.
          
   These directions are for MinGW 3.1.0 with MSYS 1.0.9 and ActiveState Perl.
   Compiling the Perl modules using a MinGW built Perl environment has not
   been tested.

   Note: With ActiveState Perl (currently at 5.8.2 build 808) and
         possibly other versions of Perl on Windows, if a Perl script
         modifies a system environment variable and then calls a C
         function, the C function will not see the new environment
         variable.  This problem can be seen with the failure of test
         #3 in the SNMP conf test (perl/SNMP/t/conf.t).  The change to
         the SNMPCONFPATH env variable is not seen by the calls to the
         C SNMP module.

   The main Net-SNMP package must be compiled with the regex library.  
   See Net-SNMP README.win32 for compiling with MinGW.

   The following additional software is required:

    dmake:
    http://www.cpan.org/authors/id/GSAR/dmake-4.1pl1-win32.zip  

    ExtUtils-FakeConfig:
    http://search.cpan.org/~mbarbon/ExtUtils-FakeConfig-0.05/

   Note: A PPM package is available from ActiveState for
          ExtUtils-FakeConfig, but it does not include the
          make_implib.pl script.  Downloading from CPAN is
          recommended.

   Installing DMAKE and ExtUtils-FakeConfig:
   -----------------------------------------

   1.  Install DMAKE as described in the README.NOW contained in the DMAKE .ZIP 
       file ensuring the DMAKE program can be found in the system path.

   2.  Extract ExtUtils-FakeConfig-0.05.zip to a temporary folder.

   3.  Add the MinGW bin folder to your system path.

   4.  Open a Windows command prompt (cmd) and cd into
       ExtUtils-FakeConfig-0.05 and typet he following to build and
       install the ExtUtils-FakeConfig module:

       perl Makefile.PL
       dmake
       dmake install

   5.  A Perl import library needs to be created using the ExtUtils-FakeConfig 
       make_implib.pl script.  

       For ActiveState Perl 5.6.x installed to c:\Perl, type the
       following on one line:

         perl script/make_implib.pl --output-dir=C:/Perl/lib/CORE 
           --output-lib=libperl56.a --target=mingw c:/Perl/bin/Perl56.dll

       For ActiveState Perl 5.8.x installed to c:\Perl, type the
       following on one line:

         perl script/make_implib.pl --output-dir=C:/Perl/lib/CORE 
           --output-lib=libperl58.a --target=mingw c:/Perl/bin/Perl58.dll


Building the Perl module:
-------------------------

   1.  Complete the section titled 'Installing DMAKE and ExtUtils-FakeConfig'

   2.  Open an MSYS shell and cd into the net-snmp/Perl folder and type the 
       following on one line:

         perl -MConfig_m Makefile.PL -NET-SNMP-IN-SOURCE=true DEFINE=-DMINGW_PERL

   3.  Open a Windows command prompt (cmd) and cd into the net-snmp/perl folder 
       and type:

         dmake
         dmake test
         dmake install

       Note:  'dmake test' will automatically start and stop the agent(snmpd) and 
              trap receiver (snmptrapd) while testing the SNMP module.  

   4.  Remove the MinGW bin folder to your system path if it was not already in
       your path for step 3 of 'Installing DMAKE and ExtUtils-FakeConfig'.


   Operational Description:

   The basic operations of the SNMP protocol are provided by this module
   through an object oriented interface for modularity and ease of use.
   The primary class is SNMP::Session which encapsulates the persistent
   aspects of a connection between the management application and the
   managed agent. Internally the class is implemented as a blessed hash
   reference. This class supplies 'get', 'getnext', 'set', 'fget', and
   'fgetnext' and other method calls. The methods take a variety of input
   argument formats and support both synchronous and asynchronous
   operation through a polymorphic API (i.e., method behaviour varies
   dependent on args passed - see below).

   A description of the fields which can be specified when an
   SNMP::Session object is created follows:

   SNMP::Session
   public:
    DestHost    - default 'localhost', hostname or ip addr of SNMP agent
    Community   - default 'public', SNMP community string (used for both R/W)
    Version     - default '1', [2 (same as 2c), 2c, 3]
    RemotePort  - default '161', allow remote UDP port to be overridden
    Timeout     - default '1000000', micro-seconds before retry
    Retries     - default '5', retries before failure
    RetryNoSuch - default '0', if enabled NOSUCH errors in 'get' pdus will
                  be repaired, removing the varbind in error, and resent -
                  undef will be returned for all NOSUCH varbinds, when set
                  to '0' this feature is disabled and the entire get request
                  will fail on any NOSUCH error (applies to v1 only)
    SecName     - default 'initial', security name (v3)
    SecLevel    - default 'noAuthNoPriv', security level [noAuthNoPriv,
                  authNoPriv, authPriv] (v3)
    SecEngineId - default <none>, security engineID, will be probed if not
                  supplied (v3)
    ContextEngineId - default <SecEngineId>, context engineID, will be
                      probed if not supplied (v3)
    Context     - default '', context name (v3)
    AuthProto   - default 'MD5', authentication protocol [MD5, SHA] (v3)
    AuthPass    - default <none>, authentication passphrase
    PrivProto   - default 'DES', privacy protocol [DES] (v3)
    PrivPass    - default <none>, privacy passphrase (v3)
    VarFormats  - default 'undef', used by 'fget[next]', holds an hash
                  reference of output value formatters, (e.g., {<obj> =>
                  <sub-ref>, ... }, <obj> must match the <obj> and format
                  used in the get operation. A special <obj>, '*', may be
                  used to apply all <obj>s, the supplied sub is called to
                  translate the value to a new format. The sub is called
                  passing the Varbind as the arg
    TypeFormats - default 'undef', used by 'fget[next]', holds an hash
                  reference of output value formatters, (e.g., {<type> =>
                  <sub-ref>, ... }, the supplied sub is called to translate
                  the value to a new format, unless a VarFormat mathces first
                  (e.g., $session->{TypeFormats}{INTEGER} = \&mapEnum();
                   although this can be done more efficiently by enabling
                   $SNMP::use_enums or session creation param 'UseEnums')
    UseLongNames - defaults to the value of SNMP::use_long_names at time
                  of session creation. set to non-zero to have <tags>
                  for 'getnext' methods generated preferring longer Mib name
                  convention (e.g., system.sysDescr vs just sysDescr)
    UseSprintValue - defaults to the value of SNMP::use_sprint_value at time
                  of session creation. set to non-zero to have return values
                  for 'get' and 'getnext' methods formatted with the libraries
                  sprint_value function. This will result in certain data types
                  being returned in non-canonical format Note: values returned
                  with this option set may not be appropriate for 'set' operations
                  (see discussion of value formats in <vars> description section)
    UseEnums    - defaults to the value of SNMP::use_enums at time of session
                  creation. set to non-zero to have integer return values
                  converted to enumeration identifiers if possible, these values
                  will also be acceptable when supplied to 'set' operations
    UseNumeric  - defaults to the value of SNMP::use_numeric at time of session
                  creation. set to non-zero to have <tags> returned by the 'get'
                  methods untranslated (i.e. dotted-decimal).  Setting the
                  UseLongNames value for the session is highly recommended.
    BestGuess   - defaults to the value of SNMP::best_guess at time of session
                  creation. this setting controls how <tags> are parsed.  setting 
                  to 0 causes a regular lookup.  setting to 1 causes a regular 
                  expression match (defined as -Ib in snmpcmd) and setting to 2 
                  causes a random access lookup (defined as -IR in snmpcmd).
    ErrorStr    - read-only, holds the error message assoc. w/ last request
    ErrorNum    - read-only, holds the snmp_err or status of last request
    ErrorInd    - read-only, holds the snmp_err_index when appropriate

   private:
    DestAddr    - internal field used to hold the translated DestHost field
    SessPtr     - internal field used to cache a created session structure

   methods:
    new(<fields>)   - Constructs a new SNMP::Session object. The fields are
                      passed to the constructor as a hash list
                      (e.g., $session = new SNMP::Session(DestHost => 'foo',
                      Community => 'private');), returns an object reference
                      or undef in case of error.
    update(<fields>)- Updates the SNMP::Session object with the values fields
                      passed in as a hash list (similar to new(<fields>))
                      (WARNING! not fully implemented)
    get(<vars>[,<callback>])
                    - do SNMP GET, multiple <vars> formats accepted.
                      for synchronous operation <vars> will be updated
                      with value(s) and type(s) and will also return
                      retrieved value(s). If <callback> supplied method
                      will operate asynchronously
    fget(<vars>[,<callback>])
                    - do SNMP GET like 'get' and format the values according
                      the handlers specified in $sess->{VarFormats} and
                      $sess->{TypeFormats}. Async *not supported*
    getnext(<vars>[,<callback>])
                    - do SNMP GETNEXT, multiple <vars> formats accepted,
                      returns retrieved value(s), <vars> passed as arguments are
                      updated to indicate next lexicographical <obj>,<iid>,<val>,
                      and <type> Note: simple string <vars>,(e.g., 'sysDescr.0')
                      form is not updated. If <callback> supplied method
                      will operate asynchronously
    fgetnext(<vars>[,<callback>])
                    - do SNMP GETNEXT like getnext and format the values according
                      the handlers specified in $sess->{VarFormats} and
                      $sess->{TypeFormats}. Async *not supported*
    set(<vars>[,<callback>])
                    - do SNMP SET, multiple <vars> formats accepted.
                      the value field in all <vars> formats must be in a canonical
                      format (i.e., well known format) to ensure unambiguous
                      translation to SNMP MIB data value (see discussion of
                      canonical value format <vars> description section),
                      returns true on success or undef on error. If <callback>
                      supplied method will operate asynchronously
    getbulk(<non-repeaters>, <max-repeaters>, <vars> [, <callback>])
                    - do an SNMP GETBULK, from the list of Varbinds, the single
                      next lexico instance is fetched for the first n Varbinds
                      as defined by <non-repeaters>. For remaining Varbinds,
                      the m lexico instances are retrieved each of the remaining
                      Varbinds, where m is <max-repeaters>.
    bulkwalk(<non-repeaters>, <max-repeaters>, <vars> [, <callback>])
                    - do an "SNMP bulkwalk" on the given variables.  Bulkwalk is
                      implemented by sending an SNMP GETBULK request to fetch the
                      variables.  Objects are copied to the return list until the
                      sub-tree is exited.  If the request is not completed at the
                      end of a packet, a new request is created, starting where
                      the previous packet left off.  This implementation is able
                      to handle multiple repeated vars, as well as non-repeaters.
                      Returns a list (or, in scalar context, a reference to a
                      list) of arrays of VarBinds.  The VarBinds consist of the
                      responses for each requested variable.  bulkwalk() leaves
                      the original Varbinds list intact to facilitate querying
                      of multiple devices.

   SNMP::TrapSession - supports all applicable fields from SNMP::Session
                       (see above)
   methods:
    new(<fields>)   - Constructs a new SNMP::TrapSession object. The fields are
                      passed to the constructor as a hash list
                      (e.g., $trapsess = new SNMP::Session(DestHost => 'foo',
                      Community => 'private');), returns an object reference
                      or undef in case of error.
    trap(enterprise, agent, generic, specific, uptime, <vars>)
       $sess->trap(enterprise=>'.1.3.6.1.4.1.2021', # or 'ucdavis' [default]
                   agent => '127.0.0.1', # or 'localhost',[dflt 1st intf on host]
                   generic => specific,  # can be omitted if 'specific' supplied
                   specific => 5,        # can be omitted if 'generic' supplied
                   uptime => 1234,       # dflt to localhost uptime (0 on win32)
                   [[ifIndex, 1, 1],[sysLocation, 0, "here"]]); # optional vars
                                                                # always last
    or v2 format
    trap(oid, uptime, <vars>)
       $sess->trap(oid => 'snmpRisingAlarm',
                   uptime => 1234,
                   [[ifIndex, 1, 1],[sysLocation, 0, "here"]]); # optional vars
                                                                # always last


   Acceptable variable formats:
   <vars> may be one of the following forms:

    SNMP::VarList:  - represents an array of MIB objects to get or set,
                      implemented as a blessed reference to an array of
                      SNMP::Varbinds, (e.g., [<varbind1>, <varbind2>, ...])

    SNMP::Varbind:  - represents a single MIB object to get or set, implemented as
                      a blessed reference to a 4 element array;
                      [<obj>, <iid>, <val>, <type>].
                      <obj>  - one of the following forms:
                             1) leaf identifier (e.g., 'sysDescr') assumed to be
                                unique for practical purposes
                             2) fully qualified identifier (e.g.,
   			     '.iso.org.dod.internet.mgmt.mib-2.system.sysDescr')
                             3) fully qualified, dotted-decimal, numeric OID (e.g.,
                                '.1.3.6.1.2.1.1.1')
                      <iid>  - the dotted-decimal, instance identifier. for
                               scalar MIB objects use '0'
   		   <val>  - the SNMP data value retrieved from or being set
                               to the agents MIB. for (f)get(next) operations
                               <val> may have a variety of formats as determined by
                               session and package settings. However for set
                               operations the <val> format must be canonical to
                               ensure unambiguous translation. The canonical forms
                               are as follows:
   	                    OBJECTID => dotted-decimal (e.g., .1.3.6.1.2.1.1.1)
   			    OCTETSTR => perl scalar containing octets,
   		            INTEGER => decimal signed integer (or enum),
   			    NETADDR => dotted-decimal,
   			    IPADDR => dotted-decimal,
   			    COUNTER => decimal unsigned integer,
   			    COUNTER64  => decimal unsigned integer,
   			    GAUGE,  => decimal unsigned integer,
   			    UINTEGER,  => decimal unsigned integer,
                               TICKS,  => decimal unsigned integer,
                               OPAQUE => perl scalar containing octets,
          			    NULL,  => perl scalar containing nothing,


                      <type> - SNMP data type (see list above), this field is
                               populated by 'get' and 'getnext' operations. In
                               some cases the programmer needs to populate this
                               field when passing to a 'set' operation. this
                               field need not be supplied when the attribute
                               indicated by <tag> is already described by loaded
                               Mib modules. for 'set's, if a numeric OID is used
                               and the object is not currently in the loaded Mib,
                               the <type> field must be supplied

    simple string   - light weight form of <var> used to 'set' or 'get' a
                      single attribute without constructing an SNMP::Varbind.
                      stored in a perl scalar, has the form '<tag>.<iid>',
                      (e.g., 'sysDescr.0'). for 'set' operations the value
                      is passed as a second arg. Note: This argument form is
                      not updated in get[next] operations as are the other forms.

   Acceptable callback formats:
   <callback> may be one of the following forms:

    without arguments:
       \&subname
       sub { ... }
    or with arguments:
       [ \&subname, $arg1, ... ]
       [ sub { ... }, $arg1, ... ]
       [ "method", $obj, $arg1, ... ]

   callback will be called when response is received or timeout
   occurs. the last argument passed to callback will be a
   SNMP::VarList reference. In case of timeout the last argument
   will be undef.

   SNMP package variables and functions:

    $SNMP::VERSION       - the current version specifier (e.g., 3.1.0)

    $SNMP::auto_init_mib - default '1', set to 0 to disable automatic reading
                           of the MIB upon session creation. set to non-zero
                           to call initMib at session creation which will result
                           in MIB loading according to Net-SNMP env. variables
   			(see man mib_api)

    $SNMP::verbose       - default '0', controls warning/info output of
                           SNMP module, 0 => no output, 1 => enables warning/info
                           output from SNMP module itself (is also controlled
                           by SNMP::debugging - see below)

    $SNMP::use_long_names - default '0', set to non-zero to enable the use of
                           longer Mib identifiers. see translateObj. will also
                           influence the formatting of <tag> in varbinds returned
                           from 'getnext' operations. Can be set on a per session
                           basis (UseLongNames)

    $SNMP::use_sprint_value - default '0', set to non-zero to enable formatting of
                           response values using the snmp libraries sprint_value
                           function. can also be set on a per session basis (see
                           UseSprintValue) Note: returned values may not be
                           suitable for 'set' operations

    $SNMP::use_enums     - default '0',set non-zero to return values as enums and
                           allow sets using enums where appropriate. integer data
                           will still be accepted for set operations. can also be
                           set on a per session basis (see UseEnums)

    $SNMP::use_numeric   - default '0', set to non-zero to return tags as numeric
                           OID's, instead of translating them.  Also setting
                           $SNMP::use_long_names to non-zero is highly recommended.

    $SNMP::best_guess    - default '0'.  this setting controls how <tags> are 
                           parsed.  setting to 0 causes a regular lookup.  setting 
                           to 1 causes a regular expression match (defined as -Ib 
                           in snmpcmd) and setting to 2 causes a random access 
                           lookup (defined as -IR in snmpcmd).  can also be set 
                           on a per session basis (see BestGuess)

    $SNMP::save_descriptions - default '0',set non-zero to have mib parser save
                           attribute descriptions. must be set prior to mib
                           initialization

    $SNMP::debugging     - default '0', controls debugging output level
                           within SNMP module and libsnmp
                           1 => enables 'SNMP::verbose' (see above)
                           2 => level 1 plus snmp_set_do_debugging(1),
                           3 => level 2 plus snmp_set_dump_packet(1)

    $SNMP::dump_packet   - default '0', set [non-]zero to independently set
                           snmp_set_dump_packet()

    %SNMP::MIB           - a tied hash to access parsed MIB information. After
                           the MIB has been loaded this hash allows access to
                           to the parsed in MIB meta-data(the structure of the
                           MIB (i.e., schema)). The hash returns blessed
                           references to SNMP::MIB::NODE objects which represent
                           a single MIB attribute. The nodes can be fetched with
                           multiple 'key' formats - the leaf name (e.g.,sysDescr)
                           or fully/partially qualified name (e.g.,
                           system.sysDescr) or fully qualified numeric OID. The
                           returned node object supports the following fields:

           objectID      - dotted decimal fully qualified OID
           label         - leaf textual identifier (e.g., 'sysDescr')
           subID         - leaf numeric OID component of objectID (e.g., '1')
           moduleID      - textual identifier for module (e.g., 'RFC1213-MIB')
           parent        - parent node
           children      - array reference of children nodes
           nextNode      - next lexico node (BUG!does not return in lexico order)
           type          - returns application type (see getType for values)
           access        - returns ACCESS (ReadOnly, ReadWrite, WriteOnly,
                           NoAccess, Notify, Create)
           status        - returns STATUS (Mandatory, Optional, Obsolete,
                           Deprecated, Current)
           syntax        - returns 'textualConvention' if defined else 'type'
           textualConvention - returns TEXTUAL-CONVENTION
           units         - returns UNITS
           hint          - returns HINT
           enums         - returns hash ref {tag => num, ...}
           ranges        - returns array ref of hash ref [{low=>num, high=>num}]
           defaultValue  - returns default value
           description   - returns DESCRIPTION ($SNMP::save_descriptions must
                           be set prior to MIB initialization/parsing)


    &SNMP::setMib(<file>) - allows dynamic parsing of the mib and explicit
                            specification of mib file independent of environment
                            variables. called with no args acts like initMib,
                            loading MIBs indicated by environment variables (see
                            Net-SNMP mib_api docs). passing non-zero second arg
                            forces previous mib to be freed and replaced
                            (Note: second arg not working since freeing previous
                             Mib is more involved than before).

    &SNMP::initMib()     - calls library netsnmp_init_mib function if MIB not 
                           already loaded - does nothing if MIB already loaded.
                           Will parse directories and load modules according to
                           environment variables described in Net-SNMP
                           documentations.
                           (see man mib_api, MIBDIRS, MIBS, MIBFILE(S), etc.)

    &SNMP::addMibDirs(<dir>,...) - calls library add_mibdir for each directory
                           supplied. will cause directory(s) to be added to
                           internal list and made available for searching in
                           subsequent loadModules calls

    &SNMP::addMibFiles(<file>,...) - calls library read_mib function. The file(s)
                          supplied will be read and all Mib module definitions
                          contained therein will be added to internal mib tree
                          structure

    &SNMP::loadModules(<mod>,...) - calls library read_module function. The
                          module(s) supplied will be searched for in the
                          current mibdirs and and added to internal mib tree
                          structure. Passing special <mod>, 'ALL', will cause
                          all known modules to be loaded.

    &SNMP::unloadModules(<mod>,...) - *Not Implemented*

    &SNMP::translateObj(<var>[,arg,[arg]]) - will convert a text obj tag to an 
                          OID and vice-versa. Any iid suffix is retained 
                          numerically.  Default behaviour when converting a 
                          numeric OID to text form is to return leaf identifier 
                          only (e.g.,'sysDescr') but when $SNMP::use_long_names 
                          is non-zero or a non-zero second arg is supplied it 
                          will return a longer textual identifier.  An optional 
                          third argument of non-zero will cause the module name 
                          to be prepended to the text name (e.g. 
                          'SNMPv2-MIB::sysDescr').  When converting a text obj, 
                          the $SNMP::best_guess option is used.  If no Mib is 
                          loaded when called and $SNMP::auto_init_mib is enabled 
                          then the Mib will be loaded. Will return 'undef' upon 
                          failure.

    &SNMP::getType(<var>) - return SNMP data type for given textual identifier
                           OBJECTID, OCTETSTR, INTEGER, NETADDR, IPADDR, COUNTER
                           GAUGE, TIMETICKS, OPAQUE, or undef

    &SNMP::mapEnum(<var>) - converts integer value to enumeration tag defined
                            in Mib or converts tag to integer depending on
                            input. the function will return the corresponding
                            integer value *or* tag for a given MIB attribute
                            and value. The function will sense which direction
                            to perform the conversion. Various arg formats are
                            supported
                            $val = SNMP::mapEnum($varbind);
                            # where $varbind is SNMP::Varbind or equiv
                            # note: $varbind will be updated
                            $val = SNMP::mapEnum('ipForwarding', 'forwarding');
                            $val = SNMP::mapEnum('ipForwarding', 1);

    &SNMP::MainLoop([<timeout>, [<callback>]])
                      - to be used with async SNMP::Session
                        calls. MainLoop must be called after initial async calls
                        so return packets from the agent will not be processed.
                        If no args supplied this function enters an infinite loop
                        so program must be exited in a callback or externally
                        interrupted. If <timeout

    &SNMP::finish()
   		   - This function, when called from an SNMP::MainLoop()
   		     callback function, will cause the current SNMP::MainLoop
   		     to return after the callback is completed. finish() can
   		     be used to terminate an otherwise-infinite MainLoop. A
   		     new MainLoop() instance can then be started to handle
   		     further requests.

   Exported SNMP utility functions
   &snmp_get() - takes args of SNMP::Session::new followed by those of
                 SNMP::Session::get

   &snmp_getnext() - takes args of SNMP::Session::new followed by those of
                     SNMP::Session::getnext

   &snmp_set() - takes args of SNMP::Session::new followed by those of
                 SNMP::Session::set

   &snmp_trap() - takes args of SNMP::TrapSession::new followed by those of
                  SNMP::TrapSession::trap

   Note: utility functions do not support async operation yet.

Trouble Shooting:

   If problems occur there are number areas to look at to narrow down the
   possibilities.

   The first step should be to test the Net-SNMP installation
   independently from the Perl5 SNMP interface.

   Try running the apps from the Net-SNMP distribution.

   Make sure your agent (snmpd) is running and properly configured with
   read-write access for the community you are using.

   Ensure that your MIBs are installed and environment variables are set
   appropriately (see man mib_api)

   Be sure to ensure headers and libraries from old CMU installations are
   not being used by mistake (see -NET-SNMP-PATH).

   If the problem occurs during compilation/linking check that the snmp
   library being linked is actually the Net-SNMP library (there have been
   name conflicts with existing snmp libs).

   Also check that the header files are correct and up to date.

   Sometimes compiling the Net-SNMP library with
   'position-independent-code' enabled is required (HPUX specifically).

   If you cannot resolve the problem you can post to
   comp.lang.perl.modules or email net-snmp-users@lists.sourceforge.net.

   please give sufficient information to analyze the problem (OS type,
   versions for OS/Perl/net-SNMP/compiler, complete error output, etc.)

Acknowledgments:

   Many thanks to all those who supplied patches, suggestions and
   feedback.

   Joe Marzot (the original author)
   Wes Hardaker and the net-snmp-coders
   Dave Perkins
   Marcel Wiget
   David Blackburn
   John Stofell
   Gary Hayward
   Claire Harrison
   Achim Bohnet
   Doug Kingston
   Jacques Vidrine
   Carl Jacobsen
   Wayne Marquette
   Scott Schumate
   Michael Slifcak
   Srivathsan Srinivasagopalan
   Bill Fenner
   Jef Peeraer
   Daniel Hagerty
   Karl "Rat" Schilke and Electric Lightwave, Inc.
   Perl5 Porters
   Alex Burger

   Apologies to any/all who's patch/feature/request was not mentioned or
   included - most likely it was lost when paying work intruded on my
   fun. Please try again if you do not see a desired feature. This may
   actually turn out to be a decent package with such excellent help and
   the fact that I have more time to work on it than in the past.

Copyright:

     [See the COPYING file for the copyright license of Net-SNMP]

     Copyright (c) 1995-2000 G. S. Marzot. All rights reserved.
     This program is free software; you can redistribute it and/or
     modify it under the same terms as Perl itself.

     Copyright (c) 2001-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.

     Copyright (c) 2003-2006 SPARTA, Inc.  All Rights Reserved.  This
     program is free software; you can redistribute it and/or modify
     it under the same terms as Perl itself.
