4. MIB编译器 | 4. The MIB Compiler
4 MIB编译器
“ MIB编译器
”一章介绍了MIB编译器
,其中包含以下主题:
- 操作
- 引入
- MIB之间的一致性检查
- .HRL文件生成
- Emacs集成
- 偏离标准
注
在导入MIB时,确保导入的MIB以及导入的MIB使用相同版本的SNMP-编译器进行编译。
4.1 操作
在编译MIV 1或SMIv 2之前,必须使用ASN.1符号将MIB写入文本文件。此文本文件必须具有与MIB相同的名称,但必须带有后缀。.mib
这是处理IMPORT
声明。
包含MIB的检测函数名称的关联文件应该有后缀.funcs
。如果编译器没有找到关联文件,它会给出警告消息并使用默认的检测功能。(详情请参阅Default Instrumentation
)。
通过调用snmpc:compile(<mibname>)来启动MIB编译器。 例如:
snmpc:compile("RFC1213-MIB").
输出是一个被<mibname>.bin调用的新文件。
MIB编译器理解SMIv1和SMIv2 MIB。它使用MODULE-IDENTITY语句确定MIB是否写入SMI版本1或2。
4.2 导入MIB
编译器处理该IMPORT
语句。导入编译的文件而不是ASN.1(源)文件很重要。必须重新编译MIB以使更改对导入它的其他MIB可见。
导入的MIB的编译文件必须存在于当前目录或当前路径中的目录中。该路径提供了该{i, Path}
选项,例如:
snmpc:compile("MY-MIB",
[{i, ["friend_mibs/", "../standard_mibs/"]}]).
也可以"include_lib"
使用该il
选项以类似方式从OTP应用程序导入MIB 。例:
snmpc:compile("MY-MIB",
[{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).
找到最新版本的snmp
,myapp
在OTP系统的应用和使用扩展的路径,包括路径。
注意,SMIv2MIB可以导入SMIv1MIB,反之亦然。
以下MIB是Erlang SNMP编译器的内置程序:SNMPv2-SMI、RFC-1215、RFC-1212、SNMPv2-TC、SNMPv2-CONF和RFC1155-SMI。因此,它们不能单独编制。
4.3 MIB一致性检查
编译MIB时,编译器将检测多个托管对象是否使用相同的对象。OBJECT IDENTIFIER
如果是这样的话,它会发出错误消息。但是,编译器无法检测不同MIB之间的OID冲突。这种冲突在加载时会产生错误。为了避免这种情况,可以使用以下函数在MIB之间进行一致性检查:
erl>snmpc:is_consistent(ListOfMibNames).
ListOfMibNames
是编译的MIB的列表,例如["RFC1213-MIB", "MY-MIB"]
.该函数还执行陷阱定义的一致性检查。
4.4 . hrl文件生成
可以.hrl
从编译的MIB文件生成一个包含Erlang常量定义的文件。这个文件可以包含在Erlang源代码中。该文件将包含以下常量:
- 表、表项和变量的对象标识符
- 列号
- 枚举值
- 变量和表列的默认值。
使用以下命令生成一个。来自MIB的HRL文件:
erl>snmpc:mib_to_hrl(MibName).
4.5 EMACS集成
使用Emacs编辑器,如果错误消息由行号描述,则可以使用next-error
(C-X `
)函数指示发生编译错误的位置。
用于M-x compile
从Emacs内部编译MIB,然后输入:
erl -s snmpc compile <MibName> -noshell
一个例子<MibName>是RFC1213-MIB。
4.6从Shell或makefile编译
这些erlc
命令可用于编译SNMP MIB。例:
erlc MY-MIB.mib
所有的标准erlc
标志都被支持,例如
erlc -I mymibs -o mymibs -W MY-MIB.mib
特定于MIB编译器的标志可以使用以下+
语法来指定:
erlc +'{group_check,false}' MY-MIB.mib
4.7偏离标准
在某些方面,ErlangMIB编译器没有完全遵循或实现SMI。以下是不同之处:
- 表必须写在顺序如下:
tableObject
,entryObject
,column1
,...,columnN
(按顺序)。
- 整数值,例如在
SIZE
表达式必须以十进制语法输入,而不是十六进制或位语法。
- 符号名在MIB中和系统中必须是唯一的。
- Sypv2允许使用连字符(一种实用的方法)。原因在于根据SMIv2,连字符允许从SMIv1转换而来的对象,但不能用于其他字符。这是无法检查编译器。
- 如果某个单词是SMIv1或SMIv2中的任何一个关键字,则它是编译器中的关键字(仅与SMIv1有所不同)。
- 表中的索引必须是对象,而不是类型(仅偏离SMIv1)。
- 所有类型语义检查的一个子集被实现。例如,严格来说
TimeTicks
可能不会被分类,但编译器允许这样做(标准MIB必须通过编译器)(偏离SMIv2)。
- 该
MIB.Object
语法未实现(因为所有的对象都必须是唯一反正)。
- 两个不同的名称不能定义相同的对象标识符。
- SEQUENCE构造中的类型检查是非严格的(即可以指定子类型)。原因是一些标准的MIB使用这个。
- 定义通常具有状态字段。当状态字段具有不推荐的值时,MIB编译器将忽略此定义。使用MIB编译器选项
{deprecated,true}
,MIB编译器不会忽略弃用的定义。
- 一个对象有一个DESCRIPTIONS字段。 说明字段默认情况下不会包含在已编译的mib中。 为了获得描述,必须使用选项描述来编译mib。