1. 程式人生 > >基於net-snmp的代理agent開發詳解

基於net-snmp的代理agent開發詳解

花了一兩天時間測試和整理一下。

net-snmp擴充套件MIB庫,實現方法可歸結為四種:

1)一是靜態庫方式,通過修改配置標頭檔案,在相應地方包含新引入的mib模組的.c和.h檔案,然後重新編譯庫檔案和擴充套件程式碼;這種方式不夠靈活,每次修改擴充套件的MIB後,都需要重新編譯snmpd和擴充套件的程式碼,再重新安裝snmpd到系統中。

2)二是編譯動態共享庫,只需把新引入的MIB模組的.c和.h檔案編譯成動態庫,通過設定能夠讓代理程式載入。

對於第二種方式,一需要編譯成.so動態共享庫,二需要原代理程式是否包含dlmod或load命令,三還要看系統是否支援。一般情況下僅支援Unix平臺。

3)三是擴充套件一個子代理,讓SNMPD以主代理的模式執行,對於SNMPD我們只要讓它啟動就可以,不需要任何的更改和配置,把子代理編譯生成的程式執行起來就可以擴充套件自定義的MIB庫。

4)用shell指令碼來擴充套件

本文我們以第三種方法在linux上開發和測試

一、安裝snmpd

既然要測試,而且我們用的也是net-snmp工具,當然要先安裝snmpd,本文采用5.7.2版本的snmpd,需安裝net-snmp-5.7.2-1, net-snmp-devel-5.7.2-1,net-snmp-perlmods-5.7.2-1,安裝可以是編譯net-snmp的原始碼,也可以下載rpm包安裝,這裡略過。

安裝好後測試一下service snmpd status,如果沒有反應,可能是沒有配置檔案,可以手動建立/etc/snmp目錄,在snmp目錄下建立snmpd.conf檔案,填入一些基本的配置資訊(或者通過snmpconf程式一步一步生成,snmpconf程式比較容易懂,適合童鞋們,snmpconf會提示你建立什麼配置檔案,需不需要把snmpd作為主代理等等強大的提示):

  1. master agentx  
  2. rocommunity public
  3. rwcommunity public

master 是說該snmpd以主代理方式執行,目前主代理snmpd只支援agentx型別,而我們要開發的程式是一種子代理(subagent),是需要連snmpd的master agent的。rocommunity (只讀物件)和rwcommunity(讀寫物件)的密碼都是public.(這個密碼就是客戶端訪問OID時需要提供的密碼,比如在任一一個裝有snmpd的linux機器上,執行snmpwalk -v2c -c public localhost 1.3.6.1.2.1.1, 這裡的public就是密碼,分別有隻讀OID密碼,和讀寫OID密碼),本文測試就以public作為預設的密碼吧。

現在測試一下snmpd是否正常,啟動service snmpd restart,執行snmpwalk -v2c -c public localhost 1.3.6.1.2.1.1, 如果有SNMPv2-MIB:xxxx之類的輸出就表示我們的主代理已經工作了。

二、自己的MIB庫

首先MIB庫有什麼用?其實作為子代理來說,在server機器上,可以不用MIB庫,MIB庫只為了讓使用者訪問時方便,有了MIB庫,使用者就不用記那麼多和長的OID,比如把MIB放在windows機器上,在windows機器裝一個支援MIB的軟體,用該軟體開啟MIB庫,只要點選相應的物件就可以自動傳送snmp請求到server端,所以server端是可以不要MIB庫的。如果把MIB庫放在linux客戶端機器上,以下面自定義的MIB庫為例,那麼就可以直接執行snmpget -v2c -c public Test-MIB::GetTime.0,當然需要linux客戶端裝有snmp,而且自定義的MIB庫必須能讓snmpd程式找到。 

這裡用就一個OID建一個MIB庫來簡化,命名Test-MIB.my,放在/usr/local/share/snmp/mibs目錄下,因為這個目錄是snmpd的預設目錄,只要把MIB庫放入該目錄就可以自動載入MIB庫,否則需要修改/etc/snmp/snmp.conf檔案,新增mibs +/path/to/Test-MIB.my 並重啟snmpd。

自定義MIB庫,如下:

  1. -- Test-MIB.my  
  2.     Test-MIB DEFINITIONS ::= BEGIN  
  3.         IMPORTS  
  4.             OBJECT-GROUP, MODULE-COMPLIANCE, NOTIFICATION-GROUP      
  5.                 FROM SNMPv2-CONF      
  6.             enterprises, Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY,   
  7.             NOTIFICATION-TYPE      
  8.                 FROM SNMPv2-SMI      
  9.             DisplayString      
  10.                 FROM SNMPv2-TC;  
  11. -- October 09, 2002 at 14:50 GMT  
  12.         -- 1.3.6.1.4.1.16535  
  13.         Test MODULE-IDENTITY   
  14.             LAST-UPDATED "200210091450Z"        -- October 09, 2002 at 14:50 GMT  
  15.             ORGANIZATION   
  16.                 ""
  17.             CONTACT-INFO   
  18.                 ""
  19.             DESCRIPTION   
  20.                 "Video's Server MIB."
  21.             ::= { enterprises 16535 }  
  22. --  Node definitions  
  23. -- This part will include all details about the Test.  
  24.         -- 1.3.6.1.4.1.16535.1  
  25.         Time OBJECT IDENTIFIER ::= { Test 1 }   
  26.         -- 1.3.6.1.4.1.16535.1.1  
  27.         GetTime OBJECT-TYPE  
  28.             SYNTAX DisplayString (SIZE (0..100))  
  29.             MAX-ACCESS read-only  
  30.             STATUS current  
  31.             DESCRIPTION  
  32.                 "Example : 2013/4/11"
  33.             ::= { Time 1 }  
  34.     END  
  35. -- Test-MIB.my  

很簡單,該MIB庫只有一個OID,即:1.3.6.1.4.1.16535.1.1,寫完後我們測一個MIB庫有沒有問題,在linux機器上用snmptranslate -Tp -IR Test-MIB::Test顯示結果如下:

  1. +--Test(16535)  
  2.    |  
  3.    +--Time(1)  
  4.       |  
  5.       +-- -R-- String    GetTime(1)  
  6.                Textual Convention: DisplayString  
  7.                Size: 0..100  

OK, snmp自動發現了這個MIB庫, 有了自定義的OID,但是還沒有處理程式(子代理)

三、生成原始碼

mib2c可以根據mib庫生成對應的原始碼,有多種模板,這裡我們要生成子代理的程式碼,所以選擇是固定的,執行env MIBS"+/usr/local/share/snmp/mibs/Test-MIB.my" mib2c Test,會引導你逐漸生成Test.h和Test.c, 先選2再選1,過程如下:

  1. [[email protected] mibs]# env MIBS="+/etc/snmp/mibs/Test-MIB.my" mib2c Test  
  2. writing to -  
  3. mib2c has multiple configuration files depending on the type of  
  4. code you need to write.  You must pick one depending on your need.  
  5. You requested mib2c to be run on the following part of the MIB tree:  
  6.   OID:                              Test  
  7.   numeric translation:              .1.3.6.1.4.1.16535  
  8.   number of scalars within:         1     
  9.   number of tables within:          0     
  10.   number of notifications within:   0     
  11. First, do you want to generate code that is compatible with the   
  12. ucd-snmp 4.X line of code, or code for the newer Net-SNMP 5.X code  
  13. base (which provides a much greater choice of APIs to pick from):  
  14.   1) ucd-snmp style code  
  15.   2) Net-SNMP style code  
  16. Select your choice : 2   
  17. **********************************************************************  
  18.          GENERATING CODE FOR SCALAR OBJECTS:  
  19. **********************************************************************  
  20.   It looks like you have some scalars in the mib you requested, so I  
  21.   will now generate code for them if you wish.  You have two choices  
  22.   for scalar API styles currently.  Pick between them, or choose not   
  23.   to generate any code for the scalars:  
  24.   1) If you're writing code for some generic scalars  
  25.      (by hand use: "mib2c -c mib2c.scalar.conf Test")  
  26.   2) If you want to magically "tie" integer variables to integer  
  27.      scalars  
  28.      (by hand use: "mib2c -c mib2c.int_watch.conf Test")  
  29.   3) Don't generate any code for the scalars  
  30. Select your choice: 1  
  31.     using the mib2c.scalar.conf configuration file to generate your code.  
  32. writing to Test.h  
  33. writing to Test.c  
  34. **********************************************************************  
  35. * NOTE WELL: The code generated by mib2c is only a template.  *YOU*  *  
  36. * must fill in the code before it'll work most of the time.  In many *  
  37. * cases, spots that MUST be edited within the files are marked with  *  
  38. * /* XXX */ or /* TODO */ comments.                                  *  
  39. **********************************************************************  
  40. running indent on Test.h  
  41. running indent on Test.c  
mib2c已經統計出我們的mib庫包含1個scalar變數,0個table變數,0個通知變數,Scalar就是包含我們常用的整型,字串,時間等等資料型別。table就是scalar的一種集合,有一個和多個列組成,類似於資料庫中的表。它必須具有索引項,用來按一定順序檢索表項,當然我們只寫了一個標量的OID,不是表結構也不是通知結構

生成的Test.h如下:

  1. /* 
  2.  * Note: this file originally auto-generated by mib2c using 
  3.  *        $ 
  4.  */
  5. #ifndef TEST_H
  6. #define TEST_H
  7. /* 
  8.  * function declarations  
  9.  */
  10. void            init_Test(void);  
  11. Netsnmp_Node_Handler handle_GetTime;  
  12. #endif                          /* TEST_H */

生成的Test.c檔案如下:
  1. /* 
  2.  * Note: this file originally auto-generated by mib2c using 
  3.  *        $ 
  4.  */
  5. #include <net-snmp/net-snmp-config.h>
  6. #include <net-snmp/net-snmp-includes.h>
  7. #include <net-snmp/agent/net-snmp-agent-includes.h>
  8. #include "Test.h"
  9. /** Initializes the Test module */
  10. void
  11. init_Test(void)  
  12. {  
  13.     const oid       GetTime_oid[] = { 1, 3, 6, 1, 4, 1, 16535, 1, 1 };  
  14.     DEBUGMSGTL(("Test""Initializing\n"));  
  15.     netsnmp_register_scalar(netsnmp_create_handler_registration  
  16.                             ("GetTime", handle_GetTime, GetTime_oid,  
  17. 相關推薦

    基於net-snmp代理agent開發

    花了一兩天時間測試和整理一下。 用net-snmp擴充套件MIB庫,實現方法可歸結為四種: 1)一是靜態庫方式,通過修改配置標頭檔案,在相應地方包含新引入的mib模組的.c和.h檔案,然後重新編譯庫檔案和擴充套件程式碼;這種方式不夠靈活,每次修改擴

    net-snmp agent開發,非常簡單

    轉載請標明出處 原文地址:http://blog.csdn.net/hepeng597/article/details/8782868 花了一兩天時間測試和整理一下。 用net-snmp擴充套件MIB庫,實現方法可歸結為四種: 1)一是靜態庫方式,通過修改配置標頭檔案,

    net-snmp agent開發

    轉載請標明出處 原文地址:http://blog.csdn.net/hepeng597/article/details/8782868 花了一兩天時間測試和整理一下。 用net-snmp擴充套件MIB庫,實現方法可歸結為四種: 1)一是靜態庫方式,通

    【轉】Quartz.net持久化與集群部署開發

    疑惑 sum 常用 drive wid res net github hub 轉自:http://www.cnblogs.com/knowledgesea/p/5145239.html 序言 我前邊有幾篇文章有介紹過quartz的基本使用語法與類庫。但是他的執行計劃都是被寫

    Linux裝置驅動開發 第3版 (即 Linux裝置驅動開發 基於最新的Linux 4 0核心 )進展同步更

                    本博實時更新《Linux裝置驅動開發詳解(第3版)》的最新進展。 目前已經完成稿件。 2015

    [轉]javaCV開發之5:錄製音訊(錄製麥克風)到本地檔案/流媒體伺服器(基於javax.sound、javaCV-FFMPEG)

    本文轉載自部落格:https://blog.csdn.net/eguid_1/article/details/52702385 ------------------------------------------------------------------------------------

    javaCV開發之4:轉流器實現(也可作為本地收流器、推流器,新增新增圖片及文字水印,視訊影象幀儲存),實現rtsp/rtmp/本地檔案轉發到rtmp流媒體伺服器(基於javaCV-FFMPEG)

    javaCV系列文章: 補充篇: 歡迎大家積極開心的加入討論群 javacpp-ffmpeg: 前言: 本章基於javaCV實現轉流器和收流器功能,測試採用監控rtsp地址轉發至rtmp伺服器地址 新增openCV儲存圖片功能。 補充:

    關於召回《Linux裝置驅動開發-基於最新的Linux 4.0核心》的通知

    問題描述關於《Linux裝置驅動開發詳解:基於最新的Linux 4.0核心》一書1.華章分社在沒

    javaCV開發之2:推流器實現,推本地攝像頭視訊到流媒體伺服器以及攝像頭錄製視訊功能實現(基於javaCV-FFMPEG、javaCV-openCV)

    javaCV系列文章: 補充篇: 歡迎大家積極開心的加入討論群 javacpp-ffmpeg: 前言: 本章將在上一章的基礎上,增加視訊推流到流媒體伺服器和視訊錄製的功能; 功能:實現邊播放邊錄製/推流,停止預覽即停止錄製/推流 提示:

    【Linux】Linux裝置驅動開發基於最新的Linux 4.0核心

    1 Linux裝置驅動概述及開發環境構建 1.1 裝置驅動的作用 驅使硬體裝置行動 1.2 無作業系統時的裝置驅動 典型架構:一個無限迴圈中夾雜著對裝置中斷的檢測或者對裝置的輪詢 1.3 有作業系統時的裝置驅動 併發 、記

    《Linux裝置驅動開發基於最新的Linux 4.0核心》一刷勘誤

    這是第一次印刷的勘誤,大部分應該買的都是5刷了,這些錯誤基本已經絕跡。還是有部分童鞋買的書老書,

    Vue.js 插件開發

    js 前言隨著 Vue.js 越來越火,Vue.js 的相關插件也在不斷的被貢獻出來,數不勝數。比如官方推薦的 vue-router、vuex 等,都是非常優秀的插件。但是我們更多的人還只停留在使用的階段,比較少自己開發。所以接下來會通過一個簡單的 vue-toast 插件,來了解掌握插件的開發和使用。

    斑布生活家系統開發模式設計

    log 所有 http 裏的 詳解 啟動 一次 什麽 氣體 斑布生活家系統開發(李想.185.6504.8478)根據化石研究,史前時代的始祖鳥被認為是最早的飛行鳥類,它在許多方面已顯現鳥的一些雛形,例如全身長有羽毛和翅膀、具有明顯的叉骨等。這些證據表明,鳥類的飛行能力應該

    lucene、lucene.NET詳細使用與優化[轉]

    構造 bitset 更多 隱患 .net wrapper 屬性設置 似的 擔心 1 lucene簡介1.1 什麽是luceneLucene是一個全文搜索框架,而不是應用產品。因此它並不像www.baidu.com 或者google Desktop那麽拿來就能用,它只是提供了

    Hive UDAF開發

    -s 聚合 而且 pri ros cal 關系 方法調用 evaluator 明這篇文章是來自Hadoop Hive UDAF Tutorial - Extending Hive with Aggregation Functions:的不嚴格翻譯,因為翻譯的文章示例寫得比較

    果園農場種植遊戲復利拆分模式app系統開發

    計算 數量 政策 經營者 終端 默認 自己 產生 後臺 330復利拆分果園遊戲app系統開發(蘇公子.188.1414.7927)皮皮果遊戲開發,玫瑰莊園遊戲開發,復利拆分遊戲開發,330模式開發,330果園系統開發,復利拆分農場系統開發,英倫果開發,皮皮果遊戲介紹,地點的

    火爆的車享家模式系統開發

    目前 聯合體 移動互聯網 體系 通過 系列 獲得 com img 車享家是一個關於用車的全方位平臺!上線至今都十分火熱,盈利能力也強,通過結合“高效線上運營”和“優質線下服務”,全方位打通汽車“看、選、買、用、賣”,簡單來看,是淘寶+o2o的聯合體。目前汽車市場蓬勃發展,汽

    解析利用wsdl.exe生成webservice代理類的

    不同 綁定 配置 img 請求 name cto lena 處理 利用wsdl.exe生成webservice代理類:根據提供的wsdl生成webservice代理類1、開始->程序->Visual Studio 2010 命令提示2、輸入如下紅色標記部分D:/

    SylixOS 基於ZYNQ的時鐘頻率修改

    時鐘頻率 zynq 倍頻 概述 本文檔以ZYNQ7000平臺為例,詳細介紹如何去修改ZYNQ的時鐘頻率。 時鐘頻率修改流程 ZYNQ7000的時鐘頻率修改流程,如圖 2.1所示。具體步驟如下: 步驟一:解除ZYNQ7000的寄存器寫鎖定; 步驟二:向

    Android"掛逼"修煉之行---微信中定位照片的位置信息插件開發

    頁面 blank 如果 put 法律 mali 特殊字符 在哪裏 加載 一、前言 最近關於微信中,朋友之間發送原圖就可能暴露你的位置信息,其實這個問題不在於微信,微信是為了更好的體驗效果,才有發送原圖功能,而對於拍照,發送普通圖片微信後臺都會過濾圖片的exif信息,這樣就