1. 程式人生 > >net-snmp中自定義snmp table的實現

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

成功!

相關推薦

net-snmp定義snmp table實現

 每次除錯程式的時候,都需要一個真實的裝置來做agent,當agent出問題的時候往往會影響專案進度,於是想能否找到一個windows上的替代品來做測試,只要有MIB就可以測試了。經過幾個月摸索現在終於找到一個替代品,用net-snmp 的擴充套件agent方式。這裡以v5.

c#定義集合的實現

功能:集合,包含新增,刪除,計算交集,並集,補集,是否為子集 using System; using System.Collections; using System.Collections.Generic; public class CSet { private

Android定義drawable資源實現佈局的圓角邊框效果

佈局的圓角邊框效果圖如下所示: 如上圖紅色標註的部分就是一個圓角邊框效果的自定義搜尋框。 實現起來很簡單,讓佈局(Relativelayout或者LinearLayout)的background屬性引用自定義的drawable資源即可。 andro

iOS定義delegate的實現

        在iOS開發中經常會用到delegate,無論是檢視、控制元件,還是不同頁面之間傳值等等。         通常,我們需要自定義delegate實現,以下簡單介紹自定義delegate的步驟。 1.定義delegate的protocol檔案        

Source Insight 定義命令的實現

我們開發過程中需要頻繁的開啟 ref_list.txt,可以通過 Source Insight 中的定製命令功能很方便的實現相應的命令和快捷鍵: 把要執行的工具檔案放到一個目錄下,比如:E:/tools 選單:Options à Custom Commands: (1

Spring Boot定義註解+AOP實現主備庫切換

摘要: 本篇文章的場景是做排程中心和監控中心時的需求,後端使用TDDL實現分表分庫,需求:實現關鍵業務的查詢監控,當用Mybatis查詢資料時需要從主庫切換到備庫或者直接連到備庫上查詢,從而減小主庫的壓力,在本篇文章中主要記錄在Spring Boot中通過自定義註解結合AOP實現直接連線備庫查詢。 一.通過A

1 .net定義事件的步驟

sender soc size etc utf nbsp 並且 ram void 1 申明一個自定義的類並且繼承事件的基類 public class ClientSocketModelConnectedEvent:EventArgs { priv

在.net桌面程式定義滑鼠游標

原文: 在.net桌面程式中自定義滑鼠游標 有的時候,一個自定義的滑鼠游標能給你的程式增色不少。本文這裡介紹一下如何在.net桌面程式中自定義滑鼠游標。由於.net的桌面程式分為WinForm和WPF兩種,這裡分別介紹一下。 WinForm程式 對於WinForm程式,可以通過修改Control.Cu

在.net桌面程序定義鼠標光標

.com info mco 分享圖片 rap orm mask ali asp 原文:在.net桌面程序中自定義鼠標光標有的時候,一個自定義的鼠標光標能給你的程序增色不少。本文這裏介紹一下如何在.net桌面程序中自定義鼠標光標。由於.net的桌面程序分為WinForm和WP

用React定義元件模擬實現Vue-routertag功能

  我們在使用react-router-dom時,跳轉連結的<List>會轉換成<a>標籤。由於<a>標籤會破壞我們的佈局,所以今天我用React中的自定義元件實現一個類似Vue中路由跳轉中tag的功能,保留我們本來的標籤。   本篇文章涉及到的知識點包括:高階元件wit

Django定義實現restful

什麼是restful api   可以總結為一句話:REST是所有Web應用都應該遵守的架構設計指導原則。 Representational State Transfer,翻譯是”表現層狀態轉化”。 面向資源是REST最明顯的特徵,對於同一個資源的一組不同的操作。REST要求,必須通過統一的介面來對資源

獲取實現了某介面的所有類,並返回該類定義的方法的方法名

準備階段:   定義介面和實現介面的類。 interface IMyInterface { void Write(); } /// <summary> /// 實現類1 /// </summary>

在html展示自己設計的字型(使用定義字型庫實現資料加密)

在iconfont這麼發達的年代,作為前端設計工程師使用font awesome 是十分頻繁的,而“png圖”樣式圖示現在已經應用的比較少了,追溯其原因還是瀏覽器核心的渲染速度提升和字型庫多瀏覽器(包括手機)的支援,向量字型不會出現模糊的情況等等。從最早html4時代把圖示做

.Net定義類作為Dictionary的key詳解

在定義資料結構時,Dictionary提供了快速查詢資料的功能,另外Dictionary< TKey, TValue >屬於key-value鍵值對資料結構,提供了泛型的靈活性,是資料結構的一個利器,但是目前擁有的string,int,bool

Asp.net MVC Preview 4 定義Jquery的HtmlHelper擴充套件

using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; us

彈跳載入定義簡單控制元件實現

package com.loaderman.customviewdemo; import android.animation.Animator; import android.animation.ValueAnimator; import android.content.Context; i

Swiftenum定義型別的實現

在Swift中列舉型別非常強大,內建的實現可以大大減少我們手敲的程式碼量.下面碰巧就有這麼一個需求:Person類裡面有一個type屬性,其值包含2個內容,一個是name,型別為String,另一個是logo,型別也為字串,不過表現為繪文字emoji. 因為結

android定義畫布Canvas的實現

一、要求:1.畫布繪製控制元件的方法,控制元件應該是一個可以自定義的;2.畫布是可以縮放,且提供一個縮放的方法供外使用;3.控制元件之間連線的方法;4.畫布縮放之後手勢滑動的識別實現; 二、在github裡面種找到了一個類似度挺高的開源專案: github中的第三方的開源專

Angular2定義元件實現雙向繫結

    在Angular2中的資料流動是單向的,我們常見的雙向繫結的例子如下:<input [(ngModel)]="value"/>等價於<input [ngModel]="value" (ngModelChange)="valueChange($even

如何在C#.net定義和使用特性

Attribute的基本概念 經常有周邊人問,Attribute是什麼?它有什麼用?好像沒有這個東東程式也能執行。實際上在.Net中,Attribute是一個非常重要的組成部分,本文整理相關資料,提供給大家參考。 首先,我們肯定Attribute是一個類,下面是msd