小弟以Getif 讀取OpenWrt 的Parameters, 奇怪竟然會沒顯示系統資訊, 以Packetyzer 檢查, 起先完全看不懂錯誤訊息所代表的意義:
Error Status: NO SUCH NAME (2)
Error Index: 7
Object identifier 1: 1.3.6.1.2.1.1.1.0 (SNMPv2-MIB::sysDescr.0)
Value: NULL
Object identifier 2: 1.3.6.1.2.1.1.2.0 (SNMPv2-MIB::sysObjectID.0)
...(43)
Object identifier 7: 1.3.6.1.2.1.1.7.0 (SNMPv2-MIB::sysServices.0)
可是執行snmpwalk 可以顯示很多訊息啊! 再比對snmpget 和snmpgetnext 的輸出, 差一點還讓小弟誤以為OpenWrt 的snmpd 套件不支援PDU type: GET (0):
C:\usr\bin>snmpget -v1 -Cf -c public 192.168.1.254 system.sysUpTime system.sysContact.0
Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
Failed object: SNMPv2-MIB::sysUpTime
C:\usr\bin>snmpgetnext -v1 -Cf -c public 192.168.1.254 system.sysUpTime system.sysContact.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (114090) 0:19:00.90
SNMPv2-MIB::sysName.0 = STRING: HeartOfGold
沒辦法只好開始翻閱文件, 從 "Manpage of SNMPGET (http://net-snmp.sourceforge.net/docs/man/snmpget.html)" 看到 "Manpage of SNMPCMD (http://net-snmp.sourceforge.net/docs/man/snmpcmd.html)", 最後在 "Manpage of SNMPD.CONF (http://net-snmp.sourceforge.net/docs/man/snmpd.conf.html#lbAO) - System Group" 一節, 比對小弟照抄 "/packages/net/net-snmp/files/snmpd.conf – OpenWrt (https://dev.openwrt.org/browser/packages/net/net-snmp/files/snmpd.conf)" 的部份, 還是看不出問題為何, 但看了這三篇和先前所看過的 "Manpage of SNMPWALK (http://net-snmp.sourceforge.net/docs/man/snmpwalk.html)" 和 "Manpage of SNMPGETNEXT (http://net-snmp.sourceforge.net/docs/man/snmpgetnext.html)" 之後, 所謂 "臨陣磨槍, 不亮也光", 終於讓小弟有能力回頭檢視snmpget 錯誤訊息所代表的意義, 既然snmpget 會單獨挑出錯誤之處, 那麼Packetyzer 應該也會顯示才對啊! 於是再仔細研究封包內容, 是否 "Error Index: 7" 代表 "第七個什麼東東" 有問題呢? 既然不知道答案為何, 那就把Getif 所送出的封包拆解成多個snmpget 指令, 最後才確定 "sysServices.0" 有問題, 這也正是Getif 所詢問的 "第七個" 參數, 接著檢視/etc/conf/snmpd:
config system
option sysLocation 'office'
option sysContact '
[email protected]'
option sysName 'HeartOfGold'
# option sysServices 72
option sysDescr 'adult playground'
# option sysObjectID '1.2.3.4'
看起來很正常, 再檢查/etc/init.d/snmpd:
snmpd_system_add() {
local cfg="$1"
config_get syslocation "$cfg" sysLocation
[ -n "$syslocation" ] && echo "sysLocation $syslocation" >> $RUN_C
config_get syscontact "$cfg" sysContact
[ -n "$syscontact" ] && echo "sysContact $syscontact" >> $RUN_C
config_get sysname "$cfg" sysName
[ -n "$sysname" ] && echo "sysName $sysname" >> $RUN_C
config_get sysservice "$cfg" sysService
[ -n "$sysservice" ] && echo "sysService $sysservice" >> $RUN_C
config_get sysdescr "$cfg" sysDescr
[ -n "$sysdescr" ] && echo "sysDescr $sysdescr" >> $RUN_C
config_get sysobjectid "$cfg" sysObjectID
[ -n "$sysobjectid" ] && echo "sysObjectID $sysobjectid" >> $RUN_C
這才發現 "$sysservice" 和 "sysService" 好像都少了 "s", 補上之後, 重新執行:
/etc/init.d/snmpd restart
然後檢查/etc/snmp/snmpd.conf:
sysServices 72
終於有 "小s" 了! 再執行:
C:\usr\bin>snmpget -v1 -Cf -c public 192.168.1.254 sysServices.0
SNMPv2-MIB::sysServices.0 = INTEGER: 72
沒有錯誤訊息, 再以Getif 讀取OpenWrt 的Parameters, 至此總算完全正確
OpenWrt / Typo in /packages/net/net-snmp/files/snmpd.init (https://forum.openwrt.org/viewtopic.php?id=26678)