📄 mibview.py
字号:
# C/L interface to MIB variables. Mimics Net-SNMP CLI.import os, stringfrom pyasn1.type import univfrom pysnmp_apps.cli import basefrom pysnmp.proto import rfc1902from pysnmp import error# Usagedef getUsage(): return "\MIB options:\n\ -m MIB[:...] load given list of MIBs (ALL loads everything)\n\ -M DIR[:...] look in given list of directories for MIBs\n\ -O OUTOPTS Toggle various defaults controlling output display:\n\ q: removes the equal sign and type information\n\ Q: removes the type information\n\ f: print full OIDs on output\n\ s: print only last symbolic element of OID\n\ S: print MIB module-id plus last element\n\ u: print OIDs using UCD-style prefix suppression\n\ n: print OIDs numerically\n\ e: print enums numerically\n\ b: do not break OID indexes down\n\ E: include a \" to escape the quotes in indices\n\ X: place square brackets around each index\n\ T: print value in hex\n\ v: print values only (not OID = value)\n\ U: don't print units\n\ t: output timeticks values as raw numbers\n\ -I INOPTS Toggle various defaults controlling input parsing:\n\ h: don't apply DISPLAY-HINTs\n\ u: top-level OIDs must have '.' prefix (UCD-style)\n\"# Scannerclass MibViewScannerMixIn: def t_mibfiles(self, s): r' -m ' self.rv.append(base.ConfigToken('mibfiles')) def t_mibdirs(self, s): r' -M ' self.rv.append(base.ConfigToken('mibdirs')) def t_outputopts(self, s): r' -O ' self.rv.append(base.ConfigToken('outputopts')) def t_inputopts(self, s): r' -I ' self.rv.append(base.ConfigToken('inputopts'))# Parserclass MibViewParserMixIn: def p_mibView(self, args): ''' Option ::= GeneralOption Option ::= OutputOption Option ::= InputOption GeneralOption ::= MibDirList MibDirList ::= mibdirs MibDirs MibDirList ::= mibdirs whitespace MibDirs MibDirs ::= MibDir semicolon MibDirs MibDirs ::= MibDir MibDir ::= string GeneralOption ::= MibFileList MibFileList ::= mibfiles MibFiles MibFileList ::= mibfiles whitespace MibFiles MibFiles ::= MibFile semicolon MibFiles MibFiles ::= MibFile MibFile ::= string OutputOption ::= outputopts string OutputOption ::= outputopts whitespace string InputOption ::= inputopts string InputOption ::= inputopts whitespace string '''# Generatorclass __MibViewGenerator(base.GeneratorTemplate): # Load MIB modules def n_MibFile(self, (snmpEngine, ctx), node): mibBuilder = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder if string.lower(node[0].attr) == 'all': mibBuilder.loadModules() else: mibBuilder.loadModules(node[0].attr) def n_MibDir(self, (snmpEngine, ctx), node): mibBuilder = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder apply(mibBuilder.setMibPath, (node[0].attr,) + mibBuilder.getMibPath()) def n_OutputOption(self, (snmpEngine, ctx), node): mibViewProxy = ctx['mibViewProxy'] if len(node) > 2: opt = node[2].attr else: opt = node[1].attr for c in map(None, opt): if c == 'q': mibViewProxy.buildEqualSign = 0 mibViewProxy.buildTypeInfo = 0 elif c == 'Q': mibViewProxy.buildTypeInfo = 0 elif c == 'f': mibViewProxy.buildModInfo = 0 mibViewProxy.buildObjectDesc = 0 mibViewProxy.buildAbsoluteName = 1 elif c == 's': mibViewProxy.buildModInfo = 0 mibViewProxy.buildObjectDesc = 1 elif c == 'S': mibViewProxy.buildObjectDesc = 1 elif c == 'u': pass elif c == 'n': mibViewProxy.buildObjectDesc = 0 mibViewProxy.buildModInfo = 0 mibViewProxy.buildNumericName = 1 mibViewProxy.buildNumericIndices = 1 mibViewProxy.buildAbsoluteName = 1 elif c == 'e': raise error.PySnmpError('Option not implemented') elif c == 'b': mibViewProxy.buildNumericIndices = 1 elif c == 'E': mibViewProxy.buildEscQuotes = 1 elif c == 'X': mibViewProxy.buildSquareBrackets = 1 elif c == 'T': mibViewProxy.buildHexVals = 1 elif c == 'v': mibViewProxy.buildValueOnly = 1 elif c == 'U': mibViewProxy.buildUnits = 0 elif c == 't': mibViewProxy.buildRawTimeTicks = 1 pass elif c == 'R': mibViewProxy.buildRawVals = 1 else: raise error.PySnmpError( 'Unknown output option %s at %s' % (c, self) ) def n_InputOption(self, (snmpEngine, ctx), node): mibViewProxy = ctx['mibViewProxy'] if len(node) > 2: opt = node[2].attr else: opt = node[1].attr for c in map(None, opt): if c == 'R': pass elif c == 'b': pass elif c == 'u': mibViewProxy.defaultOidPrefix = ( 'iso', 'org', 'dod', 'internet', 'mgmt', 'mib-2' ) elif c == 'r': pass elif c == 'h': pass else: raise error.PySnmpError( 'Unknown input option %s at %s' % (c, self) )def generator((snmpEngine, ctx), ast): ctx['mibViewProxy'] = MibViewProxy(ctx['mibViewController']) return __MibViewGenerator().preorder((snmpEngine, ctx), ast)# Proxy MIB viewclass MibViewProxy: # Defaults defaultOidPrefix = ( 'iso', 'org', 'dod', 'internet', 'mgmt', 'mib-2', 'system' ) defaultMibs = ('SNMPv2-MIB',) defaultMibDirs = () # MIB parsing options # currently N/A # MIB output options buildModInfo = 1 buildObjectDesc = 1 buildNumericName = 0 buildAbsoluteName = 0 buildNumericIndices = 0 buildEqualSign = 1 buildTypeInfo = 1 buildEscQuotes = 0 buildSquareBrackets = 0 buildHexVals = 0 buildRawVals = 0 buildRawTimeTicks = 0 buildGuessedStringVals = 1 buildValueOnly = 0 buildUnits = 1 # MIB input options parseAsRandomAccessMib = 1 parseAsRegExp = 0 parseAsRelativeOid = 1 parseAndCheckIndices = 1 parseAsDisplayHint = 1 def __init__(self, mibViewController): if os.environ.has_key('PYSNMPOIDPREFIX'): self.defaultOidPrefix = os.environ['PYSNMPOIDPREFIX'] if os.environ.has_key('PYSNMPMIBS'): self.defaultMibs = string.split(os.environ['PYSNMPMIBS'], ':') if os.environ.has_key('PYSNMPMIBDIRS'): self.defaultMibDirs = string.split(os.environ['MIBDIRS'], ':') if self.defaultMibDirs: apply(mibViewController.mibBuilder.setMibPath, (self.defaultMibDirs) + \ mibViewController.mibBuilder.getMibPath()) if self.defaultMibs: apply(mibViewController.mibBuilder.loadModules, self.defaultMibs) self.__oidValue = univ.ObjectIdentifier() self.__intValue = univ.Integer() self.__timeValue = rfc1902.TimeTicks() def getPrettyOidVal(self, mibViewController, oid, val): prefix, label, suffix = mibViewController.getNodeName(oid) modName, nodeDesc, _suffix = mibViewController.getNodeLocation(prefix) out = '' # object name if not self.buildValueOnly: if self.buildModInfo: out = '%s::' % modName if self.buildObjectDesc: out = out + nodeDesc else: if self.buildNumericName: name = prefix else: name = label if not self.buildAbsoluteName: name = name[len(self.defaultOidPrefix):] out = out + string.join(map(lambda x: str(x), name), '.') if suffix: if suffix == (0,): out = out + '.0' else: m, n, s = mibViewController.getNodeLocation(prefix[:-1]) rowNode, = mibViewController.mibBuilder.importSymbols( m, n ) if self.buildNumericIndices: out = out+'.'+string.join( map(lambda x: str(x), suffix), '.' ) else: try: for i in rowNode.getIndicesFromInstId(suffix): if self.buildEscQuotes: out = out + '.\\\"%s\\\"' % i.prettyOut(i) elif self.buildSquareBrackets: out = out + '.[%s]' % i.prettyOut(i) else: out = out + '.\"%s\"' % i.prettyOut(i) except AttributeError: out = out + '.' + string.join( map(lambda x: str(x), suffix), '.' ) if self.buildEqualSign: out = out + ' = ' else: out = out + ' ' # Value mibNode, = mibViewController.mibBuilder.importSymbols( modName, nodeDesc ) if hasattr(mibNode, 'syntax'): syntax = mibNode.syntax else: syntax = val if self.buildTypeInfo: out = out + '%s: ' % syntax.__class__.__name__ if self.buildRawVals: out = out + str(val) elif self.buildHexVals: # XXX make it always in hex? if self.__intValue.isSuperTypeOf(val): out = out + repr(int(val)) elif self.__oidValue.isSuperTypeOf(val): out = out + repr(tuple(val)) else: out = out + repr(str(val)) elif self.__timeValue.isSameTypeWith(val): if self.buildRawTimeTicks: out = out + str(int(val)) else: # TimeTicks is not a TC val = int(val) d, m = divmod(val, 8640000) out = out + '%d days ' % d d, m = divmod(m, 360000) out = out + '%d:' % d d, m = divmod(m, 6000) out = out + '%d:' % d d, m = divmod(m, 100) out = out + '%d.%d' % (d, m) elif self.__oidValue.isSuperTypeOf(val): oid, label, suffix = mibViewController.getNodeName(val) out = out + string.join( label+tuple(map(lambda x: str(x), suffix)), '.' ) out = out + syntax.prettyOut(val) if self.buildUnits: if hasattr(mibNode, 'getUnits'): out = out + ' %s' % mibNode.getUnits() return out def setPrettyOidValue(self, (oid, val, t)): return oid, val
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -