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:11:23 +0200
commit9dd4bcc9983b39424e1ecbe907b5645ee8d57f9e (patch)
treeb9ef7443889b7054de0155535b8d5377b50b4b93
parent5cefaccd91dd59956e6b2f291d0b9bee749e8286 (diff)
downloadpysnmp-git-9dd4bcc9983b39424e1ecbe907b5645ee8d57f9e.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.py23
2 files changed, 21 insertions, 5 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index e3233ad8..3fc262cd 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -16,6 +16,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 c8990025..9c0a50bb 100644
--- a/pysnmp/smi/rfc1902.py
+++ b/pysnmp/smi/rfc1902.py
@@ -805,7 +805,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
@@ -813,6 +813,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`
@@ -851,7 +857,8 @@ 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],))
self.__state |= self.stClean
return self
@@ -866,9 +873,15 @@ class ObjectType(object):
try:
self.__args[1] = self.__args[0].getMibNode().getSyntax().clone(self.__args[1])
except PyAsn1Error:
- raise SmiError('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]))
+ 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]))
+
+ if (not ignoreErrors or
+ not isinstance(self.__args[1], AbstractSimpleAsn1Item)):
+ raise SmiError(err)
if rfc1902.ObjectIdentifier().isSuperTypeOf(self.__args[1], matchConstraints=False):
self.__args[1] = ObjectIdentity(self.__args[1]).resolveWithMib(mibViewController)