summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/smi/mib-lookup.py2
-rw-r--r--examples/v3arch/manager/cmdgen/getnext-v2c-with-mib-compilation-and-lookup.py3
-rw-r--r--examples/v3arch/oneliner/manager/cmdgen/get-v2c-with-mib-compilation-and-lookup.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/smi/mib-lookup.py b/examples/smi/mib-lookup.py
index a208897..69bb7dc 100644
--- a/examples/smi/mib-lookup.py
+++ b/examples/smi/mib-lookup.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/manager/cmdgen/getnext-v2c-with-mib-compilation-and-lookup.py b/examples/v3arch/manager/cmdgen/getnext-v2c-with-mib-compilation-and-lookup.py
index a8c5b35..eab7906 100644
--- a/examples/v3arch/manager/cmdgen/getnext-v2c-with-mib-compilation-and-lookup.py
+++ b/examples/v3arch/manager/cmdgen/getnext-v2c-with-mib-compilation-and-lookup.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/examples/v3arch/oneliner/manager/cmdgen/get-v2c-with-mib-compilation-and-lookup.py b/examples/v3arch/oneliner/manager/cmdgen/get-v2c-with-mib-compilation-and-lookup.py
index 719460a..9c2db80 100644
--- a/examples/v3arch/oneliner/manager/cmdgen/get-v2c-with-mib-compilation-and-lookup.py
+++ b/examples/v3arch/oneliner/manager/cmdgen/get-v2c-with-mib-compilation-and-lookup.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/pysnmp/smi/compiler.py b/pysnmp/smi/compiler.py
index 4efb224..0aa07d0 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 4c23c31..7fb1013 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))