自宅の光通信化により、新しいルータが入ったが、パケット流量測定の ための Munin プラグインを作成してみた。
ルータのデータ取得のため、ルータの「LAN状態」のページのHTMLを観察しながら、 Cookieによるセッションを扱いながらパケット流量のデータを取るPerlスクリプトを記述。 Perl でのセッションをまたがったデータ取得プログラムのいい練習になったかな。
ルータからは、Packets* と Bytes* が取得できるけど、 Bytes だと、Muninの測定周期5分で、簡単に 2^32 を超えちゃうようで、 使い物にならないみたい。BPS が直感的だから、Bytes...に変更したけど、 すぐに元に戻す。
#!/usr/bin/perl
#%# family=auto
#%# capabilities=autoconf
use LWP::UserAgent ;
use HTTP::Cookies ;
# ルータ情報
my $router = "http://192.168.1.254" ;
my $auth = [ 'name' => "userAdmin" ,
'pswd' => "xxxxxxxxxxxx" ] ;
# Munin のグラフ情報の設定用処理
if ( defined($ARGV[0]) and $ARGV[0] eq "config" ) {
# グラフの基本情報
print "graph_title FTTH GPON network statics\n" ;
print "graph_category network\n" ;
print "graph_vlabel packet/sec (-)send / (+)recv\n" ;
print "graph_args --base 1024\n" ;
print "graph_printf %4.1lf\n" ;
# LAN1..LAN4
for( my $i = 1 ; $i <= 4 ; $i++ ) {
foreach my $sr ( "Sent" , "Received" ) {
print "LAN$i$sr.label LAN$i pkt\n" ;
print "LAN$i$sr.type COUNTER\n" ;
if ( $sr eq "Sent" ) {
print "LAN$i$sr.graph no\n" ;
} else {
print "LAN$i$sr.draw LINE2\n" ;
print "LAN$i$sr.negative LAN${i}Sent\n" ;
}
print "LAN$i$sr.max 1000000\n" ;
}
}
exit 0 ;
}
# ルータに login
my $ua = LWP::UserAgent->new ;
my $cookie = new HTTP::Cookies() ;
$ua->cookie_jar( $cookie ) ;
my $res = $ua->post( "$router/login.cgi" , $auth ) ;
if ( $res->is_redirect ) {
# LAN情報を取得
$res = $ua->get( "$router/lan_status.cgi?lan" ) ;
my $flag = 0 ;
my $lan_id = 0 ;
foreach my $line( split( /\n/ , $res->content ) ) {
if ( $line =~ /^\s+var\s+lan_ether=/ ) {
# "var lan_ether="を探す
$flag = 1 ;
} elsif ( $flag && $line =~ /^(|,)(\d+):\{/ ) {
# LAN番号を取得
$lan_id = $2 ;
} elsif ( $flag && $line =~ /^Packets(Sent|Received):(\d+),$/ ) {
# PacketsSent / PacketsReceived
print "LAN$lan_id$1.value $2\n" ;
} elsif ( $flag && $line =~ /^;$/ ) {
last ;
}
}
}