首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

net-snmp 開發指南:添加自定義 C 模組編譯進 Agent 完整流程

     編輯:程式設計綜合問答

專案結構準備

在 net-snmp 原始碼目錄 agent/mibgroup/ 下建立自定義模組目錄:

agent/mibgroup/
├── MY/                    # 自建模組目錄
│   ├── my_module.c        # 實作檔
│   ├── my_module.h        # 標頭檔
│   └── Makefile.in        # 可選:自定義編譯規則
└── MY.h                   # 統一註冊標頭檔(關鍵)

核心檔案內容

1. 模組註冊標頭檔 agent/mibgroup/MY.h

#ifndef MY_H
#define MY_H

// 向 net-snmp 註冊子模組
config_require(MY/my_module)  // 對應 MY/my_module.c

#endif

2. 實作檔 agent/mibgroup/MY/my_module.c


#include 
#include 
#include "my_module.h"

// 定義 MIB 節點 OID: .1.3.6.1.4.1.8072.9999 (企業私有 OID 範例)
static oid my_oid[] = { 1, 3, 6, 1, 4, 1, 8072, 9999 };

// 處理函數
int handle_my_module(netsnmp_mib_handler *handler,
                     netsnmp_handler_registration *reginfo,
                     netsnmp_agent_request_info *reqinfo,
                     netsnmp_request_info *requests)
{
    switch (reqinfo->mode) {
        case MODE_GET:
            snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                                     "Hello World from net-snmp!", 28);
            break;
        default:
            return SNMP_ERR_GENERR;
    }
    return SNMP_ERR_NOERROR;
}

// 模組初始化
void init_my_module(void)
{
    netsnmp_register_scalar(
        netsnmp_create_handler_registration(
            "myModule",           // 模組名稱
            handle_my_module,     // 處理函數
            my_oid, OID_LENGTH(my_oid),
            HANDLER_CAN_RONLY     // 僅支援 GET
        )
    );
}

3. 標頭檔 agent/mibgroup/MY/my_module.h

#ifndef MY_MODULE_H
#define MY_MODULE_H

void init_my_module(void);

#endif

編譯配置與建置

1. 重新配置編譯選項

cd /path/to/net-snmp-source
./configure --with-mib-modules="MY" [其他原有選項...]

關鍵參數:--with-mib-modules="MY" 告訴建置系統編譯 MY 目錄下的模組。

2. 編譯安裝

make
sudo make install

3. 驗證模組載入

# 檢查 snmpd.conf 是否載入
grep -r "my_module" /usr/local/share/snmp/mibs/

# 測試查詢
snmpget -v2c -c public localhost 1.3.6.1.4.1.8072.9999
# 應回傳: SNMPv2-SMI::enterprises.8072.9999 = STRING: "Hello World from net-snmp!"

常見問題排查

錯誤現象原因解決方案
configure 階段找不到模組目錄結構不符或 MY.h 遺漏確認 agent/mibgroup/MY.h 存在且 config_require 語法正確
編譯錯誤:未定義的參考init_my_module 未正確宣告/定義檢查 .h/.c 函數簽名一致,且 .c 包含正確標頭檔
snmpget 回傳 noSuchObjectOID 衝突或模組未註冊確認 OID 唯一,檢查 snmpd.log 確認模組載入訊息
權限被拒絕snmpd.conf 社群字串/ACL 設定修改 rocommunity 或 view 定義

進階:加入 MIB 定義檔

建立 MY-MIB.txt 放入 /usr/local/share/snmp/mibs/,即可使用名稱查詢:

MY-MIB DEFINITIONS ::= BEGIN
IMPORTS
    enterprises FROM SNMPv2-SMI;

myModule OBJECT-TYPE
    SYNTAX DisplayString
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION "Custom net-snmp module example"
    ::= { enterprises 8072 9999 }
END
snmpget -v2c -c public -M +/usr/local/share/snmp/mibs -m +MY-MIB localhost myModule

總結

net-snmp 添加自定義 C 模組的核心步驟:建立模組目錄 → 撰寫實作與註冊標頭 → configure 指定模組 → 重新編譯安裝。關鍵在於 config_require() 機制與 --with-mib-modules 參數的正確使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved