メルコのAirStationとMRTG
MRTGは便利だ。管理オタクにはたまらないデータを収集・表示してくれる。ここではMRTGについて既に知っている方を前提として書く。
MRTG を使い出すと、なんでもトラフィックを計測したくなる。
計測対象がSNMPに対応していれば楽々設定できるが、そうでない場合はたいていあきらめてしまう。
しかし、MRTGには裏口(?)が用意されていて、なんとかして数字を取り出せればMRTGで管理可能だ。
裏口からなんとかしたもので有名(?)なものに YAMAHA のダイアルアップルータ RTA-50i のトラフィックを計測するものがある。
RTA50i(NetVolante)のトラフィックをMRTGで表示する
これは Perl から telnet してコマンド打ってトラフィックデータを得る。
カイシャに メルコの AirStation (WLA-L11) があるのだが、これのトラフィックを計測したい。しかし SNMP に対応していない。
管理は Web ベースなので telnet も使えない。どうしよう。と悩んだところ、答えは簡単に見つかった。HTTP で必要な情報をゲットすればよいのだ。
管理ページには、通信した総パケット数を表示するものがある。そのページにスクリプトからアクセスすればトラフィックが得られる。
しかし、残念なことにバイト数じゃなくてパケット数なのだ。小さいパケットも、大きなパケットも、1つなら1しかカウントしない。
まあ、これはどうしょうも無い。
HTTP を楽々つかえる Perl モジュールもあるが、パスワードの送信などがよく分からなかったので、生ソケットを使うことにした。
認証のデータのエンコード方法(?)がよく分からなかったので、
パケットキャプチャしてエンコード済みの認証データを得て、それを設定するようにした。
ここは改善しなければならないだろう
使用例
というわけで、スクリプトは以下のとおり。ファームウェアのバージョン 2.03 でしかテストしていません。
at your own risk でお使いください。
ところで、無線LANカード、機種によって性能が明らかに違う。
黄色い箱のヤツを買ったらカイシャの自席で使えない。
しかし、メルコの WLA-PCM-L11 なら使える。
これは転送速度がチラチラ変わるのだが、ほぼ確実に使える。
WinAmp でファイルサーバのxxxを再生してても全然問題ない。
一晩再生しっぱなしでも大丈夫だった。
ただ、これはカイシャの偉い人用のものだ。自分のもメルコにしたい!と思って買いなおした。
でも WLA-PCM-S11。安いほうのだ。
これは WEP が 40bit であることや、チップセットが Lusent じゃなくて prism であることなどが L11 と違うところ。
しかし、これも使えない!
黄色い箱のヤツも S11 も、転送速度が 11M のまま、リンクが切れる。遅い速度を試そうとしない。S11 はごくたまに 5.5M になったりするが、やはりバシバシ切れることには変わりない。
黄色い箱のヤツも prism だ。prism はダメなのか。
prism は カードでOEM供給する Lusent と違ってチップセットで供給される。
無線LANカードメーカにも設計の余地がある。
その余地の部分に問題があるのだろうか。詳細は不明。
#!/usr/bin/perl
# getstat-wlal11 -- Get statistic information for 'mrtg' from WLA-L11.
# Copyright (C) 2001 by rukihena
# You may redistribute and/or modify this file under the terms of
# the GNU General Public Licence as published by the Free Software
# Foundation.
# NO WARRANTY
# 2001/5/15 rukihena
# 新規
# アクセスポイントの名前
$hostname = '192.168.0.1';
# アクセスポイントのパスワード
#$passwd = 'hogehoge';
# Basic 認証のなにか
$authorization = 'hogehogehoge';
# ちゃんと変換しなきゃなぁ
# ----------------------------------------------------------------------
# これ以降の部分はいじらないこと。
$username = 'root';
$appath = '/diag/packet.cgi';
$addr = (gethostbyname($hostname))[4];
$name = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name);
binmode(S);
select(S); $| = 1; select(stdout);
print S "GET $appath HTTP/1.0\r\n";
print S "Accept: */*\r\n";
#print S "Accept-Language: ja\r\n";
#print S "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)\r\n";
#print S "Host: $hostname\r\n";
print S "Authorization: Basic $authorization\r\n";
print S "\r\n";
$i=0;
while () {
if ( $i == 50 ) {
# 有線 送信 パケット
$wsp = getnum($_);
}
elsif ( $i == 54 ) {
# 有線 送信 エラーパケット
$wse = getnum($_);
}
elsif ( $i == 59 ) {
# 有線 受信 パケット
$wrp = getnum($_);
}
elsif ( $i == 63 ) {
# 有線 受信 エラーパケット
$wre = getnum($_);
}
elsif ( $i == 79 ) {
# 無線 送信 パケット
$asp = getnum($_);
}
elsif ( $i == 83 ) {
# 無線 送信 エラーパケット
$ase = getnum($_);
}
elsif ( $i == 88 ) {
# 無線 受信 パケット
$arp = getnum($_);
}
elsif ( $i == 92 ) {
# 無線 受信 エラーパケット
$are = getnum($_);
}
$i++;
}
close(S);
#print "$wsp\n";
#print "$wrp\n";
print "$arp\n";
print "$asp\n";
print "\n";
print "$hostname\n";
exit(0);
sub getnum()
{
my $line = shift @_;
$dat = substr($line,44);
$dat = substr($dat,0,length($dat)-15);
return $dat;
}
FAQ
Q1. 数字が小さくてなんか変なのですが。
A1. パケット数なのでそうゆうものです。
Q2. パスワードの設定がなんだか全然分かりません。
A2. 次期バージョンで分かりやすくするかもしれません。
Q3. MRTGの使い方が分かりません。
A3. 私もよく分かりません。本家サイトでどうにかしてください。
Q4. インストール方法がわかりません。
A4. 1時間壱萬円と、別途交通費をいただければインストールしに伺います。移動時間も工数に含みます。
webmaster@rukihena.com