SNMP代理簡單開發

1、  參照網上到處能下到的net-snmp安裝配置手冊》編譯安裝net-snmp5.4.2,並參照《net-snmp安裝配置手冊》進行相應配置。

2、  根據ASN.1語法編寫MIBBAMBOO-MIB.txt。內容如下:

BAMBOO-MIB DEFINITIONS ::= BEGIN

 

IMPORTS

TimeTicks  FROM SNMPv2-SMI

enterprises FROM SNMPv2-SMI

OBJECT-GROUP, NOTIFICATION-GROUP FROM SNMPv2-CONF

OBJECT-TYPE, Integer32, Gauge32, MODULE-IDENTITY NOTIFICATION-TYPE FROM SNMPv2-SMI

TEXTUAL-CONVENTION FROM SNMPv2-TC;

                                

cdut OBJECT IDENTIFIER ::= { enterprises 8888 }

ce OBJECT IDENTIFIER ::= { cdut 8 }

FY0404 OBJECT IDENTIFIER ::= { ce 4 }    

FY04040019 OBJECT IDENTIFIER ::= { FY0404 19 }  

 

myVersion  OBJECT-TYPE

SYNTAX      OCTET STRING (SIZE (0..64))

MAX-ACCESS  read-only

STATUS      current

DESCRIPTION

"sofware version"          

::= { FY04040019 1 }

       

mySysResetNo OBJECT-TYPE

SYNTAX      Integer32

MAX-ACCESS  read-write

STATUS      current

DESCRIPTION

"if mySysResetNo=1,restart system"           

::= { FY04040019 2 }       

 

END

3、  /usr/local/net-snmp/share/snmp下創建snmp.conf,用於配置MIB庫。

snmp.conf中添加如下內容來加載要添加的MIB庫:   mib +BAMBOO-MIB

再次運行#snmpd –c snmpd.conf –c snmp.conf使配置文件生效。

   查看MIB庫是否加載:

# snmptranslate -IR -Tp cdut

+--cdut(8888)

            |

            +--ce(8)

                 |

          +--FY0404(4)

                |

              +--FY04040019(19)

                   |

                   +-- -R-- String    myVersion(1)

                   |        Size: 0..64

                   +-- -RW- Integer32 mySysResetNo(2)

 

4、  下面利用mib2c來生成.c.h文件(因爲該MIB庫中的變量含有string類型,所以選用mib2c.scalar.conf作爲模版)

#mib2c –c mib2c.scalar.conf  FY04040019

將生成FY04040019.cFY04040019.h文件。

 

5、  修改FY04040019.c文件:

添加以下定義:

#define STRLENGTH 64

char myVersion[STRLENGTH] = "bamboo-1.00";

unsigned mySysResetNo = 0;

 

   添加代碼(藍色部分爲添加的代碼):

int handle_myVersion(……)

{

      ……

case MODE_GET:

           snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,

                                 (u_char *)myVersion,     //++ by Bamboo

                                 sizeof(myVersion)         //++ by Bamboo

                                     );

              break

       }

 

       int handle_mySysResetNo(……)

       {

              case MODE_GET:

        snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,

                                 (u_char *)&mySysResetNo,   //++ by Bamboo

                                 sizeof(mySysResetNo)       //++ bu Bamboo

                                    );

        break;

             

              case MODE_SET_RESERVE1:

        /*

         * or you could use netsnmp_check_vb_type_and_size instead

         */

        ret = netsnmp_check_vb_type(requests->requestvb, ASN_INTEGER);

        if (ret != SNMP_ERR_NOERROR) {

            netsnmp_set_request_error(reqinfo, requests, ret);

        }

        break;

 

             case MODE_SET_RESERVE2:

                  if (0) {                                   //++by Bamboo

                netsnmp_set_request_error(reqinfo, requests,

                                      SNMP_ERR_RESOURCEUNAVAILABLE);

               }

        break;

 

           case MODE_SET_FREE:

                 break;

 

           case MODE_SET_ACTION:

                mySysResetNo = *(requests->requestvb->val.integer);  //++ by Bamboo

if (mySysResetNo > 1) {                    //++ by Bamboo

            netsnmp_set_request_error(reqinfo, requests, 0/* some error */

                                      );

               }

        break;

 

             case MODE_SET_COMMIT:

               if (0 ) {                                                           //++ by Bamboo

            netsnmp_set_request_error(reqinfo, requests,

                                      SNMP_ERR_COMMITFAILED);

               }

        break;

 

             case MODE_SET_UNDO:

        if (0) {                                                                   //++ by Bamboo

            /*

             * try _really_really_ hard to never get to this point

             */

            netsnmp_set_request_error(reqinfo, requests,

                                      SNMP_ERR_UNDOFAILED);

        }

        break;

              ……

       }

 

6、  下面準備重新編譯net-snmp-5.4.2

FY04040019.cFY04040019.h文件拷貝到net-snmp-5.4.2/agent/mibgroup下。

然後重新配置configure文件:

(當前目錄爲net-snmp-5.4.2)

#./configure  –with-mib-modules=”FY04040019”  其他略(其他配置參數參考《net-snmp安裝配置手冊》)

進行編譯和安裝(安裝目錄爲net-snmp#make && make install

再次啓動snmp#snmpd  –c  snmpd.conf  –c  snmp.conf

到此MIB庫的擴展以成功了,下面進行驗證。

 

7、  查看myVersion對象的實例(訪問實例一定要在對象後面加“.0”)

# snmpget -v2c -c public 192.168.16.3 1.3.6.1.4.1.8888.8.4.19.1.0

BAMBOO-MIB::myVersion.0 = Hex-STRING: 62 61 6D 62 6F 6F 2D 31 2E 30 30 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

OK get成功

 

設置mySysResetNo的值

 

# snmpset -v2c -c public localhost 1.3.6.1.4.1.8888.8.4.19.2.0 i 1   //設置爲整形數1

BAMBOO-MIB::mySysResetNo.0 = INTEGER: 1

 

查看mySysResetNo的值

snmpget -v2c -c public localhost 1.3.6.1.4.1.8888.8.4.19.2.0

BAMBOO-MIB::mySysResetNo.0 = INTEGER: 1

 

目前存在有待解決的問題:

snmpget -v2c -c public 192.168.16.3 1.3.6.1.4.1.8888.8.4.19.2.0

BAMBOO-MIB::mySysResetNo.0 = INTEGER: 1       //ip地址來get,是可以的

 

snmpset -v2c -c public 192.168.16.3 1.3.6.1.4.1.8888.8.4.19.2.0 i 1

Error in packet.

Reason: noAccess

Failed object: BAMBOO-MIB::mySysResetNo.0        //ip地址來set就不行了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章