1,MIB 文件基础语法结构
MIB文件是规范的ANS.1语法,文件中的编写不要使用下划线 ‘_’
mib文件的编写:
- 使用下面结构为一个mib文件进行定义,“<-主要内容->”部分为该mib文件的Data部分。
声明一个mib文件:
MY-MIB DEFINITIONS ::= BEGIN<- 主要内容 ->
END
- 引用其他模块中定义的类型、宏、以及模块,结构如下:
IMPORTS
OBJECT-GROUP, MODULE-COMPLIANCE, NOTIFICATION-GROUP
FROM SNMPv2-CONF
enterprises, Integer32, Unsigned32, OBJECT-TYPE,
MODULE-IDENTITY, NOTIFICATION-TYPE
FROM SNMPv2-SMI
DisplayString
FROM SNMPv2-TC;
-- :表示注释
该结构为:
IMPORTS xxx ,xxxx , xxxx FROM SNMPv2-TC;
使用多个FROM 引用多个其他MIB文件中的内容
IMPORT/EXPORT 紧跟在模块声明后 主要声明导入其他[模块.类型.宏],尤其是标准模块中定义的内容
模块使用时,用FROM关键字说明,并以';'结束
例如:
PhysAddress, TEXTUAL-CONVENTION, RowStatus FROM SNMPv2-TC
IpAddress, Integer32, OBJECT-TYPE, MODULE-IDENTITY FROM SNMPv2-SMI
MacAddress, DisplayString FROM SNMPv2-TC
Myroot ,Mydevice FROM ROUTER-MIB;
- 自定义该mib文件中表示的模块,及其添加一些描述信息
使用MODULE-IDENTITY以描述该模块的详细信息,模块更新时使用REVISION
IP-MIB MODULE-IDENTITY
LAST-UPDATED "20020225142536X" --上一次更新时间
ORGANIZATION "IETF IPv6 MIB Revision" ---组织时间
CONTACT-INFO --联系地址
"editor
EMail: <www.baidu.com>"
REVISION "20000301123650X" --更新时间
DESCRIPTION
"This add aboot of module information"
:: { Myroot 3} --表示IP-MIB模块挂载在那个节点下
(Myroot 为当前的自定义的节点,也可以使用系统提供的节点,如:enterprise 1)
MIB中的对象{1.3.6.1.4.1},即enterprise(企业)
--该自定义的Myroot节点,要么是引用了其他自定义的模块中的节点,
要么就需要挂载在标准模块下
- 为模块分配OID空间,通过上面的操作已经知道模块挂载在那个分支下了,现在为该挂载点分配叶子节点:
OBJECT IDENTIFIER 为管理对象 建立 OID节点 ==》用于规划和建立整个MIB中的分支。
ipphone OBJECT INDENTIFIER ::={ngn 12}
解释:ipphone 是一个子树枝,其定义在ngn标准节点下,12是其在ngn父树下的唯一标识
MySystem OBJECT IDENTIFIER ::{Myroot 1}
MyStatus OBJECT IDENTIFIER ::= { Myroot 2 }
MyTest OBJECT IDENTIFIER ::= { Myroot 4 }
--MySystem,MyStatus,MyTest ==>都是Myroot下的子树枝枝干
- 为叶子节点添加叶子(对象)
//叶子对象的定义
OBJECT-TYPE (该部分定义是MIB文件中的主要内容,既叶子节点)
定义如下:
objectName OBJECT-TYPE
SYNTAX (syntax)
MAX-ACCESS (access)
STATUS (status)
DEFINITIONS (description)
::={ (parent) (number)}
例子:
nmsName OBJECT-TYPE
SYNTAX OCTET STRING (SIZE (0..32)) --字符类型0-32位
MAX-ACCESS read-write --可读写
STATUS current --普通节点
DESCRIPTION
"这个写叶子节点的描述信息"
::= { MySystem 1 } //挂载在那个分支节点下,1 表示第一个叶节点
--解释:该节点为挂载在MySystem 下的第一个叶子
SYNTAX 代表管理站如何解析获得的数据的类型,其类型如下:
INTEGER:整型 有些整型变量[没有范围限制] [定义为特定的数值] [整型变量定义一个特定的范围] ==>int 型
OCTER STRING : 0或多个8bit [每个字节在0~255之间] ==> char arr[] 字符串类型
DisplayString: 0或多个8bit [每个字节必须是ASCII码,< 255个字符]
OBJECT IDENTIFIER
NULL : 变量没有值,有待从代理处获取
IpAddress: 4字节长度的OCTER STRING,以网络序表示的IP地址。每个字节代表IP地址的一个字段。
PhysAddress: OCTER STRING,代表物理地址
Counter:4字节长度的OCTER STRING,以网络序表示的IP地址。每个字节代表IP地址的一个字段。
Gauge:非负的整数,可以从0递增
TimeTicks:时间计数器,必须指定递增的幅度
SEQUENCE:这一数据类型与C程序设计语言中的“structure”类似。
一个SEQUENCE包括0个或多个元素,每一个元素又是另一个ASN.1数据类型。
- 比较复杂的叶子节点定义是table表类型:
使用 SEQUENCE类型 定义序列结构 每一项是标量对象(列对象)
SEQUENCE OF 定义的序列结果,定义为概念行 表格对象和行对象都为not-accessible 索引权限定义为:not-accessible
例子:一个完整的标量节点,该文件可以命名为xxx.txt 或 xxx.mib,用于发布
MyModules DEFINITIONS ::= BEGIN
--add standard mib define
IMPORTS
OBJECT-GROUP, MODULE-COMPLIANCE, NOTIFICATION-GROUP
FROM SNMPv2-CONF
enterprises, Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY, NOTIFICATION-TYPE
FROM SNMPv2-SMI
DisplayString
FROM SNMPv2-TC;
--define one 子树枝
Mybranch MODULE-IDENTITY
LAST-UPDATED "200210091450Z"
ORGANIZATION
""
CONTACT-INFO
""
DESCRIPTION
"This is a test Mib"
::= { enterprises 15926} --1.3.6.1.4.1.15926
--define leaf node
-- This part will include all details about the Test.
Myleafs OBJECT IDENTIFIER ::= { Mybranch 1 }
-- 1.3.6.1.4.1.15926.1
MyName OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..100))
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"string"
::={ Myleafs 1}
END
使用net-snmp提供的检查工具测试如下:
//通过该命令可以识别出mib模块的是否正确
[root@localhost new_My_mib]# snmptranslate -Tp -IR MyModules::Mybranch
Expected CONTACT-INFO (DESCRIPTION): At line 16 in /usr/local/share/snmp/mibs/myName.mib
+--Mybranch(15926)
|
+--Myleafs(1)
|
+-- -RW- String MyName(1)
Textual Convention: DisplayString
Size: 0..100
--提示了一个问题,。。。。
3,Table 表类型的MIB 文件编写
-------------/表格类型 IF-MIB.mib 系统mib提供了table数据的定义供参考
如下:
理解:
在interfaces 2 下有一个iftable的树枝,该树枝下挂载的第一个节点是ifEntry,该ifEntry是一个表结构,其内部成员有(ifIndex、ifDescr.... ifSpecific等)
ifTable OBJECT-TYPE
SYNTAX SEQUENCE OF IfEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A list of interface entries. The number of entries is
given by the value of ifNumber."
::= { interfaces 2 }
ifEntry OBJECT-TYPE
SYNTAX IfEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An entry containing management information applicable to a
particular interface."
INDEX { ifIndex }
::= { ifTable 1 }
IfEntry ::=
SEQUENCE {
ifIndex InterfaceIndex,
ifDescr DisplayString,
ifType IANAifType,
ifMtu Integer32,
ifSpeed Gauge32,
ifPhysAddress PhysAddress,
ifAdminStatus INTEGER,
ifOperStatus INTEGER,
ifLastChange TimeTicks,
ifInOctets Counter32,
ifInUcastPkts Counter32,
ifInNUcastPkts Counter32, -- deprecated
ifInDiscards Counter32,
ifInErrors Counter32,
ifInUnknownProtos Counter32,
ifOutOctets Counter32,
ifOutUcastPkts Counter32,
ifOutNUcastPkts Counter32, -- deprecated
ifOutDiscards Counter32,
ifOutErrors Counter32,
ifOutQLen Gauge32, -- deprecated
ifSpecific OBJECT IDENTIFIER -- deprecated
}
--上面是声明内部成员,下面是为内部成员定义OID节点
ifIndex OBJECT-TYPE
SYNTAX InterfaceIndex
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"A unique value, greater than zero, for each interface. It
is recommended that values are assigned contiguously
starting from 1. The value for each interface sub-layer
must remain constant at least from one re-initialization of
the entity's network management system to the next re-
initialization."
::= { ifEntry 1 }
ifDescr OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..255))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"A textual string containing information about the
interface. This string should include the name of the
manufacturer, the product name and the version of the
interface hardware/software."
::= { ifEntry 2 }
例子一个可用的table表例子:
MyTables-Test DEFINITIONS ::= BEGIN
--add standard mib define
IMPORTS
OBJECT-GROUP, MODULE-COMPLIANCE, NOTIFICATION-GROUP
FROM SNMPv2-CONF
enterprises, Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY, NOTIFICATION-TYPE
FROM SNMPv2-SMI
DisplayString
FROM SNMPv2-TC;
--define one 子树枝
--内部的ORGANIZATION.etc最好都不要少
MyTablesBranch MODULE-IDENTITY
LAST-UPDATED "200210091450Z"
ORGANIZATION
"AAAA"
CONTACT-INFO
""
DESCRIPTION
"This is a test Mib"
::= { enterprises 15927} --1.3.6.1.4.1.15927
--define leaf node
-- This part will include all details about the Test.
MyTableleafs OBJECT IDENTIFIER ::= { MyTablesBranch 1 }
TestTable OBJECT-TYPE
SYNTAX SEQUENCE OF TestTableEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"myTables tables "
::= {MyTableleafs 1}
TestTableEntry OBJECT-TYPE
SYNTAX TestTableEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
""
INDEX {ifIndex}
::= {TestTable 1}
--目前只添加了三个节点,可继续增加
TestTableEntry ::=
SEQUENCE {
ifIndex INTEGER(0..24),
myName OCTET STRING(SIZE(0..32)),
myAge INTEGER
}
ifIndex OBJECT-TYPE
SYNTAX INTEGER(0..24)
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"标识访问的是表中的第几行数据"
::= {TestTableEntry 1}
myName OBJECT-TYPE
SYNTAX OCTET STRING(SIZE(0..32))
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"Name"
::= {TestTableEntry 2}
myAge OBJECT-TYPE
SYNTAX INTEGER
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"Age"
::= {TestTableEntry 3}
END
工具测试如下:
//--------------------mib table
使用snmptranslate 注意该命令搜索mib库的默认路径 MIB search path: /root/.snmp/mibs:/usr/local/share/snmp/mibs
[root@localhost new_My_mib]# snmptranslate -Tp -IR MyTables-Test::MyTableleafs
+--MyTableleafs(1)
|
+--TestTable(1)
|
+--TestTableEntry(1)
| Index: ifIndex
|
+-- -RW- INTEGER ifIndex(1)
| Range: 0..24
+-- -RW- String myName(2)
| Size: 0..32
+-- -RW- INTEGER myAge(3)
使用管理站测试发布:使用的管理者软件为MG-SOFT MIB Browser
总结:
MG-SOFT MIB Browser 管理站提供了很多的mib库,可以参考进行编写和测试,也可以使用net-snmp开源软件,其提供了snmpd进程,用于代理端。