一起学习PySNMP——理解什么是MIB

来源:互联网 发布:继电器仿真软件 编辑:程序博客网 时间:2024/06/06 09:46
  • 什么是MIB?什么是SMI

MIB全称Management Information Base。

SMI全称Structure of Management Information。

简单的解释一下:

SMI是定义ManagementInformation(管理信息)的一种结构定义,不同的设备信息都有不同的结构定义,而MIB就是将这些不同的管理信息组织起来的一种结构,通俗的说这种结构式一种树形结构,是一层一层下来的。

下图就是一个简单的MIB结构定义

MIB_Tree_2

上面黄色部分就是代表了CISCO公司的MIB库访问路径,总结出来就是:

iso(1).org(3).dod(6).internet(1).private(4).enterprise(1).cisco(9)

为了简单访问,我们一般使用OID(OBJECT IDENTIFIER)来标示访问,如下:

1.3.6.1.4.1.9

大概明白了什么是MIB了吧,那现在再来看看SMI。

         sysName OBJECT-TYPE
              SYNTAX DisplayString (SIZE (0..255)) 
              ACCESS read-write
              STATUS mandatory
              DESCRIPTION
                     "An administratively-assigned name for this managed node. Byconvention, this is the node's
                     fully-qualified domain name."
              ::= { system 5 }

上面的定义就是一个SMI的一个例子,上面说了些什么呢?我们从下往上来看。

::= { system 5 }

它的上一个节点叫做system,是system下面编号为5的子节点。


DESCRIPTION
        "An administratively-assigned name for this managed node. Byconvention, this is the node's
         fully-qualified domain name."

这个是对这个基点的描述,类似于注释信息。

 

STATUS mandatory

此节点在Agent侧实现,是有效的。

 

ACCESS read-write

远端能够读并且写这个节点的值。

 

SYNTAX DisplayString (SIZE (0..255))

这个节点是一个可显示的字符串组成的,大小为0-255。

 

sysName OBJECT-TYPE

此节点的名字叫做sysName。

 

听了上面的解释应该看懂了吧。下面我们来看一下上面那些概念在PySNMP中是怎么样来表示的。

 

 

  • PySNMP中的MIB和SMI

先看看MIB的节点的一个定义:

class MibNode:    label = ''    def __init__(self, name):        self.name = name            def __repr__(self):        return '%s(%s)' % (self.__class__.__name__, self.name)    def getName(self): return self.name        def getLabel(self): return self.label    def setLabel(self, label):        self.label = label        return self    def clone(self, name=None):        myClone = self.__class__(self.name)        if name is not None:            myClone.name = name        if self.label is not None:            myClone.label = self.label        return myClone

MibNode定义了MIB树的节点的基础定义,name就是一个tuple,例如:(1, 3, 6, 1, 4, 1,20408)。它代表了这个MIB节点的访问路径。

 

再看一下ObjectType的定义:

class ObjectType(MibNode):    maxAccess = None    def __init__(self, name, syntax=None):        MibNode.__init__(self, name)        self.syntax = syntax    # XXX    def __cmp__(self, other): return cmp(self.syntax, other)        def __repr__(self):        return '%s(%s, %s)' % (            self.__class__.__name__, self.name, self.syntax            )        def getSyntax(self):        return self.syntax    def getUnits(self):        return getattr(self, 'units', '')    def setUnits(self, v):        self.units = v        return self        def getMaxAccess(self):        return getattr(self, 'maxAccess', 'not-accessible')    def setMaxAccess(self, v):        self.maxAccess = v        return self    def getStatus(self):        return getattr(self, 'status', 'current')    def setStatus(self, v):        self.status = v        return self    def getDescription(self):        return getattr(self, 'description', '')    def setDescription(self, v):        self.description = v        return self        def getReference(self):        return getattr(self, 'reference', '')    def setReference(self, v):        self.reference = v        return self    def asn1Print(self):        return '\            OBJECT-TYPE\n\            SYNTAX %s\n\            UNITS \"%s\"\n\            MAX-ACCESS %s\n\            STATUS %s\n\            DESCRIPTION \"%s\"\n\            REFERENCE \"%s\"\            ' % (self.getSyntax().__class__.__name__,            self.getUnits(),            self.getMaxAccess(),            self.getStatus(),            self.getDescription(),            self.getReference())
其实仔细的分析上面这个类,就是实现了MIB定义里面的OBJECT-TYPE、SYNTAX、MAX-ACCESS、
STATUS、DESCRIPTION关键字,有几个关键字上面有讲过了。
大家应该有点明白了PySNMP实现的一些道理了吧,如果你需要在深入的琢磨PySNMP对于MIB的表达,
请查看C:\Python26\Lib\site-packages\pysnmp\v4\smi\mibs\SNMPv2-SMI.py
(如果Python装的不一样,请自己更换一下路径)
 
 
上面讲了一些基本的MIB定义,再来看看上面的sysName在PySNMP是怎么定义的吧,如下:
sysName = MibScalar((1, 3, 6, 1, 2, 1, 1, 5), \DisplayString().subtype(subtypeSpec=constraint.ValueSizeConstraint(0, \255))).setMaxAccess("readwrite")if mibBuilder.loadTexts: sysName.setDescription( \"An administratively-assigned name for this managed\nnode. \ By convention, this is the node's fully-qualified\ndomain name. \  If the name is unknown, the value is\nthe zero-length string.")

sysName是MibScalar的实例(MibScalar在SNMPv2-SMI.py中有,大家可以自己看看定义)

OID为(1, 3, 6, 1, 2, 1, 1, 5),

节点的数据类型为可显示字符串DisplayString(),数据类型的约束为0-255个字符subtype(subtypeSpec=constraint.ValueSizeConstraint(0,255))),

访问的权限为可写可读setMaxAccess("readwrite")

节点的描述信息为setDescription("An administratively-assigned name for thismanaged\nnode. By convention, this is the node'sfully-qualified\ndomain name. If the name is unknown, the valueis\nthe zero-length string.")

 

上面的描述够简单了吧,上面的描述是在

C:\Python26\Lib\site-packages\pysnmp\v4\smi\mibs\SNMPv2-MIB.py

文件的第26行,有兴趣可以仔细看一下。

 

再给大家列一下资料,要向成为专家还得从下面这些文档看起。

1、Structure and Identification of Management Information forTCP/IP-basedinternets    

http://www.ietf.org/rfc/rfc1065.txt

这篇文档定义了SMI的基本语法,就是我们前面提到的DESCRIPTION、STATUS、ACCESS等。

2、Management Information Base for Network Management ofTCP/IP-basedinternets   

http://www.ietf.org/rfc/rfc1066.txt

这篇文档定义了机遇TCP、IP网络的基本MIB信息定义

3、Management Information Base for Network Management ofTCP/IP-based internets: MIB-II 

http://www.ietf.org/rfc/rfc1213.txt

这篇文档是对MIB的扩充,也就是通常所说的MIB 2。

0 0
原创粉丝点击