summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2015-06-20 12:14:48 +0000
committerelie <elie>2015-06-20 12:14:48 +0000
commit83b11f1238466c16c3ee564a82e7d4e68fb86f31 (patch)
tree9e6fe401bdebee7fbed21869fe039b2b1f761775
parent54bcd510d0a7e3e913e5962598fc2331dec545f8 (diff)
downloadpysnmp-83b11f1238466c16c3ee564a82e7d4e68fb86f31.tar.gz
- a few additional MIB tree management methods added to MibViewController
to better address ordered nature of MIB tree nodes (namely, getFirst*, getLast* family of methods) - rfc1902.ObjectIdentity() now accepts 'last' keyword parameter to position on last (otherwise, first) object in given MIB module.
-rw-r--r--CHANGES3
-rw-r--r--pysnmp/smi/rfc1902.py8
-rw-r--r--pysnmp/smi/view.py37
3 files changed, 39 insertions, 9 deletions
diff --git a/CHANGES b/CHANGES
index a14a4cb..0fcf308 100644
--- a/CHANGES
+++ b/CHANGES
@@ -101,6 +101,9 @@ Revision 4.2.6
than using them instead of its default core MIBs.
- Removed RowStatus default value as it may collide with possible subclass
constraints.
+- A few additional MIB tree management methods added to MibViewController
+ to better address ordered nature of MIB tree nodes (namely, getFirst*,
+ getLast* family of methods).
- Fix to authoritative engine side snmpEngineID discovery procedure:
respond with notInTimeWindows rather then with unsupportedSecurityLevel
at time synchronization phase.
diff --git a/pysnmp/smi/rfc1902.py b/pysnmp/smi/rfc1902.py
index 75fa7b9..8e5f905 100644
--- a/pysnmp/smi/rfc1902.py
+++ b/pysnmp/smi/rfc1902.py
@@ -21,8 +21,9 @@ from pysnmp import debug
class ObjectIdentity:
stDirty, stClean = 1, 2
- def __init__(self, *args):
+ def __init__(self, *args, **kwargs):
self.__args = args
+ self.__kwargs = kwargs
self.__mibSourcesToAdd = self.__modNamesToLoad = None
self.__asn1SourcesToAdd = None
self.__state = self.stDirty
@@ -179,7 +180,10 @@ class ObjectIdentity:
self.__symName = self.__args[1]
else:
mibViewController.mibBuilder.loadModules(self.__modName)
- oid, _, _ = mibViewController.getFirstNodeName(self.__modName)
+ if self.__kwargs.get('last'):
+ oid,_,_ = mibViewController.getLastNodeName(self.__modName)
+ else:
+ oid,_,_ = mibViewController.getFirstNodeName(self.__modName)
_, self.__symName, _ = mibViewController.getNodeLocation(oid)
mibNode, = mibViewController.mibBuilder.importSymbols(
diff --git a/pysnmp/smi/view.py b/pysnmp/smi/view.py
index f7f6118..61ea964 100644
--- a/pysnmp/smi/view.py
+++ b/pysnmp/smi/view.py
@@ -142,13 +142,19 @@ class MibViewController:
# Module management
- def getFirstModuleName(self):
+ def getOrderedModuleName(self, index):
self.indexMib()
modNames = self.__mibSymbolsIdx.keys()
if modNames:
- return modNames[0]
+ return modNames[index]
raise error.SmiError('No modules loaded at %s' % self)
+ def getFirstModuleName(self):
+ return self.getOrderedModuleName(0)
+
+ def getLastModuleName(self):
+ return self.getOrderedModuleName(-1)
+
def getNextModuleName(self, modName):
self.indexMib()
try:
@@ -234,7 +240,7 @@ class MibViewController:
oid + suffix + nodeName[1:], modName
)
- def getFirstNodeName(self, modName=''):
+ def getOrderedNodeName(self, index, modName=''):
self.indexMib()
if modName in self.__mibSymbolsIdx:
mibMod = self.__mibSymbolsIdx[modName]
@@ -245,10 +251,21 @@ class MibViewController:
if not mibMod['oidToLabelIdx']:
raise error.NoSuchObjectError(
str='No variables at MIB module %s at %s' % (modName, self)
- )
- oid, label = mibMod['oidToLabelIdx'].items()[0]
+ )
+ try:
+ oid, label = mibMod['oidToLabelIdx'].items()[index]
+ except KeyError:
+ raise error.NoSuchObjectError(
+ str='No symbol at position %s in MIB module %s at %s' % (index, modName, self)
+ )
return oid, label, ()
+
+ def getFirstNodeName(self, modName=''):
+ return self.getOrderedNodeName(0, modName)
+ def getLastNodeName(self, modName=''):
+ return self.getOrderedNodeName(-1, modName)
+
def getNextNodeName(self, nodeName, modName=''):
oid, label, suffix = self.getNodeName(nodeName, modName)
try:
@@ -291,7 +308,7 @@ class MibViewController:
)
return m, typeName
- def getFirstTypeName(self, modName=''):
+ def getOrderedTypeName(self, index, modName=''):
self.indexMib()
if modName in self.__mibSymbolsIdx:
mibMod = self.__mibSymbolsIdx[modName]
@@ -303,9 +320,15 @@ class MibViewController:
raise error.NoSuchObjectError(
str='No types at MIB module %s at %s' % (modName, self)
)
- t = mibMod['typeToModIdx'].keys()[0]
+ t = mibMod['typeToModIdx'].keys()[index]
return mibMod['typeToModIdx'][t], t
+ def getFirstTypeName(self, modName=''):
+ return self.getOrderedTypeName(0, modName)
+
+ def getLastTypeName(self, modName=''):
+ return self.getOrderedTypeName(-1, modName)
+
def getNextType(self, typeName, modName=''):
m, t = self.getTypeName(typeName, modName)
try: