自宅の光通信化により、新しいルータが入ったが、パケット流量測定の ための 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 ; } } }