首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

4. MIB编译器 | 4. The MIB Compiler

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编译器。 例如:

代码语言:javascript
复制
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}选项,例如:

代码语言:javascript
复制
snmpc:compile("MY-MIB", 
       [{i, ["friend_mibs/", "../standard_mibs/"]}]).
    

也可以"include_lib"使用该il选项以类似方式从OTP应用程序导入MIB 。例:

代码语言:javascript
复制
snmpc:compile("MY-MIB", 
       [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).
    

找到最新版本的snmpmyapp在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之间进行一致性检查:

代码语言:javascript
复制
erl>snmpc:is_consistent(ListOfMibNames).
    

ListOfMibNames是编译的MIB的列表,例如["RFC1213-MIB", "MY-MIB"].该函数还执行陷阱定义的一致性检查。

4.4 . hrl文件生成

可以.hrl从编译的MIB文件生成一个包含Erlang常量定义的文件。这个文件可以包含在Erlang源代码中。该文件将包含以下常量:

  • 表、表项和变量的对象标识符
  • 列号
  • 枚举值
  • 变量和表列的默认值。

使用以下命令生成一个。来自MIB的HRL文件:

代码语言:javascript
复制
erl>snmpc:mib_to_hrl(MibName).
    

4.5 EMACS集成

使用Emacs编辑器,如果错误消息由行号描述,则可以使用next-errorC-X `)函数指示发生编译错误的位置。

用于M-x compile从Emacs内部编译MIB,然后输入:

代码语言:javascript
复制
erl -s snmpc compile <MibName> -noshell
   

一个例子<MibName>RFC1213-MIB

4.6从Shell或makefile编译

这些erlc命令可用于编译SNMP MIB。例:

代码语言:javascript
复制
erlc MY-MIB.mib
   

所有的标准erlc标志都被支持,例如

代码语言:javascript
复制
erlc -I mymibs -o mymibs -W MY-MIB.mib
   

特定于MIB编译器的标志可以使用以下+语法来指定:

代码语言:javascript
复制
erlc +'{group_check,false}' MY-MIB.mib
   

4.7偏离标准

在某些方面,ErlangMIB编译器没有完全遵循或实现SMI。以下是不同之处:

  • 表必须写在顺序如下:tableObjectentryObjectcolumn1,..., 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。

扫码关注腾讯云开发者

领取腾讯云代金券