diff options
-rw-r--r-- | examples/smi/mib-lookup.py | 2 | ||||
-rw-r--r-- | examples/v3arch/manager/cmdgen/getnext-v2c-with-mib-compilation-and-lookup.py | 3 | ||||
-rw-r--r-- | examples/v3arch/oneliner/manager/cmdgen/get-v2c-with-mib-compilation-and-lookup.py | 3 | ||||
-rw-r--r-- | pysnmp/smi/compiler.py | 32 | ||||
-rw-r--r-- | pysnmp/smi/rfc1902.py | 24 |
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)) |