◆今度は Perl の Munin プラグインです。
Munin のプラグインは、シェルスクリプトだけではなく、様々な言語を利用することが出来ます。今日は Perl で書いたプラグインをご紹介。
プラグイン名称は「kobo_counter」。名前からお察しのように、国内大手電子出版プラットフォームの、日本語書籍数をカウントするものです。画面のデモは、こちらのページからご覧いただけます。
しくみは、LWP::Simple モジュールを使用しています。プラグイン本体である perl スクリプトそのものが、サイトから HTML 文を取得します。そして、文中の書籍数だけを抽出・加工し、Munin に引き渡す動作を行います。
このプラグインがあれば、日本語書籍数の推移を自分で確認することが出来ます。
中身は、次の通りです。
#!/usr/bin/perl # Munin plugin - kobo counter # The MIT License # Sep 27, 2012 ver 0.01 created by Masahito Zembutsu <zem@pocketstudio.jp> use LWP::Simple; if ($ARGV[0]) { &print_config if ($ARGV[0] eq "config"); } else { &main; } exit; sub print_config { print "graph_args -r --lower-limit 0","\n"; print "graph_title kobo store's counter","\n"; print "graph_category kobo","\n"; print "graph_info How many books does this store?","\n"; print 'graph_vlabel books',"\n"; print "Total.label Total number of books","\n"; print "Total.draw AREA","\n"; print "Total.type GAUGE","\n"; return; } sub main { my $url = 'http://kobo.rakuten.co.jp/'; my $html = get $url; my $count = 0; if ($html =~ m#(<big>)(.*)(</big>)#) { $count = $2; $count =~ s/,//g; } print "Total.value $count\n"; return; } 1;
こちらは Perl を書かれている方であれば、お分かりかと思いますが、基本的に構造はシンプルです。処理の流れは、先日公開したシェルスクリプトによるプラグインと殆ど同じです。引数に “config”があれば、グラフの定義情報を返します。何も引数がなければ、書籍数を返すものです。
では、今回も上から順に見ていきましょう。
#!/usr/bin/perl
普通に Perl なシバン行。
# Munin plugin - kobo counter # The MIT License # Sep 27, 2012 ver 0.01 created by Masahito Zembutsu <zem@pocketstudio.jp>
コメントとクレジット。
use LWP::Simple;
ここで Perl のモジュール LWP::Simple を用いることを宣言。
if ($ARGV[0]) { &print_config if ($ARGV[0] eq "config"); } else { &main; } exit;
そして、引数の有無のチェックを行います。引数があり、かつ “config” の文字列であれば、サブルーチン print_config に処理を引き渡します。そうでなければ、サブルーチン main に処理が移ります。
sub print_config { print "graph_args -r --lower-limit 0","\n"; print "graph_title kobo store's counter","\n"; print "graph_category kobo","\n"; print "graph_info How many books does this store?","\n"; print 'graph_vlabel books',"\n"; print "Total.label Total number of books","\n"; print "Total.draw AREA","\n"; print "Total.type GAUGE","\n"; return; }
サブルーチン print_config は、RRDTool のグラフに引き渡す定義情報です。グラフの件名や軸ラベル、Munin 上のカテゴリを等を指定しています。
では、次に main を見ていきましょう。
sub main { my $url = 'http://kobo.rakuten.co.jp/'; my $html = get $url; my $count = 0;
ここは変数を初期化しています。$url が電子書籍ストアの URL です。そして、その次の【 get $url 】で対象 URL のページ情報を取得し、HTML データを、変数 $html に格納しています。$count は、書籍の冊数です。
if ($html =~ m#(<big>)(.*)(</big>)#) { $count = $2; $count =~ s/,//g; }
そして、変数 $html に含まれるものから <big>~</big> で囲まれている箇所を抽出します。このタグで囲まれてるところに冊数が記述されているからです。そして、冊数には , がありますが、不要なので削ります。
print "Total.value $count\n"; return; }
そして、最後は Munin に「Total.value xxx」という形式でデータを返します。
1;
これは Perl の末尾に記述します。サブルーチンで処理におかしなトコロがあれば、エラーとして表示されるようにするためです。
では、実際にこのプラグインを使いたいときは、以下の手順でお試し下さい。
# vi /usr/share/munin/plugins/kobo_counter # chmod 755 /usr/share/munin/plugins/kobo_counter # ln -s /usr/share/munin/plugins/kobo_counter /etc/munin/plugins # /etc/init.d/munin-node restart
今回の例では、対象の数値前後に分かりやすいタグがあったため、正規表現によって比較的簡単に抽出することが出来ました。もし複雑な構文の場合は HTML::TokeParser モジュールを使った解析がオススメです。