summaryrefslogtreecommitdiff
path: root/docs/pysnmp-tutorial.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/pysnmp-tutorial.html')
-rw-r--r--docs/pysnmp-tutorial.html3806
1 files changed, 0 insertions, 3806 deletions
diff --git a/docs/pysnmp-tutorial.html b/docs/pysnmp-tutorial.html
deleted file mode 100644
index 42f1edd..0000000
--- a/docs/pysnmp-tutorial.html
+++ /dev/null
@@ -1,3806 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE>PySNMP tutorial</TITLE>
-</HEAD>
-
-<BODY BGCOLOR="#ffffff" TEXT="#000000"
- LINK="#0000bb" VLINK="#551a8b" ALINK="#ff0000">
-<FONT SIZE=2 FACE="arial, helvetica">
-<TABLE ALIGN="CENTER" WIDTH="60%"><TR><TD><TABLE ALIGN="LEFT"><TR><TD>
-<H4>
-PySNMP tutorial
-</H4>
-
-<I>by <A HREF=mailto:ilya@glas.net>Ilya Etingof</A>, 2007-2012</I>
-
-<P><B>Table of contents</B></P>
-<UL>
-<LI><A HREF="#NETWORK-MANAGEMENT-BASICS">1. Network management basics</A>
-<UL>
-<LI><A HREF="#SNMP-MANAGEMENT-ARCHITECTURE">1.1 SNMP management architecture</A>
-<LI><A HREF="#HISTORY-OF-SNMP">1.2 The history of SNMP</A>
-</UL>
-<LI><A HREF="#PYSNMP-PROGRAMMING">2. Programming with PySNMP</A>
-<UL>
-<LI><A HREF="#ONELINER-APPS">2.1 One-line Applications</A>
-<UL>
-<LI><A HREF="#SYNCH-ONELINER-APPS">2.1.1 Synchronous Applications</A>
-<UL>
-<LI><A HREF="#CommandGenerator">2.1.1.1 Command Generator</A>
-<LI><A HREF="#NotificationOriginator">2.1.1.2 Notification Originator</A>
-</UL>
-<LI><A HREF="#ASYNCH-ONELINER-APPS">2.1.2 Asynchronous Applications</A>
-<UL>
-<LI><A HREF="#AsynCommandGenerator">2.1.2.1 Asynchronous Command Generator</A>
-<LI><A HREF="#AsynNotificationOriginator">2.1.2.2 Asynchronous Notification Originator</A>
-</UL>
-<LI><A HREF="#SECURITY-CONFIGURATION">2.1.3 Security configuration</A>
-<UL>
-<LI><A HREF="#UsmUserData">2.1.3.1 User-Based Security Model configuration</A>
-<LI><A HREF="#CommunityData">2.1.3.2 Community-Based Security Model configuration</A>
-</UL>
-<LI><A HREF="#TRANSPORT-CONFIGURATION">2.1.4 Transport configuration</A>
-<UL>
-<LI><A HREF="#UdpTransportTarget">2.1.4.1 UDP Transport Target</A>
-</UL>
-</UL>
-<LI><A HREF="#MANAGED-OBJECT-NAME-VALUE">2.2 Managed Objects names and values</A>
-<LI><A HREF="#MIB-SERVICES">2.3 MIB services</A>
-<UL>
-<LI><A HREF="#DATA-MODEL-MANAGED-OBJECTS">2.3.1 Data model for Managed Objects</A>
-<LI><A HREF="#MIB-BUILDER">2.3.2 MIB builder</A>
-<LI><A HREF="#MIB-VIEW-CONTROLLER">2.3.3 MIB view controller</A>
-<LI><A HREF="#IMPLEMENTING-MANAGED-OBJECTS-INSTANCES">2.3.4 Implementing Managed Objects Instances</A>
-<UL>
-<LI><A HREF="#ASSOCIATED-VALUE-GATEWAYING">2.3.4.1 Associated value gatewaying</A>
-<LI><A HREF="#TAPPING-ON-MANAGEMENT-INSTRUM">2.3.4.2 Tapping on Management Instrumentation API</A>
-</UL>
-</UL>
-</UL>
-<LI><A HREF="#APPENDIXIES">Appendixies</A>
-<UL>
-<LI><A HREF="#ASN1">ASN.1 standard</A>
-</UL>
-</UL>
-</UL>
-</UL>
-
-<I>
-Applicable to PySNMP 4.2.3 and later.
-</I>
-
-<P>
-
-<A NAME="NETWORK-MANAGEMENT-BASICS"></A>
-<H4>
-1. Network management basics
-</H4>
-
-<P>
-As networks become more complex, in terms of device population,
-topology and distances, it has been getting more and more important
-for network administrators to have some easy and convenient way for
-controlling all pieces of the whole network.
-</P>
-
-<P>
-Basic features of a network management system include device information
-retrieval and device remote control. Former often takes shape of gathering
-device operation statistics, while latter can be seen in device remote
-configuration facilities.
-</P>
-
-<P>
-For any information to be exchanged between entities, some agreement on
-information format and transmission procedure needs to be settled beforehand.
-This is what is conventionally called a <STRONG>Protocol</STRONG>.
-</P>
-
-<P>
-Large networks nowdays, may host thousands of different devices.
-To benefit network manager's interoperability and simplicity, any
-device on the network should carry out most common and important management
-operations in a well known, unified way. Therefore, an important feature
-of a network management system would be a <STRONG>Convention on
-management information naming and presentation</STRONG>.
-</P>
-
-<P>
-Sometimes, management operations should be performed on large number of
-managed devices. For a network manager to complete such a management round
-in a reasonably short period of time, an important feature of a network
-management software would be <STRONG>Performance</STRONG>.
-
-<P>
-Some of network devices may run on severely limited resources what invokes
-another property of a proper network management facility:
-<STRONG>Low resource consumption</STRONG>.
-</P>
-
-<P>
-In practice, the latter requirement translates into low CPU cycles and
-memory footprint for management software aboard device being managed.
-</P>
-
-<P>
-As networking becomes a more crucial part of our daily lives, security
-issues have become more apparent. As a side note, even Internet
-technologies, having military roots, did not pay much attention to security
-initially. So, the last key feature of network management appears to be
-<STRONG>Security</STRONG>.
-</P>
-
-<P>
-Data passed back and forth through the course of management operations should
-be at least authentic and sometimes hidden from possible observers.
-</P>
-
-<P>
-All these problems were approached many times through about three decades
-of networking history. Some solutions collapsed over time for one reason or
-another, while others, such as Simple Network Management Protocol (SNMP),
-evolve into an industry standard.
-</P>
-
-<A NAME="SNMP-MANAGEMENT-ARCHITECTURE"></A>
-<H4>
-1.1 SNMP management architecture
-</H4>
-
-<P>
-The SNMP management model includes three distinct entities -- Agent, Manager
-and Proxy talking to each other over network.
-</P>
-
-<P>
-Agent entity is basically a software running somewhere in a networked device
-and having the following distinguishing properties:
-</P>
-
-<UL>
-<LI>SNMP protocol support
-<LI>Access to managed device's internals
-</UL>
-
-<P>
-The latter feature is a source of management information for Agent, as well
-as a target for remote control operations.
-</P>
-
-<P>
-Modern SNMP standards suggest splitting Agent functionality on two parts.
-Such Agents may run SNMP for local processes called <STRONG>Subagents</STRONG>, which
-interface with managed devices internals. Communication between <STRONG>Master
-Agent</STRONG> and its Subagents is performed using a simplified version
-of original SNMP protocol, known as <STRONG>AgentX</STRONG>, which is
-designed to run only within a single host.
-</P>
-
-<P>
-Manager entity is usually an application used by humans (or daemons) for
-performing various network management tasks, such as device statistics
-retrieval or remote control.
-</P>
-
-<P>
-Sometimes, Agents and Managers may run peer-to-peer within a single entity
-that is called Proxy. Proxies can often be seen in application-level
-firewalling or may serve as SNMP protocol translators between otherwise
-SNMP version-incompatible Managers and Agents.
-</P>
-
-<P>
-For Manager to request Agent for an operation on a particular part of
-managed device, some convention on device's components naming is needed.
-Once some components are identified, Manager and Agent would have to agree
-upon possible components' states and their semantics.
-</P>
-
-<A NAME="MANAGED-OBJECTS"></A>
-<P>
-SNMP approach to both problems is to represent each component of a device
-as a named object, similar to named variables seen in programming
-languages, and state of a component maps to a value associated with this
-imaginary variable. These are called Managed Objects in SNMP.
-</P>
-
-<A NAME="CONCEPTUAL-TABLES"></A>
-<P>
-For representing a group of similar components of a device, such as network
-interfaces, Managed Objects can be organized into a so-called
-<STRONG>conceptual table</STRONG>.
-</STRONG>
-
-<P>
-Manager talks to Agent by sending it messages of several types. Message
-type implies certain action to be taken. For example, <STRONG>GET</STRONG>
-message instructs Agent to report back values of Managed Objects whose names
-are indicated in message.
-</P>
-
-<P>
-There's also a way for Agent to notify Manager of an event occurred to Agent.
-This is done through so-called <STRONG>Trap</STRONG> messages. Trap message also
-carries Managed Objects and possibly Values, but besides that it has an
-ID of event in form of integer number or a Managed Object.
-</P>
-
-<P>
-For naming Managed Objects, SNMP uses the concept of
-<A HREF="#OID">Object Identifier</A>. As an example of Managed Object,
-<i>.iso.org.dod.internet.mgmt.mib-2.system.sysName.0</i> represents
-human-readable name of a device where Agent is running.
-</P>
-
-<P>
-Managed Objects values are always instances of
-<A HREF="#ASN1">ASN.1</A> types (such as Integer) or SNMP-specific subtypes
-(such as IpAddress). As in programming languages, type has an effect of
-restricting possible set of states Managed Object may ever enter.
-</P>
-
-<P>
-Whenever SNMP entities talk to each other, they refer to Managed Objects whose
-semantics (and value type) must be known in advance by both parties. SNMP Agent
-may be seen as a primary source of information on Managed Objects, as they are
-implemented by Agent. In this model, Manager should have a map of Managed
-Objects contained within each Agent to talk to.
-</P>
-
-<A NAME="MIB"></A>
-<A NAME="SMI"></A>
-<P>
-SNMP standard introduces a set of ASN.1 language constructs (such as ASN.1
-subtypes and MACROs) which is called <STRONG>Structure of Management Information</STRONG>
-(<STRONG>SMI</STRONG>). Collections of related Managed Objects described in terms of
-SMI comprise <STRONG>Management Information Base</STRONG> (<STRONG>MIB</STRONG>) modules.
-</P>
-
-<P>
-Commonly used Managed Objects form core MIBs that become part of SNMP standard.
-The rest of MIBs are normally created by vendors who build SNMP Agents into
-their products.
-</P>
-
-<P>
-More often then not, Manager implementations could parse MIB files and
-use Managed Objects information for names resolution, value type determination,
-pretty printing and so on. This feature is known as <STRONG>MIB parser</STRONG> support.
-
-<A NAME="HISTORY-OF-SNMP"></A>
-<H4>
-1.2 The history of SNMP
-</H4>
-
-<P>
-First SNMP version dates back to 1988 when a set of IETF RFC's
-were first published (
-<A HREF="http://www.ietf.org/rfc/rfc1065.txt">RFC1065</A>,
-<A HREF="http://www.ietf.org/rfc/rfc1066.txt">RFC1066</A>,
-<A HREF="http://www.ietf.org/rfc/rfc1067.txt">RFC1067</A>
-). These documents describe protocol operations
-(in terms of message syntax and semantics), SMI and a few core MIBs.
-The first version appears to be lightweight and easy to implement.
-Although, its poor security became notorious over years (Security? Not My
-Problem!), because cleartext password used for authentication (AKA
-<STRONG>Community String</STRONG>) is extremely easy to eavesdrop and replay,
-even after almost 20 years, slightly refined standard
-(
-<A HREF="http://www.ietf.org/rfc/rfc1155.txt">RFC1155</A>,
-<A HREF="http://www.ietf.org/rfc/rfc1157.txt">RFC1157</A>,
-<A HREF="http://www.ietf.org/rfc/rfc1212.txt">RFC1212</A>
-) still seems to be the most frequent encounter in modern SNMP devices.
-</P>
-
-<P>
-In effort to fix security issues of SNMPv1 and to make protocol faster for
-operations on large number of Managed Objects, SNMP Working Group at IETF
-came up with SNMPv2. This new protocol offers bulk transfers of Managed
-Objects information (by means of new, GETBULK message payload), improved
-security and re-worked SMI. But its new party-based security system turned
-out to be too complicated. In the end, security part of SNMPv2 has been dropped
-in favor of community-based authentication system used in SNMPv1. The result
-of this compromise is known as SNMPv2c (where "c" stands for community) and
-is still widely supported without being a standard (
-<A HREF="http://www.ietf.org/rfc/rfc1902.txt">RFC1902</A>,
-<A HREF="http://www.ietf.org/rfc/rfc1903.txt">RFC1903</A>,
-<A HREF="http://www.ietf.org/rfc/rfc1904.txt">RFC1904</A>,
-<A HREF="http://www.ietf.org/rfc/rfc1905.txt">RFC1905</A>,
-<A HREF="http://www.ietf.org/rfc/rfc1906.txt">RFC1906</A>,
-<A HREF="http://www.ietf.org/rfc/rfc1907.txt">RFC1907</A>,
-<A HREF="http://www.ietf.org/rfc/rfc1908.txt">RFC1908</A>
-).
-</P>
-
-<P>
-The other compromise targeted at offering greater security than SNMPv1,
-without falling into complexities of SNMPv2, has been attempted by
-replacing SNMPv2 party-based security system with newly developed
-user-based security model. This variant of protocol is known as SNMPv2u.
-Although neither widely implemented nor standardized, <STRONG>User Based Security
-Model</STRONG> (<STRONG>USM</STRONG>) of SNMPv2u got eventually adopted
-as one of possibly many SNMPv3 security models.
-</P>
-
-<P>
-As of this writing, SNMPv3 is current standard for SNMP. Although it's based
-heavily on previous SNMP specifications, SNMPv3 offers many innovations but
-also brings significant complexity. Additions to version 3 are mostly about
-protocol operations. SMI part of standard is inherited intact from SNMPv2.
-</P>
-
-<P>
-SNMPv3 system is designed as a framework that consists of a core, known
-as <STRONG>Message and PDU Dispatcher</STRONG>, and several abstract
-subsystems: <STRONG>Message Processing Subsystem</STRONG>
-(<STRONG>MP</STRONG>), responsible for SNMP message handling,
-<STRONG>Transport Dispatcher</STRONG>, used for carrying over messages,
-and <STRONG>Security Subsystem</STRONG>, which deals with message
-authentication and encryption issues. The framework defines
-subsystems interfaces to let feature-specific modules to be plugged into
-SNMPv3 core thus forming particular feature-set of SNMP system. Typical use
-of this modularity feature could be seen in multiprotocol systems -- legacy
-SNMP protocols are implemented as version-specific MP and security modules.
-Native SNMPv3 functionality relies upon v3 message processing and User-Based
-Security modules.
-</P>
-
-<P>
-Besides highly detailed SNMP system specification, SNMPv3 standard also
-defines a typical set of SNMP applications and their behavior. These
-applications are Manager, Agent and Proxy (
-<A HREF="http://www.ietf.org/rfc/rfc3411.txt">RFC3411</A>,
-<A HREF="http://www.ietf.org/rfc/rfc3412.txt">RFC3412</A>,
-<A HREF="http://www.ietf.org/rfc/rfc3413.txt">RFC3413</A>,
-<A HREF="http://www.ietf.org/rfc/rfc3414.txt">RFC3414</A>,
-<A HREF="http://www.ietf.org/rfc/rfc3415.txt">RFC3415</A>,
-<A HREF="http://www.ietf.org/rfc/rfc3416.txt">RFC3416</A>,
-<A HREF="http://www.ietf.org/rfc/rfc3417.txt">RFC3417</A>,
-<A HREF="http://www.ietf.org/rfc/rfc3418.txt">RFC3418</A>
-).
-</P>
-
-<A NAME="PYSNMP-PROGRAMMING"></A>
-<H4>
-2. Programming with PySNMP
-</H4>
-
-<P>
-PySNMP is a pure-Python SNMP engine implementation. This software deals with
-the darkest corners of SNMP specifications all in Python programming language.
-</P>
-
-<P>
-This paper is dedicated to PySNMP revisions 4.2.3 and up. Since PySNMP API's
-evolve over time, older revisions may provide slightly different interfaces
-than those described in this tutorial. Please refer to release-specific
-documentation for a more precise information.
-</P>
-
-<P>
-From Programmer's point of view, the layout of PySNMP software reflects SNMP
-protocol evolution. It has been written from ground up, from trivial SNMPv1 up
-to fully featured SNMPv3. Therefore, several levels of API to SNMP
-functionality are available:
-<UL>
-<LI>
-<P>
-The most ancient and low-level is SNMPv1/v2c protocol scope. Here
-programmer is supposed to build/parse SNMP messages and their
-payload -- <STRONG>Protocol Data Unit</STRONG> (<STRONG>PDU</STRONG>),
-handle protocol-level errors, transport issues and so on.
-</P>
-
-<P>
-Although considered rather complex to deal with, this API probably gives best
-performance, memory footprint and flexibility, unless MIB access and/or
-SNMPv3 support is needed.
-</P>
-</LI>
-
-<LI>
-<P>
-Parts of SNMPv3 standard is expressed in terms of some abstract API to
-SNMP engine and its components. PySNMP implementation adopts this abstract API
-to a great extent, so it's available at Programmer's disposal. As a side
-effect, SNMP RFCs could be referenced for API semantics when programming
-PySNMP at this level.
-</P>
-
-<P>
-This API is much more higher-level than previous; here Programmer would
-have to manage two major issues: setting up <STRONG>Local Configuration Datastore</STRONG>
-(<STRONG>LCD</STRONG>) of SNMP engine and build/parse PDUs. PySNMP system is
-shipped multi-lingual, thus at this level all SNMPv1, SNMPv2c and SNMPv3
-features are available.
-</P>
-</LI>
-
-<LI>
-<P>
-At last, the highest-level API to SNMP functionality is available through the
-use of standard SNMPv3 applications. These applications cover the most
-frequent needs. That's why this API is expected to be the first to
-start with.
-</P>
-
-<P>
-The Applications API further simplifies Programmer's job by hiding
-LCD management issues (contrary to SNMPv3 engine level). This API could be
-exploited in a oneliner fashion, for quick and simple prototyping.
-</P>
-</LI>
-</UL>
-
-<P>
-As for its internal structure, PySNMP consists of a handful of large,
-dedicated components. They normally take shape of classes which turn
-into linked objects at runtime. So here are the main components:
-</P>
-
-<UL>
-<LI>
-<P>
-SNMP Engine is an object holding references to all other components of
-the SNMP system. Typical user application has a single instance of SNMP
-Engine class possibly shared by many SNMP Applications of all kinds.
-As the other linked-in components tend to buildup various
-configuration and housekeeping information in runtime, SNMP Engine object
-appears to be expensive to configure to a usable state.
-</P>
-</LI>
-
-<LI>
-<P>
-Transport subsystem is used for sending SNMP messages to and accepting them
-from network. The I/O subsystem consists of an abstract Dispatcher and one
-or more abstract Transport classes. Concrete Dispatcher implementation
-is I/O method-specific, consider BSD sockets for example. Concrete Transport
-classes are transport domain-specific. SNMP frequently uses UDP Transport
-but others are also possible. Transport Dispatcher interfaces are mostly
-used by Message And PDU Dispatcher. However, when using the SNMPv1/v2c-native
-API (the lowest-level one), these interfaces would be invoked directly.
-</P>
-</LI>
-
-<LI>
-<P>
-Message And PDU Dispatcher is a heart of SNMP system. Its main responsibilities
-include dispatching PDUs from SNMP Applications through various subsystems
-all the way down to Transport Dispatcher, and passing SNMP messages coming
-from network up to SNMP Applications. It maintains logical connection with
-Management Instrumentation Controller which carries out operations on Managed
-Objects, here for the purpose of LCD access.
-</P>
-</LI>
-
-<LI>
-<P>
-Message Processing Modules handle message-level protocol operations for present
-and possibly future versions of SNMP protocol. Most importantly, these include
-message parsing/building and possibly invoking security services whenever
-required. All MP Modules share standard API used by Message And PDU Dispatcher.
-</P>
-</LI>
-
-<LI>
-<P>
-Message Security Modules perform message authentication and/or encryption.
-As of this writing, User-Based (for v3) and Community (for v1/2c) modules
-are implemented in PySNMP. All Security Modules share standard API used by
-Message Processing subsystem.
-</P>
-</LI>
-
-<LI>
-<P>
-Access Control subsystem uses LCD information to authorize remote access to
-Managed Objects. This is used when serving Agent Applications or Trap
-receiver in Manager Applications.
-</P>
-</LI>
-
-<LI>
-<P>
-A collection of dedicated Managed Objects Instances are used by PySNMP
-for its internal purposes. They are collectively called Local
-Configuration Datastore (LCD). In PySNMP, all SNMP engine configuration
-and statistics is kept in LCD. LCD Configurator is a wrapper aimed at
-simplifying LCD operations.
-</P>
-</LI>
-</UL>
-
-<P>
-In most cases user is expected to only deal with the top-leve oneliner
-API to all these PySNMP components. However implementing SNMP Agents,
-Proxies and some other fine features of Managers require using the
-Standard Applications API. In those cases general understanding of SNMP
-operations and SNMP Engine components would be helpful.
-</P>
-
-<A NAME="ONELINER-APPS"></A>
-<H4>
-2.1 One-line Applications
-</H4>
-
-<P>
-As of this writing, oneliner Applications support generating Manager-side
-GET/SET/GETNEXT/GETBULK and issuing Agent-side TRAP/INFORM messages.
-Agent and Manager side responders are more complex and rarely used to fit
-them into the concise oneliner API so these should be implemented on top of
-standard SNMP Applications API.
-</P>
-
-<P>
-There're two kinds of APIs to oneline Applications: synchronous and
-asynchronous. They are very similar in terms of their API and behaviour,
-both are implemented by the
-<STRONG>pysnmp.entity.rfc3413.oneliner.cmdgen</STRONG> module. The
-asynchronous version is more suited for massively parallel SNMP messaging.
-</P>
-
-<A NAME="SYNCH-ONELINER-APPS"></A>
-<H4>
-2.1.1 Synchronous One-line Applications
-</H4>
-
-<P>
-This is the simplest and the most high-level API to standard SNMP
-Applications. It's advised to employ for singular and blocking
-operations as well as for rapid prototyping.
-</P>
-
-<A NAME="CommandGenerator"></A>
-<H4>
-2.1.1.1 Command Generator
-</H4>
-
-<P>
-All Command Generator Applications are implemented by a single class:
-
-</P>
-
-<DL>
-<DT>class <STRONG>CommandGenerator</STRONG>([<STRONG>snmpEngine</STRONG>])</DT>
-<DD>
-<P>
-Create a SNMP Command Generator object.
-</P>
-
-<P>
-Although instantiation of this class is cheap, in the course of its further
-use, SNMP engine configuration is built and maintained though methods
-invocation.
-Therefore it is advised to keep and reuse CommandGenerator instance
-(or <STRONG>snmpEngine</STRONG> instance if passed as an initializer)
-for as long as possible within user applicatin.
-</P>
-</DD>
-</DL>
-
-<P>
-Methods of the <STRONG>CommandGenerator</STRONG> class instances implement
-specific request types.
-</P>
-
-<A NAME="CommandGenerator.getCmd"></A>
-<DL>
-<DT><STRONG>getCmd</STRONG>(
-<STRONG>authData</STRONG>,
-<STRONG>transportTarget</STRONG>,
-<STRONG>*varNames</STRONG>,
-<STRONG>lookupNames=False</STRONG>,
-<STRONG>lookupValues=False</STRONG>
-)</DT>
-
-<DD>
-<P>
-Perform SNMP GET request and return a response or error indication.
-</P>
-
-<P>
-The <STRONG>authData</STRONG> is a
-SNMP <A HREF="#UsmUserData">Security Parameters object</A>,
-<STRONG>transportTarget</STRONG> is a SNMP
-<A HREF="#UdpTransportTarget">Transport Configuration object</A>
-and <STRONG>*varNames</STRONG> is a sequence of
-<A HREF="#MANAGED-OBJECT-NAME-VALUE">Managed Objects names</A>.
-</P>
-
-<P>
-The <STRONG>getCmd</STRONG> method returns a tuple of
-<STRONG>errorIndication</STRONG>,
-<STRONG>errorStatus</STRONG>,
-<STRONG>errorIndex</STRONG>,
-<STRONG>varBinds</STRONG>.
-</P>
-
-<P>
-Non-empty <STRONG>errorIndication</STRONG> string indicates SNMP engine-level
-error.
-</P>
-
-<P>
-The pair of <STRONG>errorStatus</STRONG> and <STRONG>errorIndex</STRONG>
-variables determines SNMP PDU-level error. These are instances of pyasn1
-<A HREF="http://pyasn1.sourceforge.net/#1.1.3">Integer class</A>.
-If <STRONG>errorStatus</STRONG> evaluates to true, this indicates SNMP PDU
-error caused by Managed Object at position <STRONG>errorIndex</STRONG>-1
-in <STRONG>varBinds</STRONG>.
-Doing <STRONG>errorStatus.prettyPrint</STRONG>() would return an
-explanatory text error message.
-</P>
-
-<P>
-The <STRONG>varBinds</STRONG> is a sequence of <A HREF="#MANAGED-OBJECT-NAME-VALUE">Managed Objects</A>.
-Those found in response are bound by position to Managed Object names passed in request.
-</P>
-
-<P>
-If <STRONG>lookupNames</STRONG> parameter evaluates to True, PySNMP will
-attempt to gather more information on
-<A HREF="#MANAGED-OBJECT-NAME-VALUE">Managed Objects</A> returned in
-<STRONG>varBinds</STRONG> by searching for relevant MIB module and looking
-up there. Instance of
-<A HREF="#MibVariable">MibVariable</A> class will be returned as Managed
-Object names.
-</P>
-
-<P>
-If <STRONG>lookupValues</STRONG> parameter evaluates to True, Managed Objects
-Instances values
-returned in <STRONG>varBinds</STRONG> may be converted into a more precise
-type (employing
-<A HREF="#TEXTUAL-CONVENTION-AS-A-TYPE">TEXTUAL-CONVENTION</A> data
-from MIB) if PySNMP has relevant MIB loaded. Otherwise response values will
-belong to protocol-level
-<A HREF="#MANAGED-OBJECT-NAME-VALUE">Managed Object Instance value types</A>.
-</P>
-
-</DD>
-</DL>
-
-<P>
-The following code performs SNMP GET operation
-<UL>
-<LI>using SNMP v2c
-<LI>with community name 'public'
-<LI>over IPv4/UDP
-<LI>against an Agent listening at localhost (UDP port 161)
-<LI>requesting two Managed Object Instances specified by name in string form
-</UL>
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-from pysnmp.entity.rfc3413.oneliner import cmdgen
-
-cmdGen = cmdgen.CommandGenerator()
-
-errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
- cmdgen.CommunityData('public'),
- cmdgen.UdpTransportTarget(('localhost', 161)),
- '1.3.6.1.2.1.1.1.0',
- '1.3.6.1.2.1.1.6.0'
-)
-
-# Check for errors and print out results
-if errorIndication:
- print(errorIndication)
-else:
- if errorStatus:
- print('%s at %s' % (
- errorStatus.prettyPrint(),
- errorIndex and varBinds[int(errorIndex)-1] or '?'
- )
- )
- else:
- for name, val in varBinds:
- print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
-</PRE>
-</TD></TR></TABLE>
-
-<A NAME="CommandGenerator.setCmd"></A>
-<DL>
-<DT><STRONG>setCmd</STRONG>(
-<STRONG>authData</STRONG>,
-<STRONG>transportTarget</STRONG>,
-<STRONG>*varBinds</STRONG>,
-<STRONG>lookupNames=False</STRONG>,
-<STRONG>lookupValues=False</STRONG>
-)</DT>
-
-<DD>
-<P>
-Perform SNMP SET request and return a response or error indication.
-</P>
-
-<P>
-The <STRONG>authData</STRONG>, <STRONG>transportTarget</STRONG>,
-<STRONG>lookupNames</STRONG> and <STRONG>lookupValues</STRONG> parameters
-have the same semantics as in <A HREF="#CommandGenerator.getCmd">getCmd</A>
-method.
-</P>
-
-<P>
-The <STRONG>*varBinds</STRONG> input parameter is a sequence of
-<A HREF="#MANAGED-OBJECT-NAME-VALUE">Managed Objects</A> to be modified at the Agent.
-</P>
-
-<P>
-The <STRONG>setCmd</STRONG> method returns a tuple of
-<STRONG>errorIndication</STRONG>,
-<STRONG>errorStatus</STRONG>,
-<STRONG>errorIndex</STRONG>,
-<STRONG>varBinds</STRONG>.
-having the same meaning as in <A HREF="#CommandGenerator.getCmd">getCmd</A> method.
-</P>
-
-</DD>
-</DL>
-
-<P>
-The following code performs SNMP SET operation
-<UL>
-<LI>using SNMP v3
-<LI>with username 'usr-md5-des', MD5 authentication and DES privacy protocols
-<LI>over IPv4/UDP
-<LI>against an Agent listening at localhost (UDP port 161)
-<LI>setting SNMPv2-MIB::sysName.0 object to a new value
-</UL>
-</P>
-<P>
-The <A HREF="#MibVariable">MibVariable</A> object is used on input to
-allow symbolic Managed Object Instance name specification. Response names
-are requested to be returned also in form of a MibVariable object and
-response values converted into MIB-defined type.
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-from pysnmp.entity.rfc3413.oneliner import cmdgen
-
-cmdGen = cmdgen.CommandGenerator()
-
-errorIndication, errorStatus, errorIndex, varBinds = cmdGen.setCmd(
- cmdgen.UsmUserData('usr-md5-des', 'authkey1', 'privkey1'),
- cmdgen.UdpTransportTarget(('localhost', 161)),
- (cmdgen.MibVariable('SNMPv2-MIB', 'sysName', 0), 'my new value'),
- lookupNames=True, lookupValues=True
-)
-
-# Check for errors and print out results
-if errorIndication:
- print(errorIndication)
-else:
- if errorStatus:
- print('%s at %s' % (
- errorStatus.prettyPrint(),
- errorIndex and varBinds[int(errorIndex)-1] or '?'
- )
- )
- else:
- for name, val in varBinds:
- print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
-</PRE>
-</TD></TR></TABLE>
-
-<A NAME="CommandGenerator.nextCmd"></A>
-<DL>
-<DT><STRONG>nextCmd</STRONG>(
-<STRONG>authData</STRONG>,
-<STRONG>transportTarget</STRONG>,
-<STRONG>*varNames</STRONG>,
-<STRONG>lookupNames=False</STRONG>,
-<STRONG>lookupValues=False</STRONG>,
-<STRONG>lexicographicMode=False</STRONG>,
-<STRONG>ignoreNonIncreasingOid=False</STRONG>,
-<STRONG>maxRows=0</STRONG>
-)</DT>
-
-<DD>
-<P>
-Perform SNMP GETNEXT request and return a response or error indication.
-The GETNEXT request type implies referring to Managed Objects whose Object
-Names are "next greater" to those used in request.
-</P>
-
-<P>
-The <STRONG>authData</STRONG>, <STRONG>transportTarget</STRONG>,
-<STRONG>lookupNames</STRONG> and <STRONG>lookupValues</STRONG> parameters
-have the same semantics as in <A HREF="#CommandGenerator.getCmd">getCmd</A>
-method.
-</P>
-
-<P>
-The <STRONG>*varNames</STRONG> parameter is a sequence of
-<A HREF="#MANAGED-OBJECT-NAME-VALUE">Managed Objects names</A> to query Agent
-for their "next" greater neignbours' Managed Objects Instances values. Unlike
-the same-named parameter of <A HREF="#CommandGenerator.getCmd">getCmd</A> method,
-a partial (prefix part of) Managed Objects names are allowed here. For instance,
-a <STRONG>'1.3.6.1'</STRONG> argument would ask the Agent to report Managed
-Object Instance value with the next greater name known to this Agent
-(which may turn out to be <STRONG>'1.3.6.1.2.1.1.1.0'</STRONG>).
-</P>
-
-<P>
-The <STRONG>nextCmd</STRONG> method returns a tuple of
-<STRONG>errorIndication</STRONG>,
-<STRONG>errorStatus</STRONG>,
-<STRONG>errorIndex</STRONG>,
-<STRONG>varBindTable</STRONG>.
-</P>
-
-<P>
-The <STRONG>errorIndication</STRONG>, <STRONG>errorStatus</STRONG> and
-<STRONG>errorIndex</STRONG> parameters have the same meaning as in
-<A HREF="#CommandGenerator.getCmd">getCmd</A> method.
-</P>
-
-<P>
-The <STRONG>varBindTable</STRONG> parameter is a sequence of
-<STRONG>varBinds</STRONG>. Each <STRONG>varBind</STRONG> of
-<STRONG>varBinds</STRONG> in <STRONG>varBindTable</STRONG> represent a
-set of Managed Objects whose Object Names reside inside
-<A HREF="#OID">OID</A> sub-tree of Managed Object name passed in request.
-In other words, with this oneliner API, an invocation of
-<STRONG>nextCmd</STRONG> method for a single Managed Object might return
-a sequence of Managed Objects so that Object Name passed in request would
-be a prefix for Object Names returned in response (as a side note, the same
-method in Applications API would return <STRONG>varBinds</STRONG> as held
-in a single response, and regardless of the prefix property).
-</P>
-
-<P>
-It's possible to modify the above behaviour so that the
-<STRONG>varBindTable</STRONG> returned would contain *all*
-Managed Objects from those passed in request up to the end of
-the list of available Managed Objects at the Agent. This option
-is enabled by passing the <STRONG>lexicographicMode=True</STRONG>
-parameter to <STRONG>nextCmd</STRONG> method.
-</P>
-
-<P>
-In some cases application is also interested in some contiguous set of Managed
-Objects Instances not necessarily strictly belonging to the same subtree.
-The <STRONG>maxRows=NNN</STRONG> parameter to <STRONG>nextCmd</STRONG> would
-stop Command Generator once the required number (NNN) of Managed Objects
-Instances are retrieved from the Agent.
-</P>
-
-<P>
-Properties of the <STRONG>varBinds</STRONG> parameter is the same as in
-<A HREF="#CommandGenerator.getCmd">getCmd</A> method.
-</P>
-</DD>
-</DL>
-
-<P>
-The following code performs SNMP GETNEXT operation against a MIB subtree
-<UL>
-<LI>using SNMP v1
-<LI>with community name 'public'
-<LI>over IPv4/UDP
-<LI>against an Agent listening at localhost (UDP port 161)
-<LI>for some columns of the IF-MIB::ifEntry table
-<LI>stop reading values from Agent once response names leave the scopes of
-initial names (e.g. OBJECT IDENTIFIER's)
-</UL>
-</P>
-
-<P>
-The <A HREF="#MibVariable">MibVariable</A> object is used on input to
-allow symbolic MIB table columns specification. Response values
-are requested to be converted into MIB-defined type.
-</P>
-
-<P>
-Note: the code below needs access to IF-MIB (e.g. IF-MIB.py) which
-is installed with the <A HREF="https://sourceforge.net/projects/pysnmp/files/pysnmp-mibs/">pysnmp-mibs package</A> or could be
-<A HREF="#DATA-MODEL-MANAGED-OBJECTS">converted manually</A> into
-pysnmp MIB module from IF-MIB text source.
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-from pysnmp.entity.rfc3413.oneliner import cmdgen
-
-cmdGen = cmdgen.CommandGenerator()
-
-errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(
- cmdgen.CommunityData('public', mpModel=0),
- cmdgen.UdpTransportTarget(('localhost', 161)),
- cmdgen.MibVariable('IF-MIB', 'ifDescr'),
- cmdgen.MibVariable('IF-MIB', 'ifType'),
- cmdgen.MibVariable('IF-MIB', 'ifMtu'),
- cmdgen.MibVariable('IF-MIB', 'ifSpeed'),
- cmdgen.MibVariable('IF-MIB', 'ifPhysAddress'),
- lookupValues=True
-)
-
-if errorIndication:
- print(errorIndication)
-else:
- if errorStatus:
- print('%s at %s' % (
- errorStatus.prettyPrint(),
- errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
- )
- )
- else:
- for varBindTableRow in varBindTable:
- for name, val in varBindTableRow:
- print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
-</PRE>
-</TD></TR></TABLE>
-
-<A NAME="CommandGenerator.bulkCmd"></A>
-<DL>
-<DT><STRONG>bulkCmd</STRONG>(
-<STRONG>authData</STRONG>,
-<STRONG>transportTarget</STRONG>,
-<STRONG>nonRepeaters</STRONG>,
-<STRONG>maxRepetitions</STRONG>,
-<STRONG>*varNames</STRONG>,
-<STRONG>lookupNames=False</STRONG>,
-<STRONG>lookupValues=False</STRONG>,
-<STRONG>lexicographicMode=False</STRONG>,
-<STRONG>ignoreNonIncreasingOid=False</STRONG>,
-<STRONG>maxRows=0</STRONG>
-)</DT>
-
-<DD>
-<P>
-Perform SNMP GETBULK request and return a response or error indication.
-The GETBULK request type has the same semantics as GETNEXT one except that
-the latter is able to report multiple Managed Objects per each Managed Object
-name passed in request.
-</P>
-
-<P>
-The <STRONG>authData</STRONG>, <STRONG>transportTarget</STRONG>,
-<STRONG>*varNames</STRONG>, <STRONG>lookupNames</STRONG>, <STRONG>lookupValues</STRONG>,
-<STRONG>lexicographicMode</STRONG> and <STRONG>maxRows</STRONG> input parameters to the
-<STRONG>bulkCmd</STRONG> method are the same as of <STRONG>nextCmd</STRONG>.
-</P>
-
-<P>
-The <STRONG>nonRepeaters</STRONG> parameter indicates how many of
-<STRONG>*varNames</STRONG> passed in request should be queried for a single
-instance with in a request.
-</P>
-
-<P>
-The <STRONG>maxRepetitions</STRONG> parameter indicates for how many instances
-of Managed Objects in the rest of <STRONG>*varNames</STRONG>, besides first
-<STRONG>nonRepeaters</STRONG> ones, should be queried within a single request.
-</P>
-
-<P>
-The <STRONG>bulkCmd</STRONG> method returns a tuple of
-<STRONG>errorIndication</STRONG>,
-<STRONG>errorStatus</STRONG>,
-<STRONG>errorIndex</STRONG>,
-<STRONG>varBindTable</STRONG>.
-having same meaning as in <A HREF="#CommandGenerator.nextCmd">nextCmd</A> method.
-</P>
-
-</P>
-</DD>
-</DL>
-
-<P>
-The following code performs SNMP GETBULK operation against a MIB subtree
-<UL>
-<LI>using SNMP v3
-<LI>with SNMPv3, user 'usr-sha-aes128', SHA auth, AES128 privacy
-<LI>over IPv6/UDP
-<LI>against an Agent listening at ::1 (UDP port 161)
-<LI>with values non-repeaters = 0, max-repetitions = 20
-<LI>for the SNMPv2-MIB::system subtree
-<LI>stop reading values from Agent once response names leave the scopes of
-initial names (e.g. OBJECT IDENTIFIER's)
-</UL>
-</P>
-
-<P>
-The <A HREF="#MibVariable">MibVariable</A> object is used on input to
-allow symbolic MIB table columns specification.
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-from pysnmp.entity.rfc3413.oneliner import cmdgen
-
-cmdGen = cmdgen.CommandGenerator()
-
-errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.bulkCmd(
- cmdgen.UsmUserData('usr-sha-aes128', 'authkey1', 'privkey1',
- authProtocol=cmdgen.usmHMACSHAAuthProtocol,
- privProtocol=cmdgen.usmAesCfb128Protocol),
- cmdgen.Udp6TransportTarget(('::1', 161)),
- 0, 20,
- cmdgen.MibVariable('SNMPv2-MIB', 'system')
-)
-
-if errorIndication:
- print(errorIndication)
-else:
- if errorStatus:
- print('%s at %s' % (
- errorStatus.prettyPrint(),
- errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
- )
- )
- else:
- for varBindTableRow in varBindTable:
- for name, val in varBindTableRow:
- print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
-
-</PRE>
-</TD></TR></TABLE>
-
-<A NAME="NotificationOriginator"></A>
-<H4>
-2.1.1.2 Notification Originator
-</H4>
-
-<P>
-The Notification Originator Application is implemented within a single class:
-</P>
-
-<DL>
-<DT>class <STRONG>NotificationOriginator</STRONG>([<STRONG>snmpContext</STRONG>])</DT>
-<DD>
-<P>
-Create a SNMP Notification Originator object.
-</P>
-<P>
-Although instantiation of this class is cheap, in the course of its further
-use, SNMP engine configuration is built and maintained though methods
-invocation.
-Therefore it is advised to keep and reuse NotificationOriginator instance
-(or <STRONG>snmpEngine</STRONG> instance if passed as an initializer)
-for as long as possible within user applicatin.
-</P>
-</DD>
-</DL>
-
-<P>
-All notifications are sent by in invocation of the following method:
-</P>
-</P>
-
-<A NAME="NotificationOriginator.sendNotification"></A>
-<DL>
-<DT><STRONG>sendNotification</STRONG>(
-<STRONG>authData</STRONG>,
-<STRONG>transportTarget</STRONG>,
-<STRONG>notifyType</STRONG>,
-<STRONG>notificationType</STRONG>,
-<STRONG>*varBinds</STRONG>
-)</DT>
-
-<DD>
-<P>
-Send either unconfirmed (TRAP) or confirmed (INFORM) SNMP notification
-and possibly return an error indication.
-</P>
-
-<P>
-The <STRONG>authData</STRONG> and <STRONG>transportTarget</STRONG> parameters
-have the same semantics as in <A HREF="#CommandGenerator.getCmd">getCmd</A>
-method.
-</P>
-
-<P>
-The <STRONG>notifyType</STRONG> parameter determines the type of notification
-to be generated. Supported values include <STRONG>"trap"</STRONG> for
-unconfirmed notification or <STRONG>"inform"</STRONG> for a confirmed one.
-</P>
-
-<P>
-The <STRONG>notificationType</STRONG> parameter indicates the kind of
-event to notify Manager about in form of SMI NOTIFICATION-TYPE object
-name. Either
-<A HREF="http://pyasn1.sourceforge.net/#1.1.8">ObjectIdentifier</A> class
-instance, its initialization value (like '1.3.6.1.6.3.1.1.5.1') or
-<A HREF="#MibVariable">MibVariable</A> object can be used on input to
-allow MIB symbols references.
-For example, '1.3.6.1.6.3.1.1.5.1' or MibVariable('SNMPv2-MIB', 'coldStart')
-specify <I>SNMPv2-MIB::coldStart</I> type of trap.
-</P>
-
-<P>
-When sending SNMP v1 traps, the <STRONG>notificationType</STRONG>
-parameter encodes both <I>Generic</I> and <I>Specific</I> trap numbers
-hardwired into SNMP v1 TRAP PDU, but missing in SNMP v2c TRAP and INFORM
-PDUs.
-</P>
-
-<TABLE BORDER=1 WIDTH=90% ALIGN=CENTER>
-<TR>
-<TD>
-<STRONG>notificationType</STRONG>
-</TD>
-<TD>
-<I>GenericTrap</I>
-</TD>
-<TD>
-<I>SpecificTrap</I>
-</TD>
-</TR>
-<TR>
-<TD>1.3.6.1.6.3.1.1.5.1<TD>coldStart(0)<TD>0</TD>
-<TR>
-<TD>1.3.6.1.6.3.1.1.5.2<TD>warmStart(1)<TD>0</TD>
-<TR>
-<TD>1.3.6.1.6.3.1.1.5.3<TD>linkDown(2)<TD>0</TD>
-<TR>
-<TD>1.3.6.1.6.3.1.1.5.4<TD>linkUp(3)<TD>0</TD>
-<TR>
-<TD>1.3.6.1.6.3.1.1.5.5<TD>authenticationFailure(4)<TD>0</TD>
-<TR>
-<TD>1.3.6.1.6.3.1.1.5.6<TD>egpNeighborLoss(5)<TD>0</TD>
-<TR>
-<TD>1.3.6.1.6.3.1.1.5.0.1<TD>enterpriseSpecific(6)<TD>1</TD>
-<TR>
-<TD>1.3.6.1.6.3.1.1.5.0.999<TD>enterpriseSpecific(6)<TD>999</TD>
-<TR>
-<TD>1.3.6.1.6.3.1.1.5.0.N<TD>enterpriseSpecific(6)<TD>N</TD>
-</TR>
-</TABLE>
-
-<P>
-The <STRONG>*varBinds</STRONG> input parameter is a tuple of Managed
-Objects to be passed over to Manager along with Notification. The syntax
-of <STRONG>*varBinds</STRONG> is the same as in
-<A HREF="#CommandGenerator.getCmd">getCmd</A>
-</P>
-
-<P>
-The <STRONG>sendNotification</STRONG> method returns an
-<STRONG>errorIndication</STRONG> parameter which has the same meaning as
-in <A HREF="#CommandGenerator.getCmd">getCmd</A> method.
-</P>
-
-<P>
-When sending SNMP traps to a SNMPv1 system, PDU parameters
-that are present in SNMPv1 PDU but are missing in SNMPv2c PDU
-are mapped one to another via special Managed Objects Inctance
-values in <STRONG>*varBinds</STRONG>.
-</P>
-
-<UL>
-<LI>SNMP v1 PDU <I>enterprise</I> parameter is passed as a value of
-1.3.6.1.6.3.1.1.4.3.0 Managed Object Instance in <STRONG>*varBinds</STRONG>.
-If not specified, the default value is 1.3.6.1.6.3.1.1.5. If <I>Generic</I>
-encoded in <STRONG>notificationType</STRONG> is <I>enterpriseSpecific</I>,
-the <I>enterprise</I> parameter is implicitly initialized into
-<STRONG>notificationType</STRONG> value minus trailing sub-OID.
-<LI>SNMP v1 PDU <I>agent-addr</I> parameter is passed as a value of
-1.3.6.1.6.3.18.1.3.0 Managed Object Instance in <STRONG>*varBinds</STRONG>.
-<LI>SNMP v1 PDU <I>time-stamp</I> parameter is passed as a value of
-1.3.6.1.2.1.1.3.0 Managed Object Instance in <STRONG>*varBinds</STRONG>.
-</UL>
-
-</DD>
-</DL>
-
-<P>
-The following code sends SNMP v2c TRAP message:
-<UL>
-<LI>using SNMP v2c
-<LI>with community name 'public'
-<LI>over IPv4/UDP
-<LI>send TRAP notification
-<LI>with TRAP ID 'coldStart' specified as a MIB symbol
-<LI>include managed object information specified as a MIB symbol
-</UL>
-</P>
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-from pysnmp.entity.rfc3413.oneliner import ntforg
-
-ntfOrg = ntforg.NotificationOriginator()
-
-errorIndication = ntfOrg.sendNotification(
- ntforg.CommunityData('public'),
- ntforg.UdpTransportTarget(('localhost', 162)),
- 'trap',
- ntforg.MibVariable('SNMPv2-MIB', 'coldStart'),
- (ntforg.MibVariable('SNMPv2-MIB', 'sysName', 0), 'new name')
-)
-
-if errorIndication:
- print('Notification not sent: %s' % errorIndication)
-</PRE>
-</TD></TR></TABLE>
-
-<P>To send SNMP v1 traps using standard Notification Originator
-application API, one may need to pass, and possibly override some
-of defaulted, SNMP v1 PDU fields that are not present as such in SNMP
-v2c PDU and thus in the API.
-</P>
-
-<P>
-The following example sends SNMP v1 TRAP message overriding implicit
-defaults:
-<UL>
-<LI>using SNMP v1
-<LI>with community name 'public'
-<LI>over IPv4/UDP
-<LI>send TRAP notification
-<LI>with Generic Trap #6 (enterpriseSpecific) and Specific Trap 432
-<LI>overriding local snmpEngine's Uptime with value 12345
-<LI>overriding Agent Address with '127.0.0.1'
-<LI>overriding Enterprise OID with 1.3.6.1.4.1.20408.4.1.1.2
-<LI>include managed object information '1.3.6.1.2.1.1.1.0' = 'my system'
-specified as an OID-value pair
-</UL>
-</P>
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-from pysnmp.entity.rfc3413.oneliner import ntforg
-from pysnmp.proto import rfc1902
-
-ntfOrg = ntforg.NotificationOriginator()
-
-errorIndication = ntfOrg.sendNotification(
- ntforg.CommunityData('public', mpModel=0),
- ntforg.UdpTransportTarget(('localhost', 162)),
- 'trap',
- '1.3.6.1.4.1.20408.4.1.1.2.0.432',
- ('1.3.6.1.2.1.1.3.0', 12345),
- ('1.3.6.1.6.3.18.1.3.0', '127.0.0.1'),
- ('1.3.6.1.6.3.1.1.4.3.0', '1.3.6.1.4.1.20408.4.1.1.2'),
- ('1.3.6.1.2.1.1.1.0', rfc1902.OctetString('my system'))
-)
-
-if errorIndication:
- print('Notification not sent: %s' % errorIndication)
-</PRE>
-</TD></TR></TABLE>
-
-<P>
-The following code sends SNMP v2c INFORM message over SNMPv3:
-<UL>
-<LI>using SNMP v3
-<LI>with user 'usr-md5-des', auth: MD5, priv 3DES
-<LI>over IPv4/UDP
-<LI>send INFORM notification
-<LI>with TRAP ID 'warmStart' specified as a string OID
-<LI>include managed object information 1.3.6.1.2.1.1.5.0 = 'system name'
-specified as an OID-value pair
-</UL>
-</P>
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-from pysnmp.entity.rfc3413.oneliner import ntforg
-from pysnmp.proto import rfc1902
-
-ntfOrg = ntforg.NotificationOriginator()
-
-errorIndication = ntfOrg.sendNotification(
- ntforg.UsmUserData('usr-md5-des', 'authkey1', 'privkey1'),
- ntforg.UdpTransportTarget(('localhost', 162)),
- 'inform',
- '1.3.6.1.6.3.1.1.5.2',
- ('1.3.6.1.2.1.1.5.0', rfc1902.OctetString('system name'))
-)
-
-if errorIndication:
- print('Notification not sent: %s' % errorIndication)
-</PRE>
-</TD></TR></TABLE>
-
-<A NAME="ASYNCH-ONELINER-APPS"></A>
-<H4>
-2.1.2 Asynchronous One-line Applications
-</H4>
-
-<P>
-Asynchronous API to oneliner Applications is actually a foundation for
-<A HREF="#SYNCH-ONELINER-APPS">Synchronous</A> version, so they're very similar.
-This Asynchronous API is useful for purposes such as running multiple,
-possibly different, SNMP Applications at the same time or handling other
-activities inside user's program while SNMP Application is waiting for
-input/output.
-</P>
-
-<A NAME="AsynCommandGenerator"></A>
-<H4>
-2.1.2.1 Asynchronous Command Generator
-</H4>
-
-<P>
-All Command Generator Applications are implemented within a single class:
-</P>
-
-<DL>
-<DT>class <STRONG>AsynCommandGenerator</STRONG>([<STRONG>snmpEngine</STRONG>])</DT>
-<DD>
-<P>
-Create an asynchronous SNMP Command Generator object.
-</P>
-
-<P>
-Although instantiation of this class is cheap, in the course of its further
-use, SNMP engine configuration is built and maintained though methods
-invocation.
-Therefore it is advised to keep and reuse CommandGenerator instance
-(or <STRONG>snmpEngine</STRONG> instance if passed as an initializer)
-for as long as possible within user applicatin.
-</P>
-
-</DD>
-</DL>
-
-<P>
-Methods of the <STRONG>AsynCommandGenerator</STRONG> class instances implement
-specific request types. These methods are similar to those described in the
-<A HREF="#CommandGenerator">CommandGenerator</A> class section except that
-asynchronous interface uses a callback function for delivering responses.
-</P>
-
-<A NAME="AsynCommandGenerator.asyncGetCmd"></A>
-<DL>
-<DT><STRONG>getCmd</STRONG>(
-<STRONG>authData</STRONG>,
-<STRONG>transportTarget</STRONG>,
-<STRONG>varNames</STRONG>,
-(<STRONG>cbFun</STRONG>, <STRONG>cbCtx</STRONG>),
-<STRONG>lookupNames=False</STRONG>,
-<STRONG>lookupValues=False</STRONG>
-)</DT>
-
-<DD>
-<P>
-Prepare SNMP GET request to be dispatched. Return the
-<STRONG>sendRequestHandle</STRONG> value.
-</P>
-
-<P>
-The <STRONG>cbFun</STRONG> parameter is a reference to a callable object
-(such as a Python function) having the following signature:
-</P>
-
-<DL>
-<DT><STRONG>cbFun</STRONG>(
-<STRONG>sendRequestHandle</STRONG>,
-<STRONG>errorIndication</STRONG>,
-<STRONG>errorStatus</STRONG>,
-<STRONG>errorIndex</STRONG>,
-<STRONG>varBinds</STRONG>,
-<STRONG>cbCtx</STRONG>
-)</DT>
-
-<DD>
-<P>
-Where <STRONG>sendRequestHandle</STRONG> is an integer value used for matching
-response to request. Its counterpart is returned on request submission by
-the <STRONG>getCmd</STRONG> method.
-</P>
-
-<P>
-The <STRONG>cbCtx</STRONG> parameter is a reference to the
-<STRONG>cbCtx</STRONG> object being passed to <STRONG>getCmd</STRONG>
-method. Its purpose is to carry opaque application's state from request
-through response methods.
-</P>
-
-<P>
-The <STRONG>errorIndication</STRONG>, <STRONG>errorStatus</STRONG>,
-<STRONG>errorIndex</STRONG> and <STRONG>varBinds</STRONG> parameters
-have the same meaning as in <A HREF="#CommandGenerator.getCmd">getCmd</A>
-method.
-</P>
-
-</DD>
-</DL>
-
-<P>
-The <STRONG>authData</STRONG>, <STRONG>transportTarget</STRONG>,
-<STRONG>varNames</STRONG>, <STRONG>lookupNames</STRONG> and
-<STRONG>lookupValues</STRONG> parameters have the same meaning as in
-<A HREF="#CommandGenerator.getCmd">getCmd</A> method except that
-<STRONG>varNames</STRONG> is passed as a sequence, not as individual
-Managed Objects Instances names.
-</P>
-
-<P>
-The <STRONG>getCmd</STRONG> method returns unique
-<STRONG>sendRequestHandle</STRONG> integer value used for
-matching subsequent response to this request.
-</P>
-</DD>
-</DL>
-
-<P>
-The following code performs multiple, simultaneous SNMP GET operations
-for multiple Managed Objects Instances to a single Agent.
-Authentication information used in this example are the same for all targets.
-So the GET operation is performed:
-<UL>
-<LI>using SNMP v2c
-<LI>with SNMPv2c community 'public'
-<LI>over IPv4/UDP
-<LI>against an Agent listening at 127.0.0.1
-<LI>for the SNMPv2-MIB::sysDescr.0, SNMPv2-MIB::sysLocation.0 and SNMPv2-MIB::sysName.0 objects
-</UL>
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-from pysnmp.entity.rfc3413.oneliner import cmdgen
-
-def cbFun(sendRequestHandle, errorIndication, errorStatus, errorIndex,
- varBinds, cbCtx):
- if errorIndication:
- print(errorIndication)
- return
- if errorStatus:
- print('%s at %s' % \
- (errorStatus.prettyPrint(),
- errorIndex and varBinds[int(errorIndex)-1] or '?')
- )
- return
-
- for oid, val in varBinds:
- if val is None:
- print(oid.prettyPrint())
- else:
- print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))
-
-cmdGen = cmdgen.AsynCommandGenerator()
-
-for varName in ( cmdgen.MibVariable('SNMPv2-MIB', 'sysDescr', 0),
- cmdgen.MibVariable('SNMPv2-MIB', 'sysLocation', 0),
- cmdgen.MibVariable('SNMPv2-MIB', 'sysName', 0) ):
- cmdGen.getCmd(
- cmdgen.CommunityData('public'),
- cmdgen.UdpTransportTarget(('127.0.0.1', 161)),
- (varName,),
- (cbFun, None)
- )
-
-cmdGen.snmpEngine.transportDispatcher.runDispatcher()
-</PRE>
-</TABLE>
-
-<P>
-It is trivial to modify the above code to make it using different
-SNMP versions, credentials and query different Managed Objects Instances
-per each target.
-</P>
-
-<P>
-All queries are made in parallel, so with default timeout and retries
-settings, the above code will terminate in 6 seconds regardless of
-Agents avialability and responsiveness.
-</P>
-
-<A NAME="AsynCommandGenerator.asyncSetCmd"></A>
-<DL>
-<DT><STRONG>setCmd</STRONG>(
-<STRONG>authData</STRONG>,
-<STRONG>transportTarget</STRONG>,
-<STRONG>varBinds</STRONG>,
-(<STRONG>cbFun</STRONG>, <STRONG>cbCtx</STRONG>),
-<STRONG>lookupNames=False</STRONG>,
-<STRONG>lookupValues=False</STRONG>
-)</DT>
-
-<DD>
-<P>
-Prepare SNMP SET request to be dispatched. Return the
-<STRONG>sendRequestHandle</STRONG> value.
-</P>
-
-<P>
-The <STRONG>authData</STRONG>, <STRONG>transportTarget</STRONG>,
-<STRONG>varNames</STRONG>, <STRONG>lookupNames</STRONG> and
-<STRONG>lookupValues</STRONG> parameters have the same meaning as in
-<A HREF="#AsynCommandGenerator.setCmd">setCmd</A>.
-</P>
-
-<P>
-The <STRONG>cbFun</STRONG> and <STRONG>cbCtx</STRONG> parameters
-have the same meaning as in <A HREF="#AsynCommandGenerator.asyncGetCmd">
-AsynCommandGenerator.getCmd</A> method.
-</P>
-
-</DD>
-</DL>
-
-<A NAME="AsynCommandGenerator.asyncNextCmd"></A>
-<DL>
-<DT><STRONG>nextCmd</STRONG>(
-<STRONG>authData</STRONG>,
-<STRONG>transportTarget</STRONG>,
-<STRONG>varNames</STRONG>,
-(<STRONG>cbFun</STRONG>, <STRONG>cbCtx</STRONG>),
-<STRONG>lookupNames=False</STRONG>,
-<STRONG>lookupValues=False</STRONG>
-)</DT>
-
-<DD>
-<P>
-Prepare SNMP GETNEXT request to be dispatched. Return the
-<STRONG>sendRequestHandle</STRONG> value.
-</P>
-
-<P>
-The <STRONG>authData</STRONG>, <STRONG>transportTarget</STRONG>,
-<STRONG>varNames</STRONG>, <STRONG>lookupNames</STRONG> and
-<STRONG>lookupValues</STRONG> parameters have the same meaning as in
-<A HREF="#CommandGenerator.nextCmd">nextCmd</A> method except that
-<STRONG>varNames</STRONG> is passed as a sequence, not as individual
-Managed Objects Instances names.
-</P>
-
-<P>
-The <STRONG>cbFun</STRONG> and <STRONG>cbCtx</STRONG> parameters
-have the same meaning as in <A HREF="#AsynCommandGenerator.asyncGetCmd">
-AsynCommandGenerator.getCmd</A> method.
-Appliction can indicate to GETNEXT SNMP Application that it is no more
-interested in further information from Agent and wishes to stop by
-returning True from the <STRONG>cbFun</STRONG>. Otherwise it should return
-False.
-</P>
-
-<P>
-The <STRONG>varNames</STRONG> parameter has the same meaning as in
-<A HREF="#CommandGenerator.nextCmd">CommandGenerator.nextCmd</A> method
-except that here it is passed in as a tuple.
-</P>
-</DD>
-</DL>
-
-<P>
-The following code performs multiple, simultaneous SNMP GETNEXT operations
-against distinct Agents identified by their transport addresses.
-Authentication information and queried Managed Objects Instances used in
-this example are the same for all targets. So the GETNEXT operation is performed:
-<UL>
-<LI>using SNMP v3
-<LI>with SNMPv3 with user 'usr-md5-des', MD5 auth and DES privacy protocols
-<LI>over IPv4/UDP
-<LI>against Agents listening at 127.0.0.1, 192.168.1.1, 10.40.1.1 (port 161)
-<LI>for the SNMPv2-MIB::system subtree
-</UL>
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-from pysnmp.entity.rfc3413.oneliner import cmdgen
-
-def cbFun(sendRequestHandle, errorIndication, \
- errorStatus, errorIndex, varBindTable, cbCtx):
- if errorIndication:
- print(errorIndication)
- return
- if errorStatus:
- print('%s at %s' % \
- (errorStatus.prettyPrint(),
- errorIndex and varBindTable[-1][int(errorIndex)-1] or '?')
- )
- return
-
- for varBindRow in varBindTable:
- for oid, val in varBindRow:
- if val is None:
- return # stop table retrieval
- else:
- print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))
-
- return True # continue table retrieval
-
-cmdGen = cmdgen.AsynCommandGenerator()
-
-for transportTarget in ( cmdgen.UdpTransportTarget(('127.0.0.1', 161)),
- cmdgen.UdpTransportTarget(('192.168.1.1', 161)),
- cmdgen.UdpTransportTarget(('10.40.1.1', 161)) ):
- cmdGen.nextCmd(
- cmdgen.UsmUserData('usr-md5-des', 'authkey1', 'privkey1'),
- transportTarget,
- ( cmdgen.MibVariable('SNMPv2-MIB', 'system'), ),
- (cbFun, None)
- )
-
-cmdGen.snmpEngine.transportDispatcher.runDispatcher()
-</PRE>
-</TABLE>
-
-<A NAME="AsynCommandGenerator.asyncBulkCmd"></A>
-<DL>
-<DT><STRONG>bulkCmd</STRONG>(
-<STRONG>authData</STRONG>,
-<STRONG>transportTarget</STRONG>,
-<STRONG>nonRepeaters</STRONG>,
-<STRONG>maxRepetitions</STRONG>,
-<STRONG>varNames</STRONG>,
-(<STRONG>cbFun</STRONG>, <STRONG>cbCtx</STRONG>),
-<STRONG>lookupNames=False</STRONG>,
-<STRONG>lookupValues=False</STRONG>
-)</DT>
-
-<DD>
-<P>
-Prepare SNMP GETBULK request to be dispatched. Return the
-<STRONG>sendRequestHandle</STRONG> value.
-</P>
-
-<P>
-The <STRONG>authData</STRONG>, <STRONG>transportTarget</STRONG>,
-<STRONG>nonRepeaters</STRONG>, <STRONG>maxRepetitions</STRONG>
-<STRONG>varNames</STRONG>, <STRONG>lookupNames</STRONG> and
-<STRONG>lookupValues</STRONG> parameters have the same meaning as in
-<A HREF="#CommandGenerator.bulkCmd">bulkCmd</A> method except that
-<STRONG>varNames</STRONG> is passed as a sequence, not as individual
-Managed Objects Instances names.
-</P>
-
-<P>
-The <STRONG>cbFun</STRONG> and <STRONG>cbCtx</STRONG> parameters
-have the same meaning as in <A HREF="#AsynCommandGenerator.asyncNextCmd">
-AsynCommandGenerator.nextCmd</A> method.
-</P>
-
-</DD>
-</DL>
-
-<P>
-After one or more requests have been submitted by calling one or more
-of the methods above, Transport Dispatcher must be invoked to get SNMP
-engine running. This is done by calling:
-</P>
-
-<DL>
-<DT><STRONG>
-asynCommandGenerator.snmpEngine.transportDispatcher.runDispatcher
-</STRONG>
-()</DT>
-
-<DD>
-<P>
-Where <STRONG>asynCommandGenerator</STRONG> is
-<STRONG>AsynCommandGenerator</STRONG> class instance.
-</P>
-</DD>
-</DL>
-
-<P>
-The <STRONG>runDispatcher</STRONG>() method terminates when no pending requests
-left for running Applications.
-</P>
-
-<A NAME="AsynNotificationOriginator"></A>
-<H4>
-2.1.2.2 Asynchronous Notification Originator
-</H4>
-
-<P>
-The Notification Originator Application is implemented within a single class:
-</P>
-
-<DL>
-<DT>class <STRONG>AsynNotificationOriginator</STRONG>([<STRONG>snmpContext</STRONG>])</DT>
-<DD>
-<P>
-Create an asynchronous SNMP Notification Originator object.
-</P>
-</DD>
-</DL>
-
-<P>
-The only method of <STRONG>AsynNotificationOriginator</STRONG> class is
-similar to that described in the <A HREF="#NotificationOriginator">
-NotificationOriginator</A> class section except that asynchronous interface
-uses a callback function for delivery confirmation when confirmed notification
-are used.
-</P>
-
-<A NAME="AsynNotificationOriginator.asyncSendNotification"></A>
-<DL>
-<DT><STRONG>sendNotification</STRONG>(
-<STRONG>authData</STRONG>,
-<STRONG>transportTarget</STRONG>,
-<STRONG>notifyType</STRONG>,
-<STRONG>notificationType</STRONG>,
-<STRONG>varBinds</STRONG>,
-(<STRONG>cbFun</STRONG>, <STRONG>cbCtx</STRONG>)
-)</DT>
-
-<DD>
-<P>
-Prepare SNMP TRAP or INFORM notification to be dispatched. Return the
-<STRONG>sendRequestHandle</STRONG> value.
-</P>
-
-<P>
-The <STRONG>cbFun</STRONG> parameter is a reference to a callable object
-(such as Python function) that takes the following parameters:
-</P>
-
-<DL>
-<DT><STRONG>cbFun</STRONG>(
-<STRONG>sendRequestHandle</STRONG>,
-<STRONG>errorIndication</STRONG>,
-<STRONG>cbCtx</STRONG>
-)</DT>
-
-<DD>
-
-<P>
-Where the <STRONG>sendRequestHandle</STRONG>, <STRONG>errorIndication</STRONG>
-and <STRONG>cbCtx</STRONG> parameters have the same meaning as in
-callback function in
-<A HREF="#AsynCommandGenerator.asyncGetCmd">AsynCommandGenerator.getCmd</A> method.
-</P>
-
-</DD>
-</DL>
-
-<P>
-The <STRONG>cbCtx</STRONG> parameter has the same meaning as in
-<A HREF="#AsynCommandGenerator.asyncGetCmd">AsynCommandGenerator.getCmd</A> method.
-</P>
-
-<P>
-The <STRONG>notifyType</STRONG>, <STRONG>notificationType</STRONG> and
-<STRONG>varBinds</STRONG> parameters have the same meaning as in
-<A HREF="#NotificationOriginator.sendNotification">
-NotificationOriginator.sendNotification</A> method
-except that here it is passed in as a tuple.
-</P>
-
-<P>
-The <STRONG>sendNotification</STRONG> method returns unique
-<STRONG>sendRequestHandle</STRONG> integer value used for
-matching subsequent delivery confirmation response to arbitrary notification.
-</P>
-
-</DD>
-</DL>
-
-<P>
-After one or more notifications have been submitted by calling the
-<STRONG>sendNotification</STRONG> method, Transport Dispatcher must be
-invoked to get SNMP engine running. This is done by calling:
-</P>
-
-<DL>
-<DT><STRONG>
-asynNotificationOriginator.snmpEngine.transportDispatcher.runDispatcher
-</STRONG>
-()</DT>
-
-<DD>
-<P>
-Where <STRONG>asynNotificationOriginator</STRONG> is
-<STRONG>AsynNotificationOriginator</STRONG> class instance.
-</P>
-</DD>
-</DL>
-
-<P>
-The <STRONG>runDispatcher</STRONG>() method terminates when no unconfirmed
-notifications left for running Applications.
-</P>
-
-<P>
-The following code sends multiple, simultaneous SNMP INFORM messages
-to multiple Managers. Authentication information used in this example is
-the same for all targets.
-<UL>
-<LI>using SNMP v2c
-<LI>with SNMPv2c community 'public'
-<LI>over IPv4/UDP
-<LI>against Managers listening at 127.0.0.1, 127.0.0.2, 127.0.0.3 (port 162)
-</UL>
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-from pysnmp.entity.rfc3413.oneliner import ntforg
-from pysnmp.proto import rfc1902
-
-def cbFun(sendRequestHandle, errorIndication, cbCtx):
- if errorIndication:
- print(errorIndication)
- else:
- print('INFORM %s delivered' % sendRequestHandle)
-
-ntfOrg = ntforg.AsynNotificationOriginator()
-
-for target in ( ntforg.UdpTransportTarget(('127.0.0.1', 162)),
- ntforg.UdpTransportTarget(('127.0.0.2', 162)),
- ntforg.UdpTransportTarget(('127.0.0.3', 162)) ):
- ntfOrg.sendNotification(
- ntforg.CommunityData('public'),
- target,
- 'inform',
- ntforg.MibVariable('SNMPv2-MIB', 'coldStart'),
- ( ('1.3.6.1.2.1.1.5.0', rfc1902.OctetString('system name')), ),
- (cbFun, None)
- )
-
-ntfOrg.snmpEngine.transportDispatcher.runDispatcher()
-</PRE>
-</TD></TR></TABLE>
-
-<P>
-The above script terminates as all queries are either acknowledged
-or timed out. With default timeout and retries settings, this will happen
-in no longer than 6 seconds regardless of Managers avialability and
-responsiveness.
-
-</P>
-
-<A NAME="SECURITY-CONFIGURATION"></A>
-<H4>
-2.1.3 Security configuration
-</H4>
-<P>
-Calls to oneliner Applications API require Security Parameters and
-Transport configuration objects as input parameters. These classes
-serve as convenience shortcuts to SNMP engine configuration facilities
-and for keeping persistent authentication/transport configuration
-between SNMP engine calls.
-</P>
-
-<P>
-Security Parameters object is Security Model specific.
-<STRONG>UsmUserData</STRONG> class serves SNMPv3 User-Based Security
-Model configuration, while <STRONG>CommunityData</STRONG> class
-is used for Community-Based Security Model of SNMPv1/SNMPv2c.
-</P>
-
-<A NAME="UsmUserData"></A>
-<DL>
-<DT>class <STRONG>UsmUserData</STRONG>(
-<STRONG>securityName</STRONG>,
-<STRONG>authKey=''</STRONG>,
-<STRONG>privKey=''</STRONG>,
-<STRONG>authProtocol=usmNoAuthProtocol</STRONG>,
-<STRONG>privProtocol=usmNoPrivProtocol</STRONG>
-)</DT>
-<DD>
-<P>
-Create an object holding User-Based Security Model specific configuration
-parameters.
-</P>
-<P>
-Mandatory <STRONG>securityName</STRONG> parameter is SNMPv3 USM username
-passed in as a string.
-</P>
-
-<P>
-Optional <STRONG>authKey</STRONG> parameter is a secret key (string typed)
-used within USM for SNMP PDU authorization. Setting it to a non-empty
-value implies MD5-based PDU authentication (<STRONG>usmHMACMD5AuthProtocol</STRONG>)
-to take effect. Default hashing method may be changed by means of further
-<STRONG>authProtocol</STRONG> parameter.
-</P>
-
-<P>
-Optional <STRONG>privKey</STRONG> parameter is a secret key (string typed)
-used within USM for SNMP PDU encryption. Setting it to a non-empty
-value implies MD5-based PDU authentication (<STRONG>usmHMACMD5AuthProtocol</STRONG>)
-and DES-based encryption (<STRONG>usmDESPrivProtocol</STRONG>) to
-take effect. Default hashing and/or encryption methods may be changed by
-means of further <STRONG>authProtocol</STRONG> and/or
-<STRONG>privProtocol</STRONG> parameters.
-</P>
-
-<P>
-Optional <STRONG>authProtocol</STRONG> parameter may be used to specify
-non-default hash function algorithm. Possible values include:
-</P>
-<UL>
-<LI><STRONG>usmHMACMD5AuthProtocol</STRONG> -- MD5-based authentication protocol
-<LI><STRONG>usmHMACSHAAuthProtocol</STRONG> -- SHA-based authentication protocol
-<LI><STRONG>usmNoAuthProtocol</STRONG> -- no authentication to use
-</UL>
-
-<P>
-Optional <STRONG>privProtocol</STRONG> parameter may be used to specify
-non-default ciphering algorithm. Possible values include:
-</P>
-<P>
-<UL>
-<LI><STRONG>usmDESPrivProtocol</STRONG> -- DES-based encryption protocol
-<LI><STRONG>usmAesCfb128Protocol</STRONG> -- AES128-based encryption protocol (<A HREF="http://www.ietf.org/rfc/rfc3826.txt">RFC3826</A>)
-<LI><STRONG>usm3DESEDEPrivProtocol</STRONG> -- triple DES-based encryption protocol (<A HREF="http://www.snmp.com/protocol/eso.shtml">Extended Security Options</A>)
-<LI><STRONG>usmAesCfb192Protocol</STRONG> -- AES192-based encryption protocol (<A HREF="http://www.snmp.com/protocol/eso.shtml">Extended Security Options</A>)
-<LI><STRONG>usmAesCfb256Protocol</STRONG> -- AES256-based encryption protocol (<A HREF="http://www.snmp.com/protocol/eso.shtml">Extended Security Options</A>)
-<LI><STRONG>usmNoPrivProtocol</STRONG> -- no encryption to use
-</UL>
-
-<P>
-All these symbols are defined in
-<STRONG>pysnmp.entity.rfc3413.oneliner.cmdgen</STRONG> module.
-</P>
-
-</DD>
-</DL>
-
-<A NAME="CommunityData"></A>
-<DL>
-<DT>class <STRONG>CommunityData</STRONG>(
-<STRONG>communityName</STRONG>,
-<STRONG>mpModel=1</STRONG>
-)</DT>
-<DD>
-<P>
-Create an object holding Community-Based Security Model specific configuration
-parameters.
-</P>
-
-<P>
-Mandatory <STRONG>communityName</STRONG> parameter is SNMPv1/SNMPv2c Community name
-passed as a string.
-</P>
-
-<P>
-Optional <STRONG>mpModel</STRONG> parameter indicates whether SNMPv2c
-(mpModel=1, default) or SNMPv1 (mpModel=0) protocol should be used.
-</P>
-</DD>
-</DL>
-
-<A NAME="TRANSPORT-CONFIGURATION"></A>
-<H4>
-2.1.4 Transport configuration
-</H4>
-<P>
-Transport configuration object is Transport domain specific.
-<STRONG>UdpTransportTarget</STRONG> class represents a remote
-network endpoint of a UDP-over-IPv4 transport.
-</P>
-
-<A NAME="UdpTransportTarget"></A>
-<DL>
-<DT>class <STRONG>UdpTransportTarget</STRONG>(
-<STRONG>transportAddr</STRONG>,
-<STRONG>timeout=1</STRONG>,
-<STRONG>retries=5</STRONG>
-)</DT>
-<DD>
-<P>
-Create an object representing a network path connecting two
-SNMP entities through a UDP/IPv4 socket.
-</P>
-<P>
-Mandatory <STRONG>transportAddr</STRONG> parameter indicates remote address
-in form of a tuple of <STRONG>FQDN</STRONG>, <STRONG>port</STRONG>
-where <STRONG>FQDN</STRONG> is a string representing either hostname
-or IPv4 address in quad-dotted form, <STRONG>port</STRONG> is an
-integer.
-</P>
-<P>
-Optional <STRONG>timeout</STRONG> and <STRONG>retries</STRONG> parameters
-may be used to modify default response timeout (1 second) and number
-of succesive request retries (5 times).
-</P>
-</DD>
-</DL>
-
-<A NAME="Udp6TransportTarget"></A>
-<DL>
-<DT>class <STRONG>Udp6TransportTarget</STRONG>(
-<STRONG>transportAddr</STRONG>,
-<STRONG>timeout=1</STRONG>,
-<STRONG>retries=5</STRONG>
-)</DT>
-<DD>
-<P>
-Create an object representing a network path connecting two
-SNMP entities through a UDP/IPv6 socket.
-</P>
-<P>
-Mandatory <STRONG>transportAddr</STRONG> parameter indicates remote address
-in form of a tuple of <STRONG>FQDN</STRONG>, <STRONG>port</STRONG>
-where <STRONG>FQDN</STRONG> is a string representing either hostname
-or IPv6 address in semicolon-separated form, <STRONG>port</STRONG> is an
-integer.
-</P>
-<P>
-Optional <STRONG>timeout</STRONG> and <STRONG>retries</STRONG> parameters
-may be used to modify default response timeout (1 second) and number
-of succesive request retries (5 times).
-</P>
-</DD>
-</DL>
-
-<A NAME="MANAGED-OBJECT-NAME-VALUE"></A>
-<H4>
-2.2 Managed Objects names and values
-</H4>
-
-<A NAME="OIDVAL-IMPL">
-On the protocol level, a Managed Object Instance is represented by a pair
-of Name and Value items collectively called a <STRONG>Variable-Binding</STRONG>.
-In PySNMP oneliner API, a Managed Object Instance is represented by a
-two-component sequence of two objects -- one represents Managed Object Name
-or Managed Object Instance Name, and the other - Managed Object Instance
-Value. The types of these objects may vary, details follow.
-</P>
-
-<A NAME="OID-IMPL"></A>
-<H4>
-2.2.1 Managed Objects Names
-</H4>
-<P>
-Managed Object or Managed Object Instance Name is an instance of
-<STRONG>ObjectName</STRONG> class which is derived from PyASN1
-<A HREF="http://pyasn1.sourceforge.net/#1.1.8">ObjectIdentifier</A>.
-In most cases, PySNMP oneliner API will automatically create an instance of
-<STRONG>ObjectName</STRONG> class from its initialization value which
-can be:
-</P>
-
-<ul>
-<li>a plain string of dot-separated numbers, e.g. '1.3.6.1.2.1.1.1.0'
-<li>a tuple of integers e.g., (1, 3, 6, 1, 2, 1, 1, 1, 0)
-<li>an instance of <A HREF="http://pyasn1.sourceforge.net/#1.1.8">ObjectIdentifier</A> class or its derivative such as <STRONG>ObjectName</STRONG>
-</ul>
-
-
-<A NAME="MibVariable"></A>
-<P>
-In order to make use of additional information related to Managed Objects,
-such as their human-friendly representation, associated value type, description
-of intended use and other details contained in MIBs, the
-<STRONG>MibVariable</STRONG> class instances may be used interchangeably
-instead of <STRONG>ObjectName</STRONG> objects.
-</P>
-
-<DL>
-<DT>class <STRONG>MibVariable</STRONG>(
-<STRONG>varName</STRONG>
-)</DT>
-<DD>
-
-<P>
-Create an object representing a varying amount of Managed Object Name
-information. At the bare minimum <STRONG>MibVariable</STRONG> object
-will only hold an OBJECT IDENTIFIER that identifies particular
-Managed Object. However more information on Managed Object may be
-gathered by PySNMP during the course of SNMP request processing.
-All the extra information comes through a lookup at a MIB where particular
-Managed Object is specified.
-</P>
-
-<P>
-The mandatory <STRONG>varName</STRONG> argument must hold a valid
-initializer for
-<A HREF="http://pyasn1.sourceforge.net/#1.1.8">ObjectIdentifier</A>
-kind of objects.
-</P>
-
-</DD>
-
-<P>or</P>
-
-<DT>class <STRONG>MibVariable</STRONG>(
-<STRONG>mibName</STRONG>,
-<STRONG>symName</STRONG>,
-*<STRONG>indices</STRONG>
-)</DT>
-<DD>
-
-<P>
-Create an object potentially representing all MIB information
-on particular Managed Object. By the moment of instantiation
-no additional information is acquired, but during the later stages
-of SNMP request processing, PySNMP will attempt to lookup additional
-information at the MIB named <STRONG>mibName</STRONG> for the object
-registered there under name <STRONG>symName</STRONG>.
-</P>
-
-<P>
-If requested MIB or symbol can not be found, the <STRONG>PySnmpError</STRONG>
-exception will be thrown.
-</P>
-
-<P>
-The mandatory <STRONG>mibName</STRONG> and <STRONG>symName</STRONG>
-arguments refer to the names under which particular Managed Object
-is specified in the MIB (e.g. 'IF-MIB' and 'ifTable' respectively).
-Both parameters are Python strings.
-</P>
-
-<P>
-The optional <STRONG>indices</STRONG> sequence semantics depend on the
-type of MIB Object refered by <STRONG>mibName</STRONG> and
-<STRONG>symName</STRONG> parameters.
-</P>
-
-<UL>
-<LI>For <STRONG>MibTableColumn</STRONG> objects <STRONG>indices</STRONG>
-are a sequence of Conceptual Table Instance ID in a human-friendly
-form (e.g. "127.0.0.1"-indexed element of a IP-MIB::ipAdEntAddr column)
-<LI>For <STRONG>MibScalar</STRONG> objects <STRONG>indices</STRONG>
-are interpreted as an sub-OBJECT IDENTIFIER
-</UL>
-
-</DD>
-</DL>
-
-<P>
-Methods of the <STRONG>MibVariable</STRONG> objects are as follows:
-</P>
-
-<A NAME="MibVariable.getMibSymbol"></A>
-<DL>
-<DT><STRONG>getMibSymbol</STRONG>(
-)</DT>
-
-<DD>
-<P>
-Return a sequence of <STRONG>mibName</STRONG>, <STRONG>symName</STRONG>
-and <STRONG>indices</STRONG> identifying arbitrary Managed Object.
-</P>
-</DD>
-
-<A NAME="MibVariable.getOid"></A>
-<DT><STRONG>getOid</STRONG>(
-)</DT>
-
-<DD>
-<P>
-Return Managed Object Name in form of <A HREF="http://pyasn1.sourceforge.net/#1.1.8">ObjectIdentifier</A> object.
-</P>
-</DD>
-
-<A NAME="MibVariable.getMibNode"></A>
-<DT><STRONG>getMibNode</STRONG>(
-)</DT>
-
-<DD>
-<P>
-Return MIB information in form of a
-<A HREF="#DATA-MODEL-MANAGED-OBJECTS">Managed Object</A>
-identified by this particular name.
-</P>
-</DD>
-
-<A NAME="MibVariable.isFullyResolved"></A>
-<DT><STRONG>isFullyResolved</STRONG>(
-)</DT>
-
-<DD>
-<P>
-Return <STRONG>True</STRONG> if MIB lookup for initial initializers was
-successful and complete MIB information is available.
-</P>
-
-</DD>
-</DL>
-
-<A NAME="VAL-IMPL"></A>
-<H4>
-2.2.2 Managed Objects Values
-</H4>
-<P>
-Managed Object Instance Value is an instance of some
-<A HREF="http://pyasn1.sf.net">PyASN1</A> class or its
-SNMP-specific derivative. The latter case reflects SNMP-specific
-<A HREF="#ASN1">ASN.1</A> sub-type.
-</P>
-
-<P>
-PySNMP implementation of SNMPv3 architecture always exposes, <A HREF="#SMI">SMIv2</A> definitions for
-Managed Objects are always used regardless of the underlying SNMP protocol
-version being talked with a peer. For instance, an SNMPv3 Manager will always
-report SMIv2 types even when working to SNMPv1 Agent (which is SMIv1-compliant).
-</P>
-
-<P>
-The list of Managed Object Instance Value classes follows.
-</P>
-
-<A NAME="INTEGER-IMPL"></A>
-<DL>
-<DT>class <STRONG>Integer</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>Integer</STRONG> object. The <STRONG>value</STRONG>
-parameter should be an integer value. Instances of this class mimic basic
-properties of a Python integer. SMIv2 Integer class is derived from
-PyASN1 <A HREF="http://pyasn1.sourceforge.net/#1.1.3">Integer</A>.
-</P>
-</DD>
-</DL>
-
-<A NAME="INTEGER32-IMPL"></A>
-<DL>
-<DT>class <STRONG>Integer32</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>Integer32</STRONG> object. This object is similar to
-<A HREF="#INTEGER-IMPL">Integer</A> class instance.
-</P>
-</DD>
-</DL>
-
-<A NAME="OBJECTIDENTIFIER-IMPL"></A>
-<DL>
-<DT>class <STRONG>OctetIdentifier</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>OctetIdentifier</STRONG> object.
-The <STRONG>value</STRONG>
-parameter could be a tuple of integer sub-IDs or a human-friendly
-string form like ".1.3.6.1.3.1". SMIv2 OctetString class is derived from
-PyASN1 <A HREF="http://pyasn1.sourceforge.net/#1.1.8">OctetIdentifier</A>.
-</P>
-</DD>
-</DL>
-
-<A NAME="OCTETSTRING-IMPL"></A>
-<DL>
-<DT>class <STRONG>OctetString</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>OctetString</STRONG> object. The <STRONG>value</STRONG>
-parameter should be a string value. Instances of this class mimic basic
-properties of a Python string. SMIv2 OctetString class is derived from
-PyASN1 <A HREF="http://pyasn1.sourceforge.net/#1.1.7">OctetString</A>.
-</P>
-</DD>
-</DL>
-
-<A NAME="IPADDRESS-IMPL"></A>
-<DL>
-<DT>class <STRONG>IpAddress</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>IpAddress</STRONG> object. The <STRONG>value</STRONG>
-parameter should be an IP address expressed in quad-dotted notation (e.g.
-"127.0.0.1"). SMIv2 IpAddress class is derived from
-PyASN1 <A HREF="http://pyasn1.sourceforge.net/#1.1.7">OctetString</A>.
-</P>
-</DD>
-</DL>
-
-<A NAME="COUNTER32-IMPL"></A>
-<DL>
-<DT>class <STRONG>Counter32</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>Counter32</STRONG> object. Besides different value
-constraints, this object is similar to <A HREF="#INTEGER-IMPL">Integer</A>
-class instance.
-</P>
-</DD>
-</DL>
-
-<A NAME="GAUGE32-IMPL"></A>
-<DL>
-<DT>class <STRONG>Gauge32</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>Gauge32</STRONG> object. Besides different value
-constraints, this object is similar to <A HREF="#INTEGER-IMPL">Integer</A>
-class instance.
-</P>
-</DD>
-</DL>
-
-<A NAME="UNSIGNED32-IMPL"></A>
-<DL>
-<DT>class <STRONG>Unsigned32</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>Unsigned32</STRONG> object. Besides different value
-constraints, this object is similar to <A HREF="#INTEGER-IMPL">Integer</A>
-class instance.
-</P>
-</DD>
-</DL>
-
-<A NAME="TIMETICKS-IMPL"></A>
-<DL>
-<DT>class <STRONG>TimeTicks</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>TimeTicks</STRONG> object. Besides different value
-constraints, this object is similar to <A HREF="#INTEGER-IMPL">Integer</A>
-class instance.
-</P>
-</DD>
-</DL>
-
-<A NAME="OPAQUE-IMPL"></A>
-<DL>
-<DT>class <STRONG>Opaque</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>Opaque</STRONG> object. This object is similar to
-<A HREF="#OCTETSTRING-IMPL">OctetString</A> class instance.
-</P>
-</DD>
-</DL>
-
-<A NAME="COUNTER64-IMPL"></A>
-<DL>
-<DT>class <STRONG>Counter64</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>Counter64</STRONG> object. Besides different value
-constraints, this object is similar to <A HREF="#INTEGER-IMPL">Integer</A>
-class instance.
-</P>
-</DD>
-</DL>
-
-<A NAME="BITS-IMPL"></A>
-<DL>
-<DT>class <STRONG>Bits</STRONG>(
-<STRONG>value</STRONG>
-)</DT>
-<DD>
-<P>
-Create a SMIv2 <STRONG>Bits</STRONG> object. The <STRONG>value</STRONG>
-parameter should be sequence of names of bits raised to one. Unmentioned
-bits default to zero. The Bits class is derived from
-PyASN1 <A HREF="http://pyasn1.sourceforge.net/#1.1.7">OctetString</A>.
-
-</P>
-</DD>
-</DL>
-
-<A NAME="TEXTUAL-CONVENTION-AS-A-TYPE"></A>
-<P>
-All the above types are directly used by SNMP protocol and can be exchanged
-between user application and PySNMP in the course of SNMP engine operations
-through PySNMP APIs. However, by SNMP design, some additional information
-on specific Managed Objects Instances value ranges and human-friendly
-representation can be carried by MIBs in form of
-<STRONG>TEXTUAL-CONVENTION</STRONG> SMI constructs. PySNMP implements this
-feature in form of <STRONG>TextualConvention</STRONG> class which is
-actually a derivative of one of the above Managed Objects Instance Value
-classes so objects of these classes can be used interchangeably in all
-PySNMP APIs.
-</P>
-
-
-<P>
-For more information on SNMP Managed Value objects properties,
-refer to their base classes in <A HREF="http://pyasn1.sf.net">PyASN1</A>
-documentation.
-</P>
-
-<A NAME="MIB-SERVICES"></A>
-<H4>
-2.3 MIB services
-</H4>
-
-<P>
-PySNMP supports both Manager and Agent-side operations on
-<A HREF="#MANAGED-OBJECTS">Managed Objects</A>,
-including MIB lookup and custom Managed Objects implementation.
-</P>
-
-<P>
-Managed Objects, <A HREF="#DATA-MODEL-MANAGED-OBJECTS">implemented in
-Python code</A>, is the basis for PySNMP MIB services. Managed Objects
-are collected into a pool and then managed by a
-<A HREF="#MIB-BUILDER">MIB builder</A>. Both Manager and Agent
-applications deal with their Managed Objects through role-specific
-<A HREF="#MibViewController">MIB view</A> and
-<A HREF="#MibInstrumentationController">MIB instrumentation</A>. The same
-set of Managed Objects could serve both Manager and Agent purposes within
-a single SNMP entity.
-</P>
-
-<A NAME="DATA-MODEL-MANAGED-OBJECTS"></A>
-<H4>
-2.3.1 Data model for Managed Objects
-</H4>
-
-<P>
-In PySNMP, <A HREF="#MANAGED-OBJECTS">Managed Objects</A> specified in MIBs
-take shape of Python objects that implement various kinds of
-<A HREF="#SMI">SMIv2</A> definitions.
-Managed Objects specified in a <A HREF="#MIB">MIB</A> file translate
-in a one-to-one fashion into Python modules.
-</P>
-
-<P>
-Automated conversion of MIB text files into Python modules can be done
-through the use of smidump tool of
-<A HREF="http://www.ibr.cs.tu-bs.de/projects/libsmi/">libsmi</A> package
-and "<STRONG>build-pysnmp-mib</STRONG>" script shipped with PySNMP.
-</P>
-
-<P>
-The <STRONG>pysnmp.smi.mibs.SNMPv2-SMI</STRONG> module
-implements the following classes:
-</P>
-
-<A NAME="MibScalar"></A>
-<DL>
-<DT>class <STRONG>MibScalar</STRONG>(
-<STRONG>name</STRONG>,
-<STRONG>syntax</STRONG>
-)</DT>
-<DD>
-<P>
-A representation of a scalar Managed Object specification identified by
-<STRONG>name</STRONG> with associated value of type <STRONG>syntax</STRONG>.
-Objects of this kind never hold actual values, rather they serve the following
-purposes:
-<UL>
-<LI>Logically bind Managed Object Name with Value
-<LI>Specify value type (including TEXTUAL-CONVENTION-based constraints)
-<LI>Provide human-friendly Managed Object name and value representation
-</UL>
-</P>
-
-<A NAME="MANAGED-OBJECT-NAME"></A>
-<P>
-The <STRONG>name</STRONG> parameter represents an
-<A HREF="#OID">Object Identifier</A> which can be expressed as
-either a tuple of integers or tuple-like
-<A HREF="#OID-IMPL">Object Identifier</A> class instance.
-</P>
-
-<P>
-The <STRONG>syntax</STRONG> parameter represents Managed Object Instance
-<A HREF="#VAL-IMPL">value type</A>.
-</P>
-</DD>
-</DL>
-
-<P>
-The <STRONG>MibScalar</STRONG> class implements the following methods:
-</P>
-
-<A NAME="MibScalar.getName"></A>
-<DL>
-<DT><STRONG>getName</STRONG>()</DT>
-<DD>
-<P>
-Return the <STRONG>name</STRONG> initializer an
-<A HREF="http://pyasn1.sourceforge.net/#1.1.8">OctetIdentifier</A> object.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibScalar.getSyntax"></A>
-<DL>
-<DT><STRONG>getSyntax</STRONG>()</DT>
-<DD>
-<P>
-Return the <STRONG>syntax</STRONG> initializer which is a
-<A HREF="#VAL-IMPL">PyASN1 object</A> including its
-<A HREF="#TEXTUAL-CONVENTION-AS-A-TYPE">TEXTUAL-CONVENTION</A>
-derivative. The <STRONG>syntax</STRONG> object does not carry any value, it
-denotes an acceptable type specifier and may be used for cloning
-compliant objects for building SNMP messages or pretty printing concrete
-values.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibScalar.getUnits"></A>
-<DL>
-<DT><STRONG>getUnits</STRONG>()</DT>
-<DD>
-<P>
-Return value units in form of a Python string. This is mostly used for
-pretty printing things like "10 seconds", not just "10".
-</P>
-</DD>
-</DL>
-
-<A NAME="MibScalar.getDescription"></A>
-<DL>
-<DT><STRONG>getDescription</STRONG>()</DT>
-<DD>
-<P>
-Return a textual, human-readable description of the Managed Object semantics,
-meaning, uses and restrictions. Since these descriptions may be quite large,
-they are not loaded into memory by default. This setting can be altered
-through a property of <A HREF="#MibBuilder">MibBuilder</A>.
-
-</P>
-</DD>
-</DL>
-
-<A NAME="MibScalarInstance"></A>
-<DL>
-<DT>class <STRONG>MibScalarInstance</STRONG>(
-<STRONG>name</STRONG>, <STRONG>syntax</STRONG>
-)</DT>
-<DD>
-<P>
-A representation of scalar Managed Object Instance or
-<A HREF="#CONCEPTUAL-TABLES">Conceptual Table</A> element
-with <STRONG>name</STRONG> and associated value carried by the
-<STRONG>syntax</STRONG> object. This class is a subclass of
-<A HREF="#MibScalar">MibScalar</A> but, unlike
-<STRONG>MibScalar</STRONG>, it represents existing Managed
-Object holding a value.
-</P>
-
-<P>
-The <STRONG>name</STRONG> of Managed Object Instance is a concatination
-of <STRONG>name</STRONG> of a Managed Object and instance identifier.
-For scalar Managed Objects, instance identifier is always a single
-zero (0,). For <A HREF="#CONCEPTUAL-TABLES">Conceptual Table</A> elements
-instance identifier is a concatination of table indices.
-</P>
-
-<P>
-The <STRONG>name</STRONG> and <STRONG>syntax</STRONG> parameters
-have the same meaning as in <A HREF="#MibScalar">MibScalar</A> class.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibTableColumn"></A>
-<DL>
-<DT>class <STRONG>MibTableColumn</STRONG>(
-<STRONG>name</STRONG>, <STRONG>syntax</STRONG>
-)</DT>
-<DD>
-<P>
-A representation of
-<A HREF="#CONCEPTUAL-TABLES">Conceptual Table</A> Column
-specification with <STRONG>name</STRONG> and associated value
-of type <STRONG>syntax</STRONG>. This class is a subclass of
-<A HREF="#MibScalar">MibScalar</A>.
-</P>
-
-<P>
-The <STRONG>name</STRONG> parameter has the same meaning as in
-<A HREF="#MibScalar">MibScalar</A> class.
-</P>
-
-<P>
-The <STRONG>syntax</STRONG> parameter represents
-<A HREF="#MANAGED-OBJECT-SYNTAX">type</A> of the value associated with
-columnar Managed Object.
-</P>
-
-</DD>
-</DL>
-
-<P>
-The <STRONG>MibTableColumn</STRONG> class implements the following
-methods:
-</P>
-
-<A NAME="MibTableColumn.setProtoInstance"></A>
-<DL>
-<DT><STRONG>setProtoInstance</STRONG>(
-<STRONG>instanceClass</STRONG>
-)</DT>
-<DD>
-<P>
-Configure <STRONG>MibTableColumn</STRONG> object to instantiate
-<STRONG>instanceClass</STRONG> when creating Columnar Objects.
-By default, <A HREF="#MibScalarInstance">MibScalarInstance</A>
-is instantiated.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibTableRow"></A>
-<DL>
-<DT>class <STRONG>MibTableRow</STRONG>(
-<STRONG>name</STRONG>
-)</DT>
-<DD>
-<P>
-A representation of a <A HREF="#CONCEPTUAL-TABLES">Conceptual Table</A>
-Row specification with <STRONG>name</STRONG>.
-This class is a subclass of <A HREF="#MibScalar">MibScalar</A> although
-it can't have any associated value.
-</P>
-
-<P>
-The <STRONG>name</STRONG> parameter has the same meaning as in
-<A HREF="#MibScalar">MibScalar</A> class.
-</P>
-</DD>
-</DL>
-
-<P>
-The <STRONG>MibTableRow</STRONG> class implements the following methods:
-</P>
-
-<A NAME="MibTableRow.getInstIdFromIndices"></A>
-<DL>
-<DT><STRONG>getInstIdFromIndices</STRONG>(
-<STRONG>*indices</STRONG>
-)</DT>
-<DD>
-<P>
-Compute and return <A HREF="#CONCEPTUAL-TABLES">Conceptual Table</A> Column
-instance identifier from <STRONG>*indices</STRONG> using MIB Table
-Index definition.
-</P>
-
-<P>
-Types of <STRONG>*indices</STRONG> must coerce into Table Index syntax.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibTableRow.getIndicesFromInstId"></A>
-<DL>
-<DT><STRONG>getIndicesFromInstId</STRONG>(
-<STRONG>instanceId</STRONG>
-)</DT>
-<DD>
-<P>
-Compute and return a tuple of <A HREF="#CONCEPTUAL-TABLES">Conceptual Table</A>
-Index values from Column instance identifier <STRONG>instanceId</STRONG>
-using MIB Table Index definition.
-</P>
-
-<P>
-The number of types of returned index values depend on MIB Table definition.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibTable"></A>
-<DL>
-<DT>class <STRONG>MibTable</STRONG>(
-<STRONG>name</STRONG>
-)</DT>
-<DD>
-<P>
-Represents
-<A HREF="#CONCEPTUAL-TABLES">Conceptual Table</A> specification
-with <STRONG>name</STRONG>. This class is a subclass of
-<A HREF="#MibScalar">MibScalar</A> although it can't have
-any associated value.
-</P>
-
-<P>
-The <STRONG>name</STRONG> parameter has the same meaning as in
-<A HREF="#MibScalar">MibScalar</A> class.
-</P>
-</DD>
-</DL>
-
-<P>
-The following examples explain how MIB text could be expressed in terms of
-PySNMP SMI data model. First example is on a scalar:
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-myManagedObject = MibScalar((1, 3, 6, 1, 4, 1, 20408, 2, 1),
- OctetString()).setMaxAccess("readonly")
-</PRE>
-</TD></TR></TABLE>
-
-<P>
-Managed Object Instance can be put into a stand-alone PySNMP SMI module or
-be implemented inside Agent application. Managed Object Instance will be
-associated with its parent Managed Object, by the
-<A HREF="#MIB-BUILDER">MIB building part of PySNMP</A>,
-on the basis of their names relation.
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-myManagedObjectInstance = MibScalarInstance(myManagedObject.getName() + (0,),
- myManagedObject.getSyntax().clone('my string'))
-</PRE>
-</TD></TR></TABLE>
-
-<P>
-Let's consider SNMP Conceptual Table created in an "MY-MIB.py" file:
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-myTable = MibTable((1, 3, 6, 1, 4, 1, 20408, 2, 1))
-myTableEntry = MibTableRow(myTable.getName() + (1,)).setIndexNames(
- (0, "MY-MIB", "myTableIndex")
- )
-myTableIndex = MibTableColumn(myTableEntry.getName() + (1,), Integer())
-myTableValue = MibTableColumn(myTableEntry.getName() + (2,), OctetString())
-</PRE>
-</TD></TR></TABLE>
-
-<P>
-Populate Managed Objects table with Managed Objects Instance in the first
-column.
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-myTableValueInstance = MibScalarInstance(myTableValue.getName() + (1,),
- myTableValue.getSyntax().clone('my value'))
-</PRE>
-</TD></TR></TABLE>
-
-<P>
-For more real-life cases, refer to modules in <B>pysnmp.smi.mibs</B>
-sub-package.
-</P>
-
-<A NAME="MIB-BUILDER"></A>
-<H4>
-2.3.2 MIB builder
-</H4>
-
-<P>
-The pythonized MIB modules are then managed by the
-<STRONG>MibBuilder</STRONG> class from <STRONG>pysnmp.smi.builder</STRONG>
-module.
-</P>
-
-<A NAME="MibBuilder"></A>
-<DL>
-<DT>class <STRONG>MibBuilder</STRONG>()</DT>
-<DD>
-<P>
-Create MIB modules loader/evaluator/indexer.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibBuilder.loadModules"></A>
-<DL>
-<DT><STRONG>loadModules</STRONG>(
-<STRONG>*modNames</STRONG>
-)</DT>
-
-<DD>
-<P>
-Locate in search path and evaluate each of <STRONG>*modNames</STRONG>
-through Python <STRONG>execfile</STRONG>() passing a reference to
-<STRONG>MibBuilder</STRONG> class instance to module's global scope.
-Evaluating modules might register their objects at
-<STRONG>MibBuilder</STRONG> through
-<A HREF="#MibBuilder.exportSymbols">exportSymbols</A>() call.
-</P>
-
-<P>
-MIB builder would then create an in-memory index of registered MIB
-objects by MIB names.
-</P>
-
-<P>
-Search path is managed by the <STRONG>getMibPath()</STRONG> and
-<STRONG>setMibPath()</STRONG> methods.
-</P>
-
-<P>
-The <STRONG>loadModules</STRONG> method may be further invoked recursively
-on dependent MIB modules import.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibBuilder.unloadModules"></A>
-<DL>
-<DT><STRONG>unloadModules</STRONG>(
-<STRONG>*modNames</STRONG>
-)</DT>
-
-<DD>
-<P>
-Drop all references to Python objects previously created through
-calling <STRONG>loadModules</STRONG>() method against [here optional]
-<STRONG>*modNames</STRONG>. This method would invoke
-<A HREF="#MibBuilder.unexportSymbols">unexportSymbols</A>()
-against MIB symbols previously registered under each of
-<STRONG>*modNames</STRONG>.
-</P>
-
-<P>
-Missing <STRONG>*modNames</STRONG> implies all currently loaded modules.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibBuilder.importSymbols"></A>
-<DL>
-<DT><STRONG>importSymbols</STRONG>(
-<STRONG>modName</STRONG>,
-<STRONG>*symNames</STRONG>
-)</DT>
-
-<DD>
-<P>
-Return a tuple of <STRONG>Managed Objects</STRONG> looked up by
-their MIB names <STRONG>*symNames</STRONG>.
-<STRONG>Managed Objects</STRONG> returned in tuple are
-position-bound to <STRONG>*symNames</STRONG> parameters.
-</P>
-
-<P>
-If MIB module <STRONG>modName</STRONG> is not yet loaded, the
-<A HREF="#MibBuilder.importSymbols">importSymbols</A>() method
-would be invoked implicitly.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibBuilder.exportSymbols"></A>
-<DL>
-<DT><STRONG>exportSymbols</STRONG>(
-<STRONG>modName</STRONG>,
-<STRONG>*anonymousSyms</STRONG>,
-<STRONG>**namedSyms</STRONG>
-)</DT>
-
-<DD>
-<P>
-Register Managed Objects <STRONG>*anonymousSyms</STRONG> and/or
-<STRONG>**namedSyms</STRONG> at <STRONG>MibBuilder</STRONG> within
-MIB module <STRONG>modName</STRONG> scope.
-</P>
-
-<P>
-Managed Objects defined in MIB are always named. These are exported using
-<STRONG>**namedSyms</STRONG> parameter(s). Managed Objects Instances
-don't have to have MIB names, unless Application wants to access
-Managed Objects Instances by MIB name, so these may be exported through
-<STRONG>*anonymousSyms</STRONG>.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibBuilder.unexportSymbols"></A>
-<DL>
-<DT><STRONG>unexportSymbols</STRONG>(
-<STRONG>modName</STRONG>,
-<STRONG>*symNames</STRONG>
-)</DT>
-
-<DD>
-<P>
-Drop all references to Python objects previously registered
-under <STRONG>*symNames</STRONG> within <STRONG>modName</STRONG>
-through <A HREF="#MibBuilder.exportSymbols">exportSymbols</A>() call.
-</P>
-
-<P>
-Missing <STRONG>*symNames</STRONG> implies all symbols currently
-registered within <STRONG>modName</STRONG> module.
-</P>
-</DD>
-</DL>
-
-<P>
-In the following example MIB builder will be created, MIB modules
-loaded up and Managed Object definition looked up by symbolic name:
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
->>> from pysnmp.smi import builder
->>>
->>> # create MIB builder
-... mibBuilder = builder.MibBuilder().loadModules('SNMPv2-MIB', 'IF-MIB')
->>>
->>> # get Managed Object definition by symbol name
-... mibNode, = mibBuilder.importSymbols('SNMPv2-MIB', 'sysDescr')
->>> print(mibNode.getName())
-(1, 3, 6, 1, 2, 1, 1, 1)
->>> print(repr(mibNode.getSyntax()))
-DisplayString('')
->>>
-</PRE>
-</TD></TR></TABLE>
-</P>
-
-<A NAME="MIB-VIEW-CONTROLLER"></A>
-<H4>
-2.3.3 MIB view controller
-</H4>
-
-<P>
-The following facilities are intended for Manager-side access to MIB
-definitions. The <STRONG>pysnmp.smi.view</STRONG> module contains the
-following items:
-</P>
-
-<A NAME="MibViewController"></A>
-<DL>
-<DT>class <STRONG>MibViewController</STRONG>(<STRONG>mibBuilder</STRONG>)</DT>
-<DD>
-<P>
-The <STRONG>MibViewController</STRONG> class instance tackles
-<A HREF="#DATA-MODEL-MANAGED-OBJECTS">Managed Objects</A>,
-constructed by <A HREF="#MibBuilder">MibBuilder</A>, for their properties
-and provide efficient/ordered access to Managed Objects properties.
-Most important of these are OID names and labels.
-</P>
-<P>
-The <STRONG>mibBuilder</STRONG> argument is an instance of
-<A HREF="#MibBuilder">MibBuilder</A> class.
-</P>
-</DD>
-</DL>
-
-<P>
-The <STRONG>MibViewController</STRONG> class implements the following
-methods:
-</P>
-
-<A NAME="MibViewController.getNodeName"></A>
-<DL>
-<DT><STRONG>getNodeName</STRONG>(<STRONG>name</STRONG>)</DT>
-
-<A NAME="MIB-VIEW-MANAGED-OBJECT-NAME"></A>
-<DD>
-<P>
-The <STRONG>name</STRONG> parameter is
-<A HREF="#MANAGED-OBJECTS">Managed Object</A> name.
-It can be either a tuple representing sub-<A HREF="#OID">OID</A>s
-or <A HREF="#OID-IMPL">Object Identifier</A> class instance. Sub-OIDs
-can be a mix of integers and string labels. For example, the following
-are valid values of <STRONG>name</STRONG>:
-</P>
-<UL>
-<LI>
-(1, 3, 6, 1)
-<LI>
-('iso', 'org', 'dod', 'internet')
-<LI>
-('iso', 2, 'dod', 1)
-<LI>
-pysnmp.proto.rfc1902.ObjectIdentifier("1.3.6.1")
-</UL>
-</P>
-<P>
-The <STRONG>getNodeName</STRONG> method returns a tuple of
-(<STRONG>oid</STRONG>, <STRONG>label</STRONG>, <STRONG>suffix</STRONG>)
-where:
-<UL>
-<LI>The <STRONG>oid</STRONG> and <STRONG>label</STRONG> are tuples of sub-OIDs
-of best (longest) matched Managed Object in integer and label forms
-respectively.
-<LI>The <STRONG>suffix</STRONG> parameter is the unmatched, trailing part of
-original <STRONG>name</STRONG> parameter.
-<P>
-If a Managed Object is looked up with <STRONG>getNodeName</STRONG> method
-and an exact match occured, <STRONG>suffix</STRONG> would be an empty tuple.
-</P>
-<P>
-If <STRONG>suffix</STRONG> is not empty, it indicates either an index part of
-<A HREF="#CONCEPTUAL-TABLES">Conceptual Table</A> instance name
-(which can be further parsed into index values by
-<A HREF="#MibTableRow.getInstIdFromIndices">MibTableRow class methods</A>) or
-a partial Managed Object name match.
-</P>
-<P>In order to distinguish MIB Table element match from a failure, see if
-closest matched Managed Object <STRONG>oid</STRONG> (MIB symbol
-<STRONG>label</STRONG>[-1]) is an instance of
-<A HREF="#MibTableColumn">MibTableColumn</A> class.
-</P>
-<P>
-If even partial match fails, the <STRONG>SmiError</STRONG> exception is
-raised.
-</P>
-</UL>
-</P>
-</UL>
-</P>
-</DD>
-</DL>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
->>> from pysnmp.smi import builder, view
->>>
->>> mibBuilder = builder.MibBuilder().loadModules('SNMPv2-MIB')
->>> mibViewController = view.MibViewController(mibBuilder)
->>>
->>> oid, label, suffix = mibViewController.getNodeName(
- (1,3,6,1,2,'mib-2',1,'sysDescr')
- )
->>> print(oid)
-(1, 3, 6, 1, 2, 1, 1, 1)
->>> print(label)
-('iso', 'org', 'dod', 'internet', 'mgmt', 'mib-2', 'system', 'sysDescr')
->>> print(suffix)
-()
-</PRE>
-</TD></TR></TABLE>
-</P>
-
-<A NAME="MibViewController.getNextNodeName"></A>
-<DL>
-<DT><STRONG>getNextNodeName</STRONG>(
-<STRONG>name</STRONG>, <STRONG>modName</STRONG>=''
-)</DT>
-<DD>
-<P>
-The <STRONG>getNextNodeName</STRONG> method works the same as
-<A HREF="#MibViewController.getNodeName">getNodeName</A> but it deals
-with Managed Object whose name appears to be next to the <STRONG>name</STRONG>
-given on input.
-</P>
-<P>
-The <STRONG>modName</STRONG> parameter is MIB module name as seen by
-<A HREF="#MibBuilder">MibBuilder</A>. Use this parameter to restrict
-by-<STRONG>name</STRONG> to particular MIB module's
-scope.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibViewController.getFirstNodeName"></A>
-<DL>
-<DT><STRONG>getFirstNodeName</STRONG>(<STRONG>modName</STRONG>='')</DT>
-<DD>
-<P>
-The <STRONG>getFirstNodeName</STRONG> method works the same as
-<A HREF="#MibViewController.getNodeName">getNodeName</A> but it returns
-Managed Object whose name appears to be the first among others within
-MIB module <STRONG>modName</STRONG>.
-</P>
-<P>
-If no <STRONG>modName</STRONG> is given, the whole OID namespace is assumed.
-</P>
-</DD>
-</DL>
-
-<A NAME="MibViewController.getNodeLocation"></A>
-<DL>
-<DT><STRONG>getNodeLocation</STRONG>(<STRONG>name</STRONG>)</DT>
-<DD>
-<P>
-The <STRONG>getNodeLocation</STRONG> method returns MIB location of
-Managed Object by OID <STRONG>name</STRONG> as a tuple of
-(<STRONG>modName</STRONG>, <STRONG>mibName</STRONG>, <STRONG>suffix</STRONG>).
-</P>
-<P>
-<P>
-The <STRONG>modName</STRONG> and <STRONG>mibName</STRONG> parameters are
-as used in <A HREF="#MibBuilder">MibBuilder</A> interface. The
-<STRONG>suffix</STRONG> parameter is as described in
-<A HREF="#MIB-VIEW-MANAGED-OBJECT-NAME">getNodeName</A>() method.
-</P>
-</DD>
-</DL>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
->>> from pysnmp.smi import builder, view
->>>
->>> mibBuilder = builder.MibBuilder().loadModules('SNMPv2-MIB')
->>> mibViewController = view.MibViewController(mibBuilder)
->>>
->>> modName, symName, suffix = mibViewController.getNodeLocation(
- (1,3,6,1,2,1,1,1,123)
- )
->>> print(modName)
-SNMPv2-MIB
->>> print(symName)
-sysDescr
->>> print(suffix)
-(123,)
-</PRE>
-</TD></TR></TABLE>
-</P>
-
-<A NAME="IMPLEMENTING-MANAGED-OBJECTS-INSTANCES"></A>
-<H4>
-2.3.4 Implementing Managed Objects Instances
-</H4>
-<P>
-The following chapter explains SNMP Agent-controlled Managed Object
-Instances to real-life objects mapping.
-</P>
-
-<P>
-SNMP defines four types of operations on Managed Objects Instances.
-For scalars, these are:
-<UL>
-<LI>Get Managed Object Instance value (though SNMP GET request)
-<LI>Modify Managed Object Instance value (though SNMP SET request)
-</UL>
-</P>
-<P>
-Conceptual Tables additionaly support:
-</P>
-<P>
-<UL>
-<LI>Table row creation (through SNMP SET against a special-purpose
-<B>RowStatus</B> column instance)
-<LI>Table row removal (similary, through SNMP SET against <B>RowStatus</B>
-column instance)
-</UL>
-</P>
-
-<P>
-PySNMP Managed Objects Instances are implemented by the
-<A HREF="#MibScalarInstance">MibScalarInstance</A> objects
-while a value associated with Managed Object Instance is
-represented by its <B>syntax</B> initialization parameter.
-</P>
-
-<P>
-There are two distinct approaches to Managed Objects Instances
-implementation in PySNMP. The first one is simpler to use
-but it only works for relatively static Managed Objects. The other
-is universal but it is more complex to deal with.
-</P>
-
-<A NAME="ASSOCIATED-VALUE-GATEWAYING"></A>
-<H4>
-2.3.4.1 Associated value gatewaying
-</H4>
-
-<P>
-This method only works for scalars and static tables (meaning no row
-creation and deletion is performed through SNMP). Also, it is not
-safe with this method to modify dependent values though a single
-request as failed modification won't roll back others in the bulk.
-</P>
-
-<P>
-Whenever SNMP Agent receives read or modification request against arbitrary
-Managed Object Instance, it ends up <B>clone</B>()'ing <B>syntax</B>
-parameter of <A HREF="#MibScalarInstance">MibScalarInstance</A> object.
-Read queries (e.g. GET/GETNEXT/GETBULK) trigger <B>clone</B> method
-invocation without passing it new value, while new value will be
-fed to the <B>clone</B> method on modification request.
-</P>
-
-<P>
-This value-based gatewaying method works by listening on the <B>clone</B>()
-method of <B>MibScalarInstance</B> associated value thus fetching current
-or applying new state of some outer system represented by arbitrary Managed
-Object Instance.
-</P>
-
-<P>
-Consider SMI-to-filesystem gateway for example, where a Managed Object
-Instance would represent particular file contents. File contents would
-be solely dependent on SNMP updates.
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-class MyFile(OctetString):
- def clone(self, value=None):
- if value is not None:
- # SNMP SET
- open('/tmp/myfile', 'w').write(value)
-
- # SNMP S/GET*
- return OctetString.clone(self, open('/tmp/myfile', 'r').read())
-
-mibBuilder.exportSymbols(
- 'MYFILE-MIB', MibScalarInstance((1, 3, 6, 1, 4, 1, 20408, 1), MyFile())
-)
-</PRE>
-</TD></TR></TABLE>
-</P>
-
-<P>
-A variation of this through-value SMI gatewaying method would be for a
-third-party system to keep Managed Object Instance value synchronized
-with system's current state. Take file size monitor for instance -- the
-following code would be run periodically to measure most recent file size
-and re-build its SMI projection:
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-myManagedObjectInstance = MibScalarInstance(
- (1, 3, 6, 1, 4, 1, 20408, 1), Integer(os.stat('/var/adm/messages')[6])
-)
-
-mibBuilder.exportSymbols(
- 'FILESIZE-MIB', myManagedObjectInstance=myManagedObjectInstance
-)
-</PRE>
-</TD></TR></TABLE>
-
-<A NAME="TAPPING-ON-MANAGEMENT-INSTRUM"></A>
-<H4>
-2.3.4.2 Tapping on Management Instrumentation API
-</H4>
-
-<P>
-This is a generic SMI Managed Objects Instances to real-life objects
-mapping method. It works for scalars and tables of any origin, though,
-programming with it involves customization of PySNMP SMI base classes
-what adds up to usage complexity.
-</P>
-
-<P>
-A single SNMP request may invoke an operation on multiple Managed
-Objects Instances. In SNMP design, it must either succeed on all
-Managed Objects Instances or be rolled back and reported as a
-failure otherwise.
-</P>
-
-<A NAME="MANAGEMENT-INSTRUMENTATION-API"></A>
-
-<P>
-SNMP engine talks to its Managed Objects through a protocol which is
-comprised from a collection of API methods (further refered to as
-<B>Management Instrumentation API</B>), implemented by
-<A HREF="#DATA-MODEL-MANAGED-OBJECTS">Managed Objects classes</A>
-and a definite sequence of their invocation. Default handlers implemented
-in Managed Objects classes read/modify/create the <STRONG>syntax</STRONG>
-parameter, passed on instantiation, to
-<A HREF="#MibScalarInstance">MibScalarInstance</A> objects for scalars
-and <A HREF="#MibTableColumn">MibTableColumn</A> for tables. The essence
-of this Management Instrumentation Tapping technique is to listen on
-Management Instrumentation API methods for gaining control over particular
-Managed Object at request processing points.
-</P>
-
-<P>
-Formal parameters of Management Instrumentation API methods don't make
-much sense to custom implementation, so they are partially documented here and,
-in most cases, should be blindly <B>passed down</B> as-is to the overloaded
-method to not to interfere with behind-the-scene SMI workings.
-</P>
-
-<P>
-Value read methods implemented by
-<A HREF="#DATA-MODEL-MANAGED-OBJECTS">Managed Objects</A> and
-invoked by SNMP engine in response to SNMP GET/GETNEXT/GETBULK requests
-are:
-</P>
-
-<P>
-<A NAME="readTest"></A>
-<DL>
-<DT><STRONG>readTest</STRONG>(
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>readTest</STRONG> method is invoked by SNMP engine prior to
-performing actual Managed Object Instance value read to give
-implementation a chance to ensure that subsequent value read is likely
-to succeed.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-<A NAME="readGet"></A>
-<DL>
-<DT><STRONG>readGet</STRONG>(
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>readGet</STRONG> method is invoked by SNMP engine to fetch
-Managed Object Instance's value. This method must return a tuple
-of (<STRONG>name</STRONG>, <STRONG>value</STRONG>) which is
-returned by overloaded method invocation. Custom implementation
-may replace the <STRONG>value</STRONG> part by its own version taken
-from third-party sources.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-<A NAME="readTestNext"></A>
-<DL>
-<DT><STRONG>readTestNext</STRONG>(
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>readTestNext</STRONG> method is invoked by SNMP engine prior
-to performing actual Managed Object Instance value read to give
-implementation a chance to ensure that subsequent value read is likely
-to succeed.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-<A NAME="readGetNext"></A>
-<DL>
-<DT><STRONG>readGetNext</STRONG>(
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>readGetNext</STRONG> method is invoked by SNMP engine
-to fetch Managed Object Instance's value. This method must return a tuple
-of (<STRONG>name</STRONG>, <STRONG>value</STRONG>) which is returned by
-overloaded method invocation. Custom implementation may replace the
-<STRONG>value</STRONG> part by its own version taken from third-party
-sources.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-The following is a re-implementation of file size monitor:
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-class FileWatcherInstance(MibScalarInstance):
- def readTest(self, name, val, idx, (acFun, acCtx)):
- MibScalarInstance.readTest(self, name, val, idx, (acFun, acCtx))
- try:
- os.stat('/var/adm/messages')
- except StandardError, why:
- raise ResourceUnavailableError(idx=idx, name=name)
-
- def readGet(self, name, val, idx, (acFun, acCtx)):
- name, val = MibScalarInstance.readGet(self, name, val, idx, (acFun, acCtx))
- try:
- return name, val.clone(os.stat('/var/adm/messages')[6])
- except StandardError, why:
- raise ResourceUnavailableError(idx=idx, name=name)
-
-mibBuilder.exportSymbols(
- 'FILESIZE-MIB', FileWatcherInstance((1,3,6,1,4,1,20408,1), Integer())
-)
-</PRE>
-</TD></TR></TABLE>
-
-<P>
-Value modification methods implemented by
-<A HREF="#DATA-MODEL-MANAGED-OBJECTS">Managed Objects</A> and
-invoked by SNMP engine in response to SNMP SET request:
-</P>
-
-<P>
-<A NAME="writeTest"></A>
-<DL>
-<DT><STRONG>writeTest</STRONG>(
-<STRONG>name</STRONG>,
-<STRONG>value</STRONG>,
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>writeTest</STRONG> method is invoked by SNMP engine prior to
-performing actual Managed Object Instance value modification to give
-implementation a chance to ensure that subsequent value modification
-is likely to succeed.
-</P>
-<P>
-Upon successful completion, this method brings Managed Object Instance into
-a state of pending modification which ends through either calling
-<A HREF="#writeCleanup">writeCleanup</A>() on success or
-<A HREF="#writeUndo">writeUndo</A>() on failure.
-</DD>
-</DL>
-</P>
-
-<P>
-<A NAME="writeCommit"></A>
-<DL>
-<DT><STRONG>writeCommit</STRONG>(
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>writeCommit</STRONG> method is invoked by SNMP engine by way of
-request processing in attempt to apply pending <STRONG>value</STRONG>,
-previously passed to Managed Object Instance through
-<A HREF="#writeTest">writeTest</A> method. Custom implementation may
-attempt to apply pending <STRONG>value</STRONG> to a third-party system.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-<A NAME="writeCleanup"></A>
-<DL>
-<DT><STRONG>writeCleanup</STRONG>(
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>writeCleanup</STRONG> method is invoked by SNMP engine by way of
-request processing to bring Managed Object Instance out of
-pending value modification state. Custom implementation may attempt to
-bring a third-party system out of value modification state.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-<A NAME="writeUndo"></A>
-<DL>
-<DT><STRONG>writeUndo</STRONG>(
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>writeUndo</STRONG> method is invoked by SNMP engine by way of
-request processing to drop the <STRONG>value</STRONG> applied
-to Managed Object Instance by the previously called
-<A HREF="#writeCommit">writeCommit</A>() method and re-assign previous value.
-This method also brings Managed Object Instance out of pending value
-modification state. Custom implementation may attempt to bring a
-third-party system out of value modification state.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-The following is a re-implementation of SMI-to-filesystem binding for
-file modification:
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-class MyFileInstance(MibScalarInstance):
- def writeTest(self, name, val, idx, (acFun, acCtx)):
- MibScalarInstance.writeTest(self, name, val, idx, (acFun, acCtx))
- try:
- open('/tmp/myfile.new', 'w').write(val)
- except StandardError, why:
- raise ResourceUnavailableError(idx=idx, name=name)
-
- def writeCommit(self, name, val, idx, (acFun, acCtx)):
- MibScalarInstance.writeCommit(self, name, val, idx, (acFun, acCtx))
- try:
- os.rename('/tmp/myfile', '/tmp/myfile.old')
- os.rename('/tmp/myfile.new', /tmp/myfile')
- except StandardError, why:
- raise ResourceUnavailableError(idx=idx, name=name)
-
- def writeCleanup(self, name, val, idx, (acFun, acCtx)):
- MibScalarInstance.writeCleanup(self, name, val, idx, (acFun, acCtx))
- try:
- os.unlink('/tmp/myfile.old')
- except StandardError, why:
- raise ResourceUnavailableError(idx=idx, name=name)
-
- def writeUndo(self, name, val, idx, (acFun, acCtx)):
- MibScalarInstance.writeUndo(self, name, val, idx, (acFun, acCtx))
- try:
- os.rename('/tmp/myfile.old', '/tmp/myfile')
- except StandardError, why:
- raise ResourceUnavailableError(idx=idx, name=name)
-
-mibBuilder.exportSymbols(
- 'MYFILE-MIB', MyFileInstance((1,3,6,1,4,1,20408,1), OctetString())
-)
-</PRE>
-</TD></TR></TABLE>
-
-<P>
-Table row creation methods implemented by
-<A HREF="#DATA-MODEL-MANAGED-OBJECTS">Managed Objects</A> and
-invoked by SNMP engine in response to SNMP SET request against
-a non-existent or <B>SNMPv2-TC::RowStatus</B> type Table Column
-Instance (table cell) object:
-</P>
-
-<P>
-<A NAME="createTest"></A>
-<DL>
-<DT><STRONG>createTest</STRONG>(
-<STRONG>name</STRONG>,
-<STRONG>value</STRONG>,
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>createTest</STRONG> method is invoked by SNMP engine as a
-first step of Columnar Instance (e.g. Managed Object Instance) creation
-to make sure the column instance could be created and optionally supplied
-value is good. Custom implementation may attempt to create a new object
-at a third-party system.
-</P>
-<P>
-The <STRONG>name</STRONG> and <STRONG>value</STRONG> parameters hold
-OID/value pair as arrived in request.
-</P>
-<P>
-Upon successful completion, this method brings Managed Object Instance into
-a state of pending creation which ends through either calling
-<A HREF="#createCleanup">createCleanup</A>() on success or
-<A HREF="#createUndo">createUndo</A>() on failure.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-<A NAME="createCommit"></A>
-<DL>
-<DT><STRONG>createCommit</STRONG>(
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>createCommit</STRONG> method is invoked by SNMP engine by way
-of Columnar Object creation to indicate that newly created Columnar Object
-has been brough on-line and in attempt to apply [optional] pending
-<STRONG>value</STRONG>, as passed through
-<A HREF="#createTest">createTest</A>() method. Custom implementation may
-bring previously created object on-line at a third-party system.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-<A NAME="createCleanup"></A>
-<DL>
-<DT><STRONG>createCleanup</STRONG>(
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>createCleanup</STRONG> method is invoked by SNMP engine by way
-of Columnar Instance creation to indicate a success. Custom implementation
-may pass this information to a third-party system.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-<A NAME="createUndo"></A>
-<DL>
-<DT><STRONG>createUndo</STRONG>(
-*<STRONG>args</STRONG>
-)</DT>
-<DD>
-<P>
-The <STRONG>createUndo</STRONG> method is invoked by SNMP engine by way
-of Columnar Instance creation to indicate a failure. Custom implementation
-may destroy previously created object at a third-party system.
-</P>
-</DD>
-</DL>
-</P>
-
-<P>
-The following is a SMI-to-filesystem binding for file creation:
-</P>
-
-<TABLE BGCOLOR="lightgray" BORDER=0 WIDTH=90% ALIGN=CENTER><TR><TD>
-<PRE>
-class MyFileInstance(MibScalarInstance):
- def createTest(self, name, val, idx, (acFun, acCtx)):
- MibScalarInstance.createTest(self, name, val, idx, (acFun, acCtx))
- # Build path to file to create from column index
- myFileEntry, = mibBuilder.importSymbols('MYFILE-MIB', 'myFileEntry')
- indices = myFileEntry.getIndicesFromInstId(name[myFileEntry.getName()+1:])
- self.__myFile = apply(os.path.join, indices)
-
- try:
- open('%s.new' % self.__myFile, 'w')
- except StandardError, why:
- raise ResourceUnavailableError(idx=idx, name=name)
-
- def createCommit(self, name, val, idx, (acFun, acCtx)):
- MibScalarInstance.createCommit(self, name, val, idx, (acFun, acCtx))
- try:
- os.rename(self.__myFile, '%s.old' % self.__myFile)
- os.rename('%s.new' % self.__myFile, self.__myFile)
- except StandardError, why:
- raise ResourceUnavailableError(idx=idx, name=name)
-
- def createCleanup(self, name, val, idx, (acFun, acCtx)):
- MibScalarInstance.createCleanup(self, name, val, idx, (acFun, acCtx))
- try:
- os.unlink('%s.old' % self.__myFile)
- except StandardError, why:
- raise ResourceUnavailableError(idx=idx, name=name)
-
- def createUndo(self, name, val, idx, (acFun, acCtx)):
- MibScalarInstance.createUndo(self, name, val, idx, (acFun, acCtx))
- try:
- os.rename('%s.old' % self.__myFile, self.__myFile)
- except StandardError, why:
- raise ResourceUnavailableError(idx=idx, name=name)
-
-# Register custom Managed Object Instance at Column
-myFileColumn, = mibBuilder.importSymbols('MYFILE-MIB', 'myFileColumn')
-myFileColumn.setProtoInstance(MyFileInstance)
-</PRE>
-</TD></TR></TABLE>
-
-<P>
-In the above example, it is assumed that there is a MIB module named
-<STRONG>MYFILE-MIB</STRONG> where
-<A HREF="#MibTableColumn">a MIB table column</A> named
-<STRONG>myFileColumn</STRONG> is defined.
-</P>
-
-<HR>
-
-<A NAME="APPENDIXIES"></A>
-<H4>
-Appendixies
-</H4>
-
-<A NAME="ASN1">
-<H4>
-ASN.1 standard
-</H4>
-
-<P>
-SNMP relies on Abstract Syntax Notation One (ASN.1)
-<A HREF="http://www.itu.int/ITU-T/studygroups/com17/languages/index.html">
-ITU-T standard
-</A>. It is actually a family of standards targeting network systems
-interoperability and protocols development automation.
-</P>
-
-<P>
-In theory, ASN.1 technology provides a complete solution for protocol
-development: new protocol could be expressed in terms of
-data structures described in a specialized formal language.
-</P>
-
-<P>
-The ASN.1 notation is designed purely for data description. All data
-structures there are based on a small set of elementary data types,
-such as INTEGER or SEQUENCE OF some other types.
-</P>
-
-<P>
-Whenever protocol designer wants to define a more precise, narrow set of
-valid values for a field, a <STRONG>subtype</STRONG> can be created from a base ASN.1
-type or another subtype by tearing up a <STRONG>constraint</STRONG> on various data
-properties to parent ASN.1 type. For example, a subtype of in INTEGER may
-allow only arbitrary values of an integer.
-</P>
-
-<P>
-Another way to create a <STRONG>subtype</STRONG> from existing type is to add
-or replace ASN.1 <STRONG>tag</STRONG>, which serves like an ID for a type. In this
-new type has all the same properties of its parent type but is now known
-under a different name.
-</P>
-
-<P>
-Once something gets expressed in ASN.1 notation, it could then be
-automatically translated into a variety of platform-specific implementations.
-They are often take shape of a program written in some common programming
-language like C or Python.
-</P>
-
-<P>
-This is where the major feature of ASN.1 emerges. ASN.1 text could be
-automatically compiled into a high-quality code, that handles all the
-nightmares of platform-specifics, virtually for free. This code would
-handle byte-ordering and value ranges, data structures validations and
-consistency issues.
-</P>
-
-<P>
-But the most useful feature is its ability to represent data in a way
-suitable for transmission over a communication medium. This is called
-<A HREF="#ASN1-ENCODING">encoding</A> in ASN.1, and also known as
-<STRONG>concrete or transfer syntax</STRONG> in computer science.
-</P>
-
-<P>
-SNMP uses these features of ASN.1 for handling Managed Objects and guiding
-protocol operations.
-</P>
-
-<A NAME="OID">
-<H4>
-Object Identifier
-</H4>
-
-<P>
-This technique is a simple, unambiguous, decentralized and extensible
-method of naming anything. It was developed within ASN.1 standard as
-one of its build-in data types.
-</P>
-
-<P>
-An Object Identifier consists of a sequence of integers. Each integer in
-this sequence maps to a node in a tree, so iterating an OID traverses this
-tree from root to leaf, forming a branch. Nodes in OID tree hold a group of
-conceptually related objects. Nodes become more specific from root to
-leaves. Sub-trees, or parts of OID space, often become a courtesy of various
-organizations and individuals.
-</P>
-
-<P>
-OIDs are conventionally written as a dot-separated sequence of integers, from
-left to right as from root to leaves. For example, .1.3.6.1 is an arbitrary
-OID.
-</P>
-
-<P>
-For the purpose of making OIDs human-readable, integers in OIDs
-(AKA sub-OIDs) can be replaced with a textual labels. Consider
-.org.iso.dod.internet as a labeled version of the previous example.
-The numeric and labeled OID representations are invariant and may mix
-within a single OID.
-</P>
-
-<A NAME="ASN1-ENCODING">
-<H4>
-ASN.1 data encoding
-</H4>
-
-<P>
-For several entities to exchange ASN.1 data items some common transmission
-protocol is needed. This protocol would have to be able to represent
-ASN.1 values in a platform-native way. This might require handling hardware
-and/or software specific issues such as varying integer sizes, byte ordering,
-character encoding and so
-on.
-</P>
-
-<P>
-Besides data representation issues, this communication protocol would
-have to break up data being transmitted into small chunks. The reason
-is that most data transmission technologies handle only a few bits in
-a channel at any moment of time. After buffering and packing up few bits
-into larger chunks, most link-level protocols still handle information
-in small grains. Typical measurement is eight bit or octet.
-</P>
-
-<P>
-For all the reasons mentioned above, ASN.1 family of standards
-suggests several methods of two-way ASN.1 data conversion protocols.
-They are sometimes referred to as data <STRONG>encoding</STRONG> or
-<STRONG>serialization</STRONG>.
-</P>
-
-<P>
-SNMP uses somewhat restricted flavor of <STRONG>Basic Encoding Rules</STRONG>
-(BER) for its ASN.1 data serialization purposes. The SNMP-specific
-restrictions make BER encoding deterministic -- with these restrictions
-applied, there is a one-to-one mapping between ASN.1 value and octet-stream
-produced by BER encoder. Determinism in encoding makes it possible for
-trivial SNMP entities to reduce their SNMP engine implementation to opaque
-octet-streams manipulations.
-</P>
-
-<HR>
-
-</TR></TD></TABLE>
-</TR></TD></TABLE>
-
-</BODY>
-</HTML>