◆今度は 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 モジュールを使った解析がオススメです。