メルコの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 <rukihena@rukihena.com> # 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 (<S>) { 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