埋め込みPerlインタプリタの使用


序文

Stephen Daviesによって寄与されたコードにより、Nagiosは組み込みPerlインタプリタを有効にしてコンパイル出来るようになりました。Perlで書かれたプラグインに大きく依存している場合には興味深いものとなるでしょう。

Stanley Hopcroftはほんの少し組み込みPerlの作業をし、その使用による有利不利を書き記しました。また彼は適切に動作する組み込みPerlによる Perlプラグインの作成に関して、いくつかの役に立つヒントも与えました。このドキュメントの大部分は彼の解説によっています。

このドキュメントで"ePN"として使用されている単語は、embedded Perl Nagiosをさしています。それか、Nagios compiled with an embedded Perl interpreter のほうがよければこちらでもかまいません。

利点

ePN (embedded Perl Nagios)の有利な点には以下があります:

欠点

ePN (embedded Perl Nagios)の欠点はApacheのmod_perl (組込みインタープリター付きのApache) とそのままのApacheとを比較した場合とほぼ同じです。

対象となる読者

Perlプラグイン(ePNやそれ以外)を開発する時にすべき事

ePNのPerlプラグインを開発するのにしなければならない事

  1. <DATA> は使えません。;変わりにヒアドキュメントを使いなさい。例えばこんな感じ

    my $data = <<DATA;
    portmapper 100000
    portmap 100000
    sunrpc 100000
    rpcbind 100000
    rstatd 100001
    rstat 100001
    rup 100001
    ..
    DATA
    
    %prognum = map { my($a, $b) = split; ($a, $b) } split(/\n/, $data) ;
    
  2. BEGIN ブロックは予想通りに働きません。避けるのが最善です。

  3. コンパイル時にクリーンなことを確認しなさい。例えば



  4. グローバススコープで__variable__ データをサブルーチンで通す為にレキシカル変数(my)を使用するのは避けよう。 事実 もしサブルーチンがチェック時に一回以上プラグインに呼ばれるなら__fatal__ です。 そのようなサブルーチンはサブルーチンのその後の呼び出しにグローバルな最初のレキシカル値をロックする'閉鎖'として機能します。 しかしながら、グローバルが読み込み専用(例えば複雑な構造)なら問題ではありません。 Bekman が推奨する代替手段は, 以下に続く事柄です:


  5. あなたが詳細を得られるように意識して下さい。

    一般的な本(オライリーやダミアン・コンウェイの"オブジェクト指向Perl"など)から便利な情報を持たせましょう。しかし本当に大事な事は http://perl.apache.org/guide/にあるStas Bekmanのmod_perlガイドの良いテキストに記載されています。

    このすばらしい本サイズのドキュメントはNagiosに関しては何も記載されていませんが、Apacheで埋め込みPerlのプログラムを書く事について記載されています(例 Doug MacEachernsのmod_perlの項)。

    埋め込みperlのマニュアルはコンテキストと奨励が不可欠である。

    基本的にLincoln Stein と Doug MacEachern はPerlと埋め込みPerlに関して知っており、彼らの著書'Writing Apache Modules with Perl and C'は一見の価値があります。

  6. あなたのプラグインはePNによって変な値を返すかもしれない事に注意して下さい。 これは上の4番の項目で述べたのと似たような問題を引き起こす事になります。

  7. デバッグの準備:


    perl -MO::Deparse <あなたのプログラム>
  8. ePNがあなたのプラグインの何を変えているかを意識し、そしてすべての他の仕損じや変形しているバージョンをデバッグしてみて下さい。

    'Embed::<あなたのプラグインに関係する何とかいう名前%gt;'というパッケージ中に ある'hndlr'と呼ばれるサブルーチンとしてp1.plが書き直したプラグインを見る事ができます

    あなたのプラグインは@ARGVにあるコマンドライン引数を予測してp1.plもまた@_を@ARGVに渡します。

    これは'eval'する事でエラー(どんなパースエラーと実行エラー)を出力するなら返り値を得られ、 プラグインは投げ出されます。

    以下の出力はテストePNによって変形したcheck_rpcプラグインが実行される前にどのように働いているかの出力です。 (実際のプラグインのコードの殆どは見る事ができず、我々はePNがプラグインにもたらす変化にだけ着目します)。 わかりやすく、変更点は赤字で表してます:

    
                    package main;
                    use subs 'CORE::GLOBAL::exit';
                    sub CORE::GLOBAL::exit { die "ExitTrap: $_[0] 
    (Embed::check_5frpc)"; }
                    package Embed::check_5frpc; sub hndlr { shift(@_);
    @ARGV=@_;
    #! /usr/bin/perl -w
    #
    # check_rpc plugin for Nagios
    #
    # usage:
    #    check_rpc host service
    #
    # Check if an rpc serice is registered and running
    # using rpcinfo - $proto $host $prognum 2>&1 |";
    #
    # Use these hosts.cfg entries as examples
    #
    # command[check_nfs]=/some/path/libexec/check_rpc $HOSTADDRESS$ nfs
    # service[check_nfs]=NFS;24x7;3;5;5;unix-admin;60;24x7;1;1;1;;check_rpc
    #
    # initial version: 3 May 2000 by Truongchinh Nguyen and Karl DeBisschop
    # current status: $Revision: 1.5 $
    #
    # Copyright Notice: GPL
    #
    ... プラグインのコードの残りはここで(割愛します) ...
    }
    


  9. ePN環境においてプラグイン中で'use diagnostics'を使ってはいけません

    __全ての__PerlプラグインはCRITICALを返すと思います。

  10. Consider using a mini embedded Perl C program to check your plugin. ミニ埋め込みPerl Cプログラムをプラグインとして使う事を検討して下さい。 これはプラグインがePNでOKを返すのに十分に保証するわけではありませんが、 プラグインがこのテストに失敗すると確実にePNも失敗するでしょう。 [ Nagiosのcontribディレクトリに含まれるサンプルのミニePN Perlプラグインのテストに使えます。 contrib/ディレクトリに移り、'make mini_epn'とタイプする事でこれをコンパイルできます。 これはp1.plファイル(Nagiosの中に含まれています)がある場所と同じディレクトリで実行する必要があります。]

埋め込みPerlインタプリタ付きでNagiosをコンパイル

さて、一休みできますね。まだNagiosを埋め込みPerlインタプリタ付きでコンパイルしたいですか? ;-)

埋め込みPerlインタプリタ付きでNagiosをコンパイルしたいなら、 configureスクリプトに--enable-embedded-perlオプションをつけて再実行する必要があります。 埋め込みPerlインタプリタに内部コンパイルキャッシュをさせたいなら、 --with-perlcacheオプションを同様につける必要があります。例:

	./configure --enable-embedded-perl --with-perlcache ...他のオプション...

一旦あたらしいオプションをつけてconfigureスクリプトを再実行したら、Nagiosを再コンパイルしてください。 Nagiosが埋め込みPerlインタプリタ付きでコンパイルされた事を確認する為、コマンドラインから-mオプション をつけて実行して確認できます。 コマンドラインで実行した出力から以下のような出力が得られます (埋め込みPerlインタプリタはオプション部分にリストされる事に注意して下さい):

	[nagios@firestore ]# ./nagios -m

	Nagios 1.0a0
	Copyright (c) 1999-2001 Ethan Galstad (nagios@nagios.org)
	Last Modified: 07-03-2001
	License: GPL

	External Data I/O
	-----------------
	Object Data:      DEFAULT
	Status Data:      DEFAULT
	Retention Data:   DEFAULT
	Comment Data:     DEFAULT
	Downtime Data:    DEFAULT
	Performance Data: DEFAULT


	Options
	-------
	* Embedded Perl compiler (With caching)