RT58iでSNMPっぽいことをする

さて、サーバやネットワークの情報を得るために
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]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Enter code * Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.