etherswitchのMIBをFreeBSDに標準で入るbsnmpdで拾えるようにしてみました。
スクリプトによる拡張はsnmp_ucd.soが必要で、snmpd.configには以下を追加しました。
begemotSnmpdModulePath."ucd" = "/usr/local/lib/snmp_ucd.so"
%ucd
updateInterval = 500
extCheckInterval = 100
extUpdateInterval = 3000
extTimeout = 60
# Extension commands (extTable)
extNames.0 = "rtlswitch"
extCommand.0 = "/tmp/es.rb 0"
ターゲットはRTL8366SRで、mruby-etherswitch入りのmrubyでスクリプトは以下になります。
extCheckIntervalとextUpdateIntervalの関係はこの図のようになっています。
extCheckIntervalでチェックしてextUpdateInterval間隔で実際のコマンドを実行しています。次のupdateまでwalkへの問い合わせはこの値を返します。
#!/usr/local/bin/mruby
t = EtherSwitch.new(0)
port = ARGV[0].to_i
off = 0x1000 + port * 0x0040
t.writereg(off, 0)
v = t.readreg(0x11F0)
if v == 0 then
lo = t.readreg(off)
hi = t.readreg(off + 1)
val = hi << 16 | lo
else
val = 0
end
p val
walkしてみます。
% bsnmpwalk -s 10.0.1.3 .1.3.6.1.4.1.2021.8.1.101
1.3.6.1.4.1.2021.8.1.101.0 = 13929442
いつもの蟹さん仕様で、なにが拾えてるかは謎です。^ ^;
FreeBSDのetherswitchのRTL8366SRのサポートコードは私が作りました。
追記:
bsnmpwalkは-o quietを付けると値だけが出力されます。
snmp_mibII.soを利用するとinterfaceの情報が拾えるようになります。
bsnmpwalk -s 10.0.1.1 .1.3.6.1.2.1.2.2.1.16 | awk '{if(NR > 1){printf ","};printf $3}
この方法だと、PHYのMIBも拾おうとして、bsnmpdのエラーメッセージが複数でるようです。
Apr 4 10:51:00 snmpd[13473]: SIOCGIFDESCR (arswitch0port1): Device not configured
OIDを完全に指定して並べるのが良さそうです。
bsnmpwalk -s 10.0.1.1 .1.3.6.1.2.1.2.2.1.16.5 .1.3.6.1.2.1.2.2.1.16.6 .1.3.6.1.2.1.2.2.1.16.7 .1.3.6.1.2.1.2.2.1.16.8 | awk '{if(NR > 1){printf ","};printf $3}
これでもarswitch0port1のエラーメッセージだけは出てしまうようです。
しばらく動かしていたら数値がオーバーフローしてしまいました。なんらか対策が必要です。
bsnmpdは起動してないとtime outして、起動すぐだとデータが取れてなくて、空になるようです。
# bsnmpwalk -o quiet -s 10.0.1.24 .1.3.6.1.4.1.2021.8.1.101.0
bsnmpwalk: Snmp dialog: Operation timed out
# bsnmpwalk -o quiet -s 10.0.1.24 .1.3.6.1.4.1.2021.8.1.101.0
# bsnmpwalk -o quiet -s 10.0.1.24 .1.3.6.1.4.1.2021.8.1.101.0
0,1986,1768,4758,20039,8976
空の時には処理しないようにするのが良いです。
