mibview.py :  » Network » Python-SNMP » pysnmp-apps-0.2.9a » pysnmp_apps » cli » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Network » Python SNMP 
Python SNMP » pysnmp apps 0.2.9a » pysnmp_apps » cli » mibview.py
# C/L interface to MIB variables. Mimics Net-SNMP CLI.
import os, string
from pyasn1.type import univ
from pysnmp_apps.cli import base
from pysnmp.proto import rfc1902
from pysnmp import error

# Usage

def 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\
"

# Scanner

class 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'))

# Parser

class 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
        '''

# Generator

class __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):
    if not ctx.has_key('mibViewProxy'):
        ctx['mibViewProxy'] = MibViewProxy(ctx['mibViewController'])
    return __MibViewGenerator().preorder((snmpEngine, ctx), ast)

class UnknownSyntax:
    def prettyOut(self, val):
        return str(val)
unknownSyntax = UnknownSyntax()
    
#  Proxy MIB view

class 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
        if val is None:
            return out
        mibNode, = mibViewController.mibBuilder.importSymbols(
            modName, nodeDesc
            )
        if hasattr(mibNode, 'syntax'):
            syntax = mibNode.syntax
        else:
            syntax = val
        if syntax is None: # lame Agent may return a non-instance OID
            syntax = unknownSyntax
        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
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.