SNMP功能開發簡介 六 snmp功能開發階段性總結

先說客戶需求:能夠通過SNMP協議獲取設備信息便於管理。客戶提出的需求信息轉化成MIB結點都是Get類請求。

背景&方案:我們的產品業務層是使用Go語言開發的,系統層基於OpenWrt(一個嵌入式的 Linux 發行版)。SNMP功能一年前在上家公司裏接觸過,當時是因爲生產產品的時候需要通過snmp去進行相關的升級操作,那個時候還專門學測試了一下MIB結點的添加,也能夠成功運行。雖說接觸過,但也僅僅是MIB結點的添加,這次的任務是是設備支持snmp功能,從頭開始設計snmp的話有點不現實,一方面協議很多內容很多,要設計的話考慮方方面面,短期內無法完成,另外一個方面,感覺還是有點困難,⊙﹏⊙‖∣

老闆的建議是找一下相關的庫進行移植,去github上逛了一圈,Golang的SNMP版本目前還沒有完善的版本,大部分的Golang SNMP項目都是開發NMS(網絡管理工作站)而不是SNMP Agent代理,所以就採用C版本的net-snmp,net-snmp是開源的SNMP項目,功能完善而且易於二次開發,基本方案是將net-snmp裏面的代理功能嵌入到我們的程序中,然後在根據客戶需求添加私有MIB結點。代碼採用CGO編寫,即Go代碼調用net-snmp庫的形式。

方案架構:啓動一個獨立的代理線程處理外部snmp請求,代理線程執行net-snmp庫的代理入口(snmpd.c/SnmpDaemonMain()),net-snmp程序默認是讀取配置文件的方式來啓動,根據需求要能夠允許用戶通過web頁面進行配置,所以這裏採用的方案是主進程監聽web配置刷新事件,如果收到配置刷新的話,將配置更新到全局變量中,然後通過發送信號通知線程刷新配置,代理線程收到信號會進行相關的操作。這裏的操作需要對net-snmp庫代碼做一些修改,即增加一些API用於從共享變量中讀取數據。

功能開發:

  1. .添加私有MIB結點,採用的方式是靜態添加的方式,預編譯到庫中,使用mib2c工具生成MIB結點代碼框架然後根據業務需求編寫相應的結點回調處理函數,之後在代理的MIB初始化函數( init_mib_modules(); )中將我們私有結點的初始化函數添加進去。
  2. 動態端口,net-snmp代理線程啓動後默認是不能刷新端口的,除非線程退出重新執行。根據測試結果發現,線程重新執行會失敗,因爲某些靜態變量已經初始化的原因,這裏採取的方案是將net-snmp庫代碼做了些修改,如果刷新端口的話,僅僅釋放舊的資源而不是所有資源,然後根據新的配置重新創建資源( netsnmp_transport_open_server)即可
  3. 支持IPv6

待開發功能:

  1. trap功能,這一塊因爲客戶沒有需求,暫時沒做,不過根據未來產品發展來看,是有必要開發trap功能進行相關上報工作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章