From 83b11f1238466c16c3ee564a82e7d4e68fb86f31 Mon Sep 17 00:00:00 2001 From: elie Date: Sat, 20 Jun 2015 12:14:48 +0000 Subject: - 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. --- CHANGES | 3 +++ pysnmp/smi/rfc1902.py | 8 ++++++-- pysnmp/smi/view.py | 37 ++++++++++++++++++++++++++++++------- 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: -- cgit v1.2.1