From a39f371a33466985dee8b9712c820bfae6037954 Mon Sep 17 00:00:00 2001 From: elie Date: Sat, 4 Jul 2015 16:30:27 +0000 Subject: * 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 --- examples/smi/mib-lookup.py | 2 +- .../getnext-v2c-with-mib-compilation-and-lookup.py | 3 ++ .../get-v2c-with-mib-compilation-and-lookup.py | 3 +- pysnmp/smi/compiler.py | 32 +++++++++++----------- 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)) -- cgit v1.2.1