- 什么是MIB?什么是SMI
MIB全称Management Information Base。
SMI全称Structure of Management Information。
简单的解释一下:
SMI是定义Management Information(管理信息)的一种结构定义,不同的设备信息都有不同的结构定义,而MIB就是将这些不同的管理信息组织起来的一种结构,通俗的说这种结构式一种树形结构,是一层一层下来的。
下图就是一个简单的MIB结构定义
上面黄色部分就是代表了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。