さて、サーバやネットワークの情報を得るために
SNMP(Simple Network Management Protocol)
を使うことがあります。
それぞれの機器には
MIB(Management Information Base)
が決められており
それを参照することで、機器を監視できます。
高価な業務用ルータではSNMPが使えるのですが、僕の持っている
ヤマハ RT58i
では使えません。。。(57も)
1)ルータの情報を取得する
「show environment」でCPUとメモリの使用%を取ってきます。
#!/usr/bin/python import sys import telnetlib import re HOST = "ルータアドレス" PASSWORD = "パスワード" NAME = "名前" tn = telnetlib.Telnet(HOST) tn.read_until("Password: ") tn.write(PASSWORD + "n") tn.write("console character asciin") tn.write("show status pp 1n") tn.write("show environmentn") tn.write("exitn") buf = tn.read_all() print re.search(r".*Load: (.+)%", buf).group(1) print re.search(r".*Memory: (.+)%", buf).group(1) print re.search(r"Elapsed time from boot: (.+)", buf).group(1) print NAME
「mrtg.cfg」に以下を追記
### RT58i Info #### Target[rtinfo]: `スクリプトのパス` Unscaled[rtinfo]: dwmy MaxBytes1[rtinfo]: 100 MaxBytes2[rtinfo]: 100 kilo[rtinfo]: 1000 Options[rtinfo]: gauge, growright, noinfo, nopercent YLegend[rtinfo]: CPU G% Mem B% ShortLegend[rtinfo]: % LegendI[rtinfo]: CPU LegendO[rtinfo]: Mem Legend1[rtinfo]: CPU Legend2[rtinfo]: Mem Title[rtinfo]: System Analysis for ROUTER PageTop[rtinfo]: <H1>ルータ情報</H1>
「option」に「gauge」を設定し、値そのままを使うようにする。
2)WANトラフィックを監視する
「show status pp 1」でWAN側のトラフィックを取得します。
この時、値が「オクテット」なので注意。
#!/usr/bin/python import sys import telnetlib import re HOST = "ルータアドレス" PASSWORD = "パスワード" NAME = "名前" tn = telnetlib.Telnet(HOST) tn.read_until("Password: ") tn.write(PASSWORD + "n") tn.write("console character asciin") tn.write("show status pp 1n") tn.write("show environmentn") tn.write("exitn") buf = tn.read_all() print re.search(r"Received:.*[(d*) octet.*", buf).group(1) print re.search(r"Transmitted:.*[(d*) octet.*", buf).group(1) print re.search(r"Elapsed time from boot: (.+)", buf).group(1) print NAME
「mrtg.cfg」に以下を追記
## RT58i #### Target[rt58i]: `スクリプトのパス` Unscaled[rt58i]: dwmy MaxBytes[rt58i]: 12500000 Options[rt58i]: bits, growright, noinfo, nopercent, kilo[rt58i]: 1024 YLegend[rt58i]: bit per second ShortLegend[rt58i]: b/s Legend1[rt58i]: 受信 Legend2[rt58i]: 送信 LegendI[rt58i]: 受信 LegendO[rt58i]: 送信 Title[rt58i]: Traffic Analysis for ROUTER (WAN) PageTop[rt58i]: <h1>WANトラフィック</h1>
「Option」で「bits」を指定し、オクテットからビットへ変換(8倍)
このままではスケールまで8倍されるので、「MaxBytes」を「12500000」にする。
「kilo[rt58i]: 1024」で1キロを1024と指定する。
3)NATテーブル数を監視する
「show nat descriptor address」で使用NATテーブル数を取得します。
ちなみにRT58iのNATテーブル数は4096個です。
#!/usr/bin/python import sys import telnetlib import re HOST = "ルータアドレス" PASSWORD = "パスワード" NAME = "名前" tn = telnetlib.Telnet(HOST) tn.read_until("Password: ") tn.write(PASSWORD + "n") tn.write("console character asciin") tn.write("show nat descriptor addressn") tn.write("show environmentn") tn.write("exitn") buf = tn.read_all() print re.search(r" Port range: 60000-64095 (.+)used.", buf).group(1) print 0 print re.search(r"Elapsed time from boot: (.+)", buf).group(1) print NAME
使っているNATテーブル数だけ取得出来れば良かったので、
「print 0」としてあります。
「mrtg.cfg」に以下を追記
## RT58i NAT#### Target[rtnat]: `スクリプトのパス` MaxBytes[rtnat]: 4096 Options[rtnat]: withzeroes, gauge, growright, noinfo, integer YLegend[rtnat]: /4096 uesd ShortLegend[rtnat]: 個使用 Legend1[rtnat]: NATテーブル数 Legend2[rtnat]: LegendI[rtnat]: NATテーブル数 LegendO[rtnat]: Title[rtnat]: Nat Analysis for ROUTER PageTop[rtnat]: <h1>NATテーブル数</h1>
「Options」に「withzeroes」として0(ゼロ)も扱うようにし、
「gauge」で値そのままを使うようにする。
また、「integer」で整数のみ扱う。
[tegaki]動くから見てて楽しいよw[/tegaki]