非常教程

Erlang 20参考手册

snmp

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

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/"]}]).
    

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

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-errorC-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。以下是不同之处:

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

snmp相关

1.1. SNMP简介 | 1. SNMP Introduction
2.2.代理功能描述 | 2. Agent Functional Description
3.3.管理功能描述 | 3. Manager Functional Description
4.5.运行应用程序 | 5. Running the application
5.6.代理配置文件的定义 | 6. Definition of Agent Configuration Files
6.7. Manager配置文件的定义 | 7. Definition of Manager Configuration Files
7.8.代理实现示例 | 8. Agent Implementation Example
8.9.管理实施例 | 9. Manager Implementation Example
9.10.检测函数 | 10. Instrumentation Functions
10.检测函数的定义 | 11. Definition of Instrumentation Functions
11.Net if的定义 | 12. Definition of Agent Net if
12.管理Netif 的定义 | 13. Definition of Manager Net if
13.14.审计跟踪日志 | 14. Audit Trail Log
14.15.高级代理主题 | 15. Advanced Agent Topics
15.16. SNMP Appendix A
16.17. SNMP Appendix B
17.snmp
18.snmpa
19.snmpa_conf
20.snmpa_discovery_handler
21.snmpa_error
22.snmpa_error_io
23.snmpa_error_logger
24.snmpa_error_report
25.snmpa_local_db
26.snmpa_mib_data
27.snmpa_mib_storage
28.snmpa_mpd
29.snmpa_network_interface
30.snmpa_network_interface_filter
31.snmpa_notification_delivery_info_receiver
32.snmpa_notification_filter
33.snmpa_supervisor
34.snmpc
35.snmpm
36.snmpm_conf
37.snmpm_mpd
38.snmpm_network_interface
39.snmpm_network_interface_filter
40.snmpm_user
41.snmp_community_mib
42.snmp_framework_mib
43.snmp_generic
44.snmp_index
45.snmp_notification_mib
46.snmp_pdus
47.snmp_standard_mib
48.snmp_target_mib
49.snmp_user_based_sm_mib
50.snmp_view_based_acm_mib
Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1