summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2015-07-04 16:30:27 +0000
committerelie <elie>2015-07-04 16:30:27 +0000
commitacbac4062483c3db6c09af95760d6c506d9f5105 (patch)
tree69bad8961071784f8c99ddb2b7cf8602f596864e
parent252a909e8dbf5ebfeaabb46c383ebaeba39b1df7 (diff)
downloadpysnmp-git-acbac4062483c3db6c09af95760d6c506d9f5105.tar.gz
* default /usr/share/mibs MIB source added
* compiler.addMibCompiler() now supports ifAvailable and ifNotAdded flags * rfc1902.ObjectIdentity() now always tries to instantiate and attach MIB compiler to snmpEngine (if not done yet), also .addMibCompiler() renamed to .addAsn1MibSource() to signify the fact that MIB compiler is attached behind the scene
-rw-r--r--examples/hlapi/asyncore/sync/manager/cmdgen/custom-asn1-mib-search-path.py3
-rw-r--r--examples/smi/manager/var-binds-mib-resolution.py2
-rw-r--r--examples/v3arch/asyncore/manager/cmdgen/getnext-multiple-oids-and-resolve-with-mib.py3
-rw-r--r--pysnmp/smi/compiler.py32
-rw-r--r--pysnmp/smi/rfc1902.py24
5 files changed, 39 insertions, 25 deletions
diff --git a/examples/hlapi/asyncore/sync/manager/cmdgen/custom-asn1-mib-search-path.py b/examples/hlapi/asyncore/sync/manager/cmdgen/custom-asn1-mib-search-path.py
index 719460ac..9c2db805 100644
--- a/examples/hlapi/asyncore/sync/manager/cmdgen/custom-asn1-mib-search-path.py
+++ b/examples/hlapi/asyncore/sync/manager/cmdgen/custom-asn1-mib-search-path.py
@@ -7,6 +7,7 @@
# * over IPv4/UDP
# * to an Agent at demo.snmplabs.com:161
# * for IF-MIB::ifInOctets.1 MIB object
+# * Pass attached MIB compiler non-default ASN.1 MIB source
#
from pysnmp.entity.rfc3413.oneliner import cmdgen
@@ -15,7 +16,7 @@ cmdGen = cmdgen.CommandGenerator()
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
cmdgen.CommunityData('public'),
cmdgen.UdpTransportTarget(('demo.snmplabs.com', 161)),
- cmdgen.ObjectIdentity('IF-MIB', 'ifInOctets', 1).addMibCompiler('file:///usr/share/snmp', 'http://mibs.snmplabs.com/asn1/@mib@'),
+ cmdgen.ObjectIdentity('IF-MIB', 'ifInOctets', 1).addAsn1MibSource('file:///usr/share/snmp', 'http://mibs.snmplabs.com/asn1/@mib@'),
lookupNames=True, lookupValues=True
)
diff --git a/examples/smi/manager/var-binds-mib-resolution.py b/examples/smi/manager/var-binds-mib-resolution.py
index a2088977..69bb7dc0 100644
--- a/examples/smi/manager/var-binds-mib-resolution.py
+++ b/examples/smi/manager/var-binds-mib-resolution.py
@@ -14,7 +14,7 @@ mibVar = rfc1902.ObjectIdentity('IF-MIB', 'ifInOctets', 1)
# create pysnmp MIBs on demand from ASN.1 sources downloaded from
# a web site.
try:
- mibVar.addMibCompiler('http://mibs.snmplabs.com/asn1/@mib@')
+ mibVar.addAsn1MibSource('http://mibs.snmplabs.com/asn1/@mib@')
except error.SmiError:
print('WARNING: not using MIB compiler (PySMI not installed)')
diff --git a/examples/v3arch/asyncore/manager/cmdgen/getnext-multiple-oids-and-resolve-with-mib.py b/examples/v3arch/asyncore/manager/cmdgen/getnext-multiple-oids-and-resolve-with-mib.py
index a8c5b35b..eab7906f 100644
--- a/examples/v3arch/asyncore/manager/cmdgen/getnext-multiple-oids-and-resolve-with-mib.py
+++ b/examples/v3arch/asyncore/manager/cmdgen/getnext-multiple-oids-and-resolve-with-mib.py
@@ -21,7 +21,10 @@ from pysnmp.smi import compiler, view, rfc1902
snmpEngine = engine.SnmpEngine()
# Attach MIB compiler to SNMP Engine (MIB Builder)
+# This call will fail if PySMI is not present on the system
compiler.addMibCompiler(snmpEngine.getMibBuilder())
+# ... alternatively, this call will not complain on missing PySMI
+#compiler.addMibCompiler(snmpEngine.getMibBuilder(), ifAvailable=True)
# Used for MIB objects resolution
mibViewController = view.MibViewController(snmpEngine.getMibBuilder())
diff --git a/pysnmp/smi/compiler.py b/pysnmp/smi/compiler.py
index 4efb224f..0aa07d07 100644
--- a/pysnmp/smi/compiler.py
+++ b/pysnmp/smi/compiler.py
@@ -5,11 +5,12 @@
import os
import sys
-defaultSources = [ 'file:///usr/share/snmp/mibs' ]
+defaultSources = [ 'file:///usr/share/snmp/mibs',
+ 'file:///usr/share/mibs' ]
if sys.platform[:3] == 'win':
defaultDest = os.path.join(os.path.expanduser("~"),
- 'PySNMP Configuration', 'mibs')
+ 'PySNMP Configuration', 'mibs')
else:
defaultDest = os.path.join(os.path.expanduser("~"), '.pysnmp', 'mibs')
@@ -29,26 +30,23 @@ try:
except ImportError:
from pysnmp.smi import error
- def addMibCompiler(mibBuilder,
- sources=[],
- destination='',
- borrowers=[]):
- raise error.SmiError('MIB compiler not available (pysmi not installed)')
+ def addMibCompiler(mibBuilder, **kwargs):
+ if not kwargs.get('ifAvailable'):
+ raise error.SmiError('MIB compiler not available (pysmi not installed)')
else:
- def addMibCompiler(mibBuilder,
- sources=defaultSources,
- destination=defaultDest,
- borrowers=defaultBorrowers):
+ def addMibCompiler(mibBuilder, **kwargs):
+ if kwargs.get('ifNotAdded') and mibBuilder.getMibCompiler():
+ return
compiler = MibCompiler(
parserFactory(**smiV1Relaxed)(),
PySnmpCodeGen(),
- PyFileWriter(destination)
+ PyFileWriter(kwargs.get('destination') or defaultDest)
)
- compiler.addSources(*getReadersFromUrls(*sources))
+ compiler.addSources(*getReadersFromUrls(*kwargs.get('sources') or defaultSources))
compiler.addSearchers(
StubSearcher(*baseMibs) # XXX
@@ -56,9 +54,11 @@ else:
compiler.addSearchers(
*[ PyPackageSearcher(x.fullPath()) for x in mibBuilder.getMibSources() ]
)
-
compiler.addBorrowers(
- *[ PyFileBorrower(x, genTexts=mibBuilder.loadTexts) for x in getReadersFromUrls(*borrowers, **dict(originalMatching=False, lowcaseMatching=False)) ]
+ *[ PyFileBorrower(x, genTexts=mibBuilder.loadTexts) for x in getReadersFromUrls(*kwargs.get('borrowers') or defaultBorrowers, **dict(originalMatching=False, lowcaseMatching=False)) ]
+ )
+
+ mibBuilder.setMibCompiler(
+ compiler, kwargs.get('destination') or defaultDest
)
- mibBuilder.setMibCompiler(compiler, destination)
diff --git a/pysnmp/smi/rfc1902.py b/pysnmp/smi/rfc1902.py
index 4c23c310..7fb10135 100644
--- a/pysnmp/smi/rfc1902.py
+++ b/pysnmp/smi/rfc1902.py
@@ -2,7 +2,7 @@ import sys
from pysnmp.proto import rfc1902, rfc1905
from pysnmp.proto.api import v2c
from pysnmp.smi.builder import ZipMibSource
-from pysnmp.smi.compiler import addMibCompiler, defaultDest
+from pysnmp.smi.compiler import addMibCompiler
from pysnmp.smi.error import SmiError
from pyasn1.type.base import AbstractSimpleAsn1Item
from pyasn1.error import PyAsn1Error
@@ -25,7 +25,7 @@ class ObjectIdentity:
self.__args = args
self.__kwargs = kwargs
self.__mibSourcesToAdd = self.__modNamesToLoad = None
- self.__asn1SourcesToAdd = None
+ self.__asn1SourcesToAdd = self.__asn1SourcesOptions = None
self.__state = self.stDirty
#
@@ -59,12 +59,15 @@ class ObjectIdentity:
# A gateway to MIBs manipulation routines
#
- def addMibCompiler(self, *asn1Sources, **kwargs):
+ def addAsn1MibSource(self, *asn1Sources, **kwargs):
if self.__asn1SourcesToAdd is None:
self.__asn1SourcesToAdd = asn1Sources
else:
self.__asn1SourcesToAdd += asn1Sources
- self.__mibDir = kwargs.get('destDir', defaultDest)
+ if self.__asn1SourcesOptions:
+ self.__asn1SourcesOptions.update(kwargs)
+ else:
+ self.__asn1SourcesOptions = kwargs
return self
def addMibSource(self, *mibSources):
@@ -92,14 +95,21 @@ class ObjectIdentity:
)
self.__mibSourcesToAdd = None
- if self.__asn1SourcesToAdd is not None:
+ if self.__asn1SourcesToAdd is None:
+ addMibCompiler(mibViewController.mibBuilder,
+ ifAvailable=True, ifNotAdded=True)
+ else:
debug.logger & debug.flagMIB and debug.logger('adding MIB compiler with source paths %s' % ', '.join(self.__asn1SourcesToAdd))
addMibCompiler(
mibViewController.mibBuilder,
sources=self.__asn1SourcesToAdd,
- destination=self.__mibDir
+ searchers=self.__asn1SourcesOptions.get('searchers'),
+ borrowers=self.__asn1SourcesOptions.get('borrowers'),
+ destination=self.__asn1SourcesOptions.get('destination'),
+ ifAvailable=self.__asn1SourcesOptions.get('ifAvailable'),
+ ifNotAdded=self.__asn1SourcesOptions.get('ifNotAdded')
)
- self.__asn1SourcesToAdd = self.__mibDir = None
+ self.__asn1SourcesToAdd = self.__asn1SourcesOptions = None
if self.__modNamesToLoad is not None:
debug.logger & debug.flagMIB and debug.logger('loading MIB modules %s' % ', '.join(self.__modNamesToLoad))