net-snmp中自定义snmp table的实现

 每次调试程序的时候,都需要一个真实的设备来做agent,当agent出问题的时候往往会影响项目进度,于是想能否找到一个windows上的替代品来做测试,只要有MIB就可以测试了。经过几个月摸索现在终于找到一个替代品,用net-snmp 的扩展agent方式。这里以v5.4.2.1作介绍(注意,有些版本在windows上编译会带来一些问题,我没有去细究)。

 

1. 要在windows上编译,请先下载ActivePerl,我这里用的是ActivePerl-5.10.0.1004-MSWin32-x86-287188.msi。下载,安装之后进入net-snmp目录下的win32子目录,敲入build(注意可能之前要提示的敲入vcvars32.bat),然后按照提示操作即可:

 

这里接受默认的安装路径,选项3保持不动,4也保持不动,把5,6选项值为enable,按数字5,6即可,然后按F键,程序开始编译。

 

2。编译完之后,进入c:/usr/bin目录,把你需要用来测试的的MIB文件放入share/snmp/mibs目录下,假设测试mib为DAP-2590.mib,我们要测试里面的lanIfSettingTable节点。定义如下:

 

DAP-2590-v111    DEFINITIONS ::= BEGIN

            IMPORTS
                private, IpAddress, TimeTicks   FROM    RFC1155-SMI
                ifIndex                         FROM    RFC1213-MIB
                OBJECT-TYPE                     FROM    RFC-1212
--              TruthValue                      FROM    SNMPv2-TC
                MacAddress                      FROM    SNMPv2-TC
                NOTIFICATION-TYPE               FROM    SNMPv2-SMI;

            DisplayString ::= OCTET STRING
            -- This data type is used to model textual information taken
            -- from the NVT ASCII character set.  By convention, objects
            -- with this syntax are declared as having
            --
            -- SIZE(0..255)

            enterprises                             OBJECT  IDENTIFIER ::= { private 1 }
            dlink                                   OBJECT  IDENTIFIER ::= { enterprises 171 }
            dlink-products                          OBJECT  IDENTIFIER ::= {  10 }
            dlink-dwlfamily                         OBJECT  IDENTIFIER ::= { dlink-products 37 }
            -- dwlfamily means D-Link wireless family

            dap2590                                 OBJECT  IDENTIFIER ::= { dlink-dwlfamily 36 }

            interface                               OBJECT  IDENTIFIER ::= { dap2590 2 }

            lan                                     OBJECT  IDENTIFIER ::= { interface 1 }

            lanIfSetting                            OBJECT  IDENTIFIER ::= { lan 1 }

            lanIfSettingTable                       OBJECT-TYPE
            SYNTAX                                  SEQUENCE OF LanIfSettingEntry
            ACCESS                                  not-accessible
            STATUS                                  mandatory
            DESCRIPTION
            ""
            ::= { lanIfSetting 1 }

            lanIfSettingEntry                       OBJECT-TYPE
            SYNTAX                                  LanIfSettingEntry
            ACCESS                                  not-accessible
            STATUS                                  mandatory
            DESCRIPTION
            ""
            INDEX                                   {ifIndex}
            ::= { lanIfSettingTable 1 }

            LanIfSettingEntry
            ::= SEQUENCE
            {
                lanIfGetIpAddressFrom                   INTEGER,
                lanIfIpAddress                          IpAddress,
                lanIfSubnetMask                         IpAddress,
                lanIfDefaultGateway                     IpAddress,
                lanIfMacAddress                         MacAddress
            }

            lanIfGetIpAddressFrom                   OBJECT-TYPE
            SYNTAX                                  INTEGER {static(1), dynamic(2)}
            ACCESS                                  read-write
            STATUS                                  mandatory
            DESCRIPTION
            ""
            ::= { lanIfSettingEntry 1 }

            lanIfIpAddress                          OBJECT-TYPE
            SYNTAX                                  IpAddress
            ACCESS                                  read-write
            STATUS                                  mandatory
            DESCRIPTION
            ""
            ::= { lanIfSettingEntry 2 }

            lanIfSubnetMask                         OBJECT-TYPE
            SYNTAX                                  IpAddress
            ACCESS                                  read-write
            STATUS                                  mandatory
            DESCRIPTION
            ""
            ::= { lanIfSettingEntry 3 }

            lanIfDefaultGateway                     OBJECT-TYPE
            SYNTAX                                  IpAddress
            ACCESS                                  read-write
            STATUS                                  mandatory
            DESCRIPTION
            ""
            ::= { lanIfSettingEntry 4 }

            lanIfMacAddress                         OBJECT-TYPE
            SYNTAX                                  MacAddress
            ACCESS                                  read-only
            STATUS                                  mandatory
            DESCRIPTION
            ""
            ::= { lanIfSettingEntry 5 }

 

打开share/snmp下的snmp.conf文件加入:

mibs +DAP-2590-v111

 

注意+后面跟的是MIB文件定义的module名称,而不是mib文件名。

 

然后敲入:

Snmptranslate -On -Tp DAP-2590-v111::lanIfSettingTalbe    

 

注意,参数后面键入的module名称要区分大小写的。在mib2c中可以省去module名称DAP-2590-v111

 

mib2c -c mib2c-create-dateset.conf lanIfSettingTable

 

将产生lanIfSettingTable.c,lanIfSettingTable.h,修改lanIfSettingTable.c

void
initialize_table_lanIfSettingTable(void)
{
    static oid lanIfSettingTable_oid[] = {1,3,6,1,4,1,171,10,37,36,2,1,1,1};
    size_t lanIfSettingTable_oid_len = OID_LENGTH(lanIfSettingTable_oid);
    netsnmp_table_data_set *table_set;

    /* create the table structure itself */
    table_set = netsnmp_create_table_data_set("lanIfSettingTable");

    /* comment this out or delete if you don't support creation of new rows */
    table_set->allow_creation = 1;

    /***************************************************
     * Adding indexes
     */
    DEBUGMSGTL(("initialize_table_lanIfSettingTable",
                "adding indexes to table lanIfSettingTable/n"));
    netsnmp_table_set_add_indexes(table_set,
                           ASN_INTEGER,  /* index: ifIndex */
                           0);

    DEBUGMSGTL(("initialize_table_lanIfSettingTable",
                "adding column types to table lanIfSettingTable/n"));  
    netsnmp_table_set_multi_add_default_row(table_set,
                                            COLUMN_LANIFGETIPADDRESSFROM, ASN_INTEGER, 1,
                                            NULL, 0,
                                            COLUMN_LANIFIPADDRESS, ASN_IPADDRESS, 1,
                                            NULL, 0,
                                            COLUMN_LANIFSUBNETMASK, ASN_IPADDRESS, 1,
                                            NULL, 0,
                                            COLUMN_LANIFDEFAULTGATEWAY, ASN_IPADDRESS, 1,
                                            NULL, 0,
                                            COLUMN_LANIFMACADDRESS, ASN_OCTET_STR, 0,
                                            NULL, 0,
                              0);
   
    /* registering the table with the master agent */
    /* note: if you don't need a subhandler to deal with any aspects
       of the request, change lanIfSettingTable_handler to "NULL" */
    netsnmp_register_table_data_set(netsnmp_create_handler_registration("lanIfSettingTable", NULL,
                                                        lanIfSettingTable_oid,
                                                        lanIfSettingTable_oid_len,
                                                        HANDLER_CAN_RWRITE),
                            table_set, NULL);

  /*
     * Finally, this actually allows the "add_row" token it the
     * * snmpd.conf file to add rows to this table.
     * * Example snmpd.conf line:
     * *   add_row netSnmpIETFWGTable eos "Glenn Waters" "Dale Francisco"
     */
    netsnmp_register_auto_data_table(table_set, NULL);//注意添加上这一句,它是从snmpd.conf中读取table信息。snmpd.conf文件在哪里?就在刚刚提到的snmp.conf同层目录下,没有自己可创建一个,文本格式。在该文件中加入:

 

add_row lanIfSettingTable 1 1 192.168.0.20 255.255.255.0 192.168.0.1 0x001122ff4455
add_row lanIfSettingTable 2 2 192.168.0.21 255.255.255.0 192.168.0.1 0x001122ff4456

 

这样就有两行数据了,

 



}

同时在snmpd.conf中加入:

#   This section defines who is allowed to talk to your running
#   snmp agent.

# rocommunity: a SNMPv1/SNMPv2c read-only access community name
#   arguments:  community [default|hostname|network/bits] [oid]

rocommunity  public 
 

# rwcommunity: a SNMPv1/SNMPv2c read-write access community name
#   arguments:  community [default|hostname|network/bits] [oid]

rwcommunity  private

 

设定v2c,v1的community string.

 

最后按照net-snmp手册添加lanIfSettingTable.c,lanIfSettingTable.h,之后用vc6分别打开netsnmpmibs,snmpd

然后将产生的snmpd.exe替换掉c:/usr/bin目录下同名文件即可,运行:

 

snmpd -d

 

snmptable -v2c -c public localhost lanIfSettingTable

 

 

成功!

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值