ホーム » コンピュータ » Network » G-240W-B の Munin プラグイン

G-240W-B の Munin プラグイン

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