職場で使っているYAMAHA RT57iというルーターでVPNの動作が不安定というか、速度が速い時と遅い時があるという話になった。そこでルーターの転送速度というかパケットの状態を監視したいなと言うことになった。
調べてみたら、TELNETでRT57iに入り、状態を表示するコマンドをPerlスクリプトを使って定期的に行い情報を収集、それをMRTGでグラフ表示する方法がみつかった。
こちらを参考にさせてもらいながら行うことにした。
MRTGはCentOS5.2で動いているDELLのT105というサーバーで行うことにした。
まず、MRTGをインストールすることからはじめた。
# yum install mrtg
設定ファイルは、/etc/mrtg.mrtg.cfgとなるみたいだ。
実行ファイル本体はwhichコマンドでありかを調べられる。
# which mrtg
/usr/bin/mrtg
上記サイトを参考にさせていただき、rt57i.plを作成し/etc/mrtg/に配置する。
/etc/mrtg/mrtg.cfgは下記のようにした。
# Minimal mrtg.cfg
#——————–HtmlDir: /var/www/html/mrtg
ImageDir: /var/www/html/mrtg
LogDir: /var/lib/mrtg
ThreshDir: /var/lib/mrtg
#Target[r1]: 2:public@myrouter.somplace.edu
#MaxBytes[r1]: 1250000
#Title[r1]: Traffic Analysis
#PageTop[r1]:
<h1>Stats for our Ethernet</h1>## RT57i ##
Target[rt57i]: `/etc/mrtg/rt57i.pl`
MaxBytes[rt57i]: 1000000
Title[rt57i]: Traffic Analysis for RT57i
Options[rt57i]: growright, integer
kilo[rt57i]: 1024
YLegend[rt57i]: Byte/sec
ShortLegend[rt57i]: byte/sec
LegendI[rt57i]: 受信
LegendO[rt57i]: 送信
PageTop[rt57i]:
<h1>YAMAHA RT57i</h1>
早速実行してみたがエラー続出・・・
まず、Perlのライブラリが無かったみたい。CPANでインストール
# cpan
cpan> install Net::Telnet
次もやっぱり・・
Wednesday, 8 July 2009 at 11:31: ERROR: Target[rt57i][_IN_] ' $target->[0]{$mode} ' did not eval into defined data
Wednesday, 8 July 2009 at 11:31: ERROR: Target[rt57i][_OUT_] ' $target->[0]{$mode} ' did not eval into defined data
なんだかんだ不具合をつぶしていく。
env LANG=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg
エラーが出なくなり、Apacheの公開ディレクトリにhtmlとpngファイルが生成された。
しかし、値がゼロらしくなんにもグラフに出てこない。
/var/lib/mrtg/rt57i.log を確認してみると中がゼロばかりだ・・・ルーターのパケット量が取れてない。
仕方ないのでPerlスクリプトの方を調べてみる。結局は「転送バイト数を取得する」部分に不備?があったので下記のように修正した。
# ルーターの名前
$routername = 'router';
# ルーターのパスワード
$passwd = 'himitsupass';
# ———————————————————————-
# これ以降の部分はいじらないこと。
$prompt = '/>\s+/';
use Net::Telnet ();
$t = new Net::Telnet;
# RTA50iにログインする
# いきなりPassword:プロンプトが出るので、標準のlogin()メソッドが使えない$t->open($routername);
$t->waitfor('/assword: $/');
$t->print($passwd);
$t->waitfor($prompt);
# プロンプトをセットする
$t->prompt($prompt);# 表示を英語モードに設定
$t->cmd("console character ascii");# 転送バイト数を取得する
@lines = $t->cmd("show status lan2");
foreach (@lines) {
if (/^Received:/) { # 受信バイト数
/(\d+) octets/;# [2000/3/21] 変更
$recv = $1;
}
if (/^Transmitted:/) { # 送信バイト数
/(\d+) octets/;# [2000/3/21] 変更
$trans = $1;
}
}# uptimeを取得する
@lines = $t->cmd("show environment");
foreach (@lines) {
if (/Elapsed time from boot: (.+)/) {
$uptime = $1;
last;
}
}# 結果を出力する
print $recv, "\n";
print $trans, "\n";
print $uptime, "\n";
print $routername, "\n";
上の黄色いマーカー部分は、下記の記述ではパターンマッチングがだめだったので直した。
/\[(\d+) octets?]/;
正規表現は苦手である・・・・


コメント
はじめまして。RT58i のユーザです。時々、RT58iが再起動するため困っていまして、MRTG で稼働時間、メモリ使用量、トラフィックの監視を自動化したいと思っていました。SSH で接続出来るよう Net::SSH::Expect で書きなおして見ました。
「いきなりPassword:プロンプトが出るので、標準のlogin()メソッドが使えない」が大変参考になりました。
ありがとうございました。
今は手元にYAMAHAルーターも無くてすっかり忘れちゃってますが、Telnet接続した直後のPassword入力要求はなんとなく覚えてますね。この時点でもTelnetはあかんやろと思いつつ、LAN内部だからいいかな?と妥協したのをなんとなく覚えてます(w