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

  • 什么是MIB?什么是SMI

MIB全称Management Information Base。

SMI全称Structure of Management Information。

简单的解释一下:

SMI是定义Management Information(管理信息)的一种结构定义,不同的设备信息都有不同的结构定义,而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. By convention, 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. By convention, 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 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.")

 

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

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

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

 

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

1、Structure and Identification of Management Information for TCP/IP-based internets    

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

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

2、Management Information Base for Network Management of TCP/IP-based internets   

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

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

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

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

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

 

 
 

转载于:https://www.cnblogs.com/qigo4c/archive/2009/10/19/1586125.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值