summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Etingof <etingof@gmail.com>2019-07-30 09:11:23 +0200
committerIlya Etingof <etingof@gmail.com>2019-07-30 09:23:28 +0200
commit6b8ee5ec9eb744e872d5d8d4b036ed7dfcfdcfc8 (patch)
tree375d27fabd129cc5cd71500674b6e25dfb269e18
parenta6bfb56061a8495bf140bd45bb68b1cdacbdfe1d (diff)
downloadpysnmp-git-6b8ee5ec9eb744e872d5d8d4b036ed7dfcfdcfc8.tar.gz
Make MIB objects resolution more forgiving
Added optional `ignoreErrors` parameter to `ObjectType.resolveWithMib()` to control that behaviour.
-rw-r--r--CHANGES.txt3
-rw-r--r--pysnmp/smi/rfc1902.py27
2 files changed, 24 insertions, 6 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 7cbdf9fa..76c94d9f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -116,6 +116,9 @@ Revision 4.4.10, released 2019-07-29
- Rebased MIB importing code onto `importlib` because `imp` is long
deprecated
+- MIB objects resolution made more forgiving to errors, added optional
+ `ignoreErrors` parameter to `ObjectType.resolveWithMib()` to control
+ that behaviour.
- Fixed asyncore main loop to respect non-default timer resolution
- Fixed `.setTimerResolution()` behaviour of abstract main loop dispatcher
to update call intervals of the existing periodic dispatcher jobs
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):