diff options
author | Ilya Etingof <etingof@gmail.com> | 2019-07-30 09:11:23 +0200 |
---|---|---|
committer | Ilya Etingof <etingof@gmail.com> | 2019-07-30 09:23:28 +0200 |
commit | 6b8ee5ec9eb744e872d5d8d4b036ed7dfcfdcfc8 (patch) | |
tree | 375d27fabd129cc5cd71500674b6e25dfb269e18 /pysnmp | |
parent | a6bfb56061a8495bf140bd45bb68b1cdacbdfe1d (diff) | |
download | pysnmp-git-6b8ee5ec9eb744e872d5d8d4b036ed7dfcfdcfc8.tar.gz |
Make MIB objects resolution more forgiving
Added optional `ignoreErrors` parameter to `ObjectType.resolveWithMib()`
to control that behaviour.
Diffstat (limited to 'pysnmp')
-rw-r--r-- | pysnmp/smi/rfc1902.py | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/pysnmp/smi/rfc1902.py b/pysnmp/smi/rfc1902.py index 40249a1e..c96996b9 100644 --- a/pysnmp/smi/rfc1902.py +++ b/pysnmp/smi/rfc1902.py @@ -908,7 +908,7 @@ class ObjectType(object): self._args[0].loadMibs(*modNames) return self - def resolveWithMib(self, mibViewController): + def resolveWithMib(self, mibViewController, ignoreErrors=True): """Perform MIB variable ID and associated value conversion. Parameters @@ -916,6 +916,12 @@ class ObjectType(object): mibViewController : :py:class:`~pysnmp.smi.view.MibViewController` class instance representing MIB browsing functionality. + Other Parameters + ---------------- + ignoreErrors: :py:class:`bool` + If `True` (default), ignore MIB object name or value casting + failures if possible. + Returns ------- : :py:class:`~pysnmp.smi.rfc1902.ObjectType` @@ -954,7 +960,9 @@ class ObjectType(object): if not isinstance(self._args[0].getMibNode(), (MibScalar, MibTableColumn)): - if not isinstance(self._args[1], AbstractSimpleAsn1Item): + + if (ignoreErrors and + not isinstance(self._args[1], AbstractSimpleAsn1Item)): raise SmiError('MIB object %r is not OBJECT-TYPE ' '(MIB not loaded?)' % (self._args[0],)) @@ -975,10 +983,17 @@ class ObjectType(object): self._args[1] = syntax.clone(self._args[1]) except PyAsn1Error as exc: - raise SmiError( - 'MIB object %r having type %r failed to cast value ' - '%r: %s' % (self._args[0].prettyPrint(), - syntax.__class__.__name__, self._args[1], exc)) + err = ('MIB object %r having type %r failed to cast value ' + '%r: %s' % (self.__args[0].prettyPrint(), + self.__args[0].getMibNode().getSyntax().__class__.__name__, + self.__args[1], + sys.exc_info()[1])) + + debug.logger & debug.FLAG_MIB and debug.logger(err) + + if (not ignoreErrors or + not isinstance(self.__args[1], AbstractSimpleAsn1Item)): + raise SmiError(err) if rfc1902.ObjectIdentifier().isSuperTypeOf( self._args[1], matchConstraints=False): |