ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Directory Server Enterprise Edition開発者ガイド
11g リリース1 (11.1.1.7.0)
B72440-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

3 Directory Serverプラグインのスタート・ガイド

この章では、Directory Serverプラグインの作成について説明します。この章ではまた、サーバーでプラグインを使用できるようにする方法およびログ・エントリの生成方法についても説明します。

以前のリリースのDirectory Server用に開発されたプラグインをメンテナンスする場合、変更内容は、第2章「Directory Server 5.2以上のプラグインAPIへの変更」を参照してください。

この章の内容は、次のとおりです。

3.1 Hello Worldプラグイン

この項では、有名なメッセージをログに記録するプラグインについて説明します。この項に示されているプロセスに従うと、この章で説明される概念を理解できます。

3.1.1 コードの場所

ディレクトリ・ホストのinstall-path/examples/ディレクトリを確認してください。この項で説明されるサンプル・コードはhello.cです。

3.1.2 プラグインの確認

次の例では、Directory Serverの起動時にHello, World!がログに記録されます。

例3-1 Hello, World!プラグイン(hello.c)

#include "slapi-plugin.h"

Slapi_PluginDesc desc = { 
    "Hello, World",                    /* plug-in identifier      */
    "Oracle Corporation (test)",       /* vendor name             */
    "11.1.1.3.0",                      /* plug-in revision number */
    "My first plug-in"                 /* plug-in description     */
};

/* Log a greeting at server startup if info logging is on for plug-ins */
int
hello()
{
    slapi_log_info_ex(
        SLAPI_LOG_INFO_AREA_PLUGIN,    /* Log if info logging is  */
        SLAPI_LOG_INFO_LEVEL_DEFAULT,  /* set for plug-ins.       */
        SLAPI_LOG_NO_MSGID,            /* No client at startup    */
        SLAPI_LOG_NO_CONNID,           /* No conn.  at startup    */
        SLAPI_LOG_NO_OPID,             /* No op.    at startup    */
        "hello() in My first plug-in", /* Origin of this message  */
        "Hello, World!\n"              /* Informational message   */
    );
    return 0;
}

/* Register the plug-in with the server */
#ifdef _WIN32
__declspec(dllexport)
#endif
int
hello_init(Slapi_PBlock * pb)
{
    int rc = 0;                        /* 0 means success         */
    rc |= slapi_pblock_set(            /* Plug-in API version     */
        pb,
        SLAPI_PLUGIN_VERSION,
        SLAPI_PLUGIN_CURRENT_VERSION
    );
    rc |= slapi_pblock_set(            /* Plug-in description     */
        pb,
        SLAPI_PLUGIN_DESCRIPTION,
        (void *) &desc;
    );
    rc |= slapi_pblock_set(            /* Startup function        */
        pb,
        SLAPI_PLUGIN_START_FN,
        (void *) hello
    );
    return rc;
}

メッセージをログに記録するために、プラグインにはDirectory Serverの起動時にコールされる関数が含まれています。プラグインには、プラグインの説明、サポートされているAPIのバージョンおよび起動関数をDirectory Serverに登録するための初期化関数も含まれています。

起動関数では、メッセージがプラグインから取得されることが指定されています(SLAPI_LOG_INFO_AREA_PLUGIN)。また、起動関数では情報ロギングがアクティブ化されている場合はメッセージをログに記録する必要があることも指定されています(SLAPI_LOG_INFO_LEVEL_DEFAULT)。このログ・メッセージには、クライアント接続情報は示されません(SLAPI_LOG_NO_MSGIDSLAPI_LOG_NO_CONNIDおよびSLAPI_LOG_NO_OPID)。Directory Serverでは、起動時、クライアントが接続される前に、この関数をコールします。関数では、ログ・メッセージがどこで発生したかが指定されています("hello() in My first plug-in")。最後に、関数によって、有名なログ・メッセージが出力されます。

初期化関数の名前はhello_init()です。この関数では、関数slapi_pblock_set()を使用して、パラメータ・ブロックpbを変更します。この関数では、このようにして、サポートされるプラグインAPIバージョン、プラグインの説明、およびこのプラグインによってDirectory Serverに提供される関数を登録します。すべてのプラグイン初期化関数で必要であるように、hello_init()では成功時に0を戻し、失敗時に-1を戻します。関数slapi_pblock_set ()では、成功時に0を戻し、それ以外の場合は-1を戻します。したがって、Hello Worldプラグインでは、リターン・コードを明示的に-1に設定する必要はありません。

3.1.3 プラグインの構築

使用しているプラットフォームに応じて、共有オブジェクト(libtest-plugin.soまたはlibtest-plugin.sl)または動的リンク・ライブラリ(testplugin.dll)としてプラグインを構築します。Solaris SPARCシステムでは、次のようにします。

$ gmake -f Makefile

64ビット・カーネルをブートするSolaris x64システムでは、次のようにします。

$ gmake -f Makefile64

MakefileまたはMakefile64install-path/examples/で使用して、コードをコンパイルしてリンクします。このファイルにより、すべてのサンプル・プラグインが同じライブラリに構築されてリンクされます。64ビットのDirectory Serverインスタンスで使用するようにプラグインを構築する場合の詳細は、「プラグイン・ライブラリの検索」を参照してください。

3.1.4 プラグインのプラグイン

dsconfコマンドを使用して、プラグインに関する情報をサーバー構成に追加します。

3.1.4.1 Directory Server構成の更新

プラグイン・メッセージをログに記録するようにサーバーを構成します。

$ dsconf set-log-prop -h localhost -p 1389 error level:err-plugins

プラグインをロードするようにサーバーを構成します。

$ dsconf create-plugin -h localhost -p 1389 \
 -H lib-path -F hello_init -Y object "Hello World"
$ dsconf set-plugin-prop "Hello World" feature:"Hello, World" version:11.1.1.3.0 
 vendor:"Oracle Corporation (test)" desc:"My first plug-in"
$ dsconf enable-plugin -h localhost -p 1389 "Hello World"
Directory Server needs to be restarted for changes to take effect

ここで、lib-pathはプラグイン・ライブラリの絶対パス(/local/myplugins/examples/libtest-plugin.soなど)に対応している必要があります。Directory Serverでは、相対パスではなく、絶対パスが必要です。64ビット・システムでlib-pathを設定する場合は、その前に、「プラグイン・ライブラリの検索」をお読みください。


注意:

Directory Serverに付属のプラグインには、ds-pluginSignature属性値として格納されるシグネチャが含まれています。また、プラグインにはダイジェストも含まれ、これはds-pluginDigest属性値として格納されます。これらの値により、Directory Serverに付属のプラグインをカスタム・プラグインと区別できます。


3.1.4.2 Directory Serverの再起動

Directory Server構成を変更した後は、サーバーでプラグインを登録するために、Directory Serverを再起動する必要があります。dsadmコマンドを使用します。

たとえば、/local/ds/内のサーバー・インスタンスを再起動するには、次のように入力します。

$ dsadm restart /local/ds
Waiting for server to stop...
Server stopped
Server started: pid=4362

3.1.4.3 ログの確認

Directory Serverが起動した後、エラー・ログinstance-path/logs/errorsHello, World!を検索します。次の行のようなエントリを探します(印刷ページ用に折り返されています)。

[02/Jan/2006:16:56:07 +0100] - INFORMATION - 
 hello() in My first plug-in - conn=-1 op=-1 msgId=-1 -  Hello, World!

ここで、不要なメッセージが記録されないように、ログ・レベルをデフォルトにリセットします。

$ dsconf set-log-prop -h localhost -p 1389 error level:default

3.2 Directory Serverプラグインの作成

この項では、Directory Serverプラグインのコード化の基本について説明します。この項では、主なタスクについて説明します。これらのタスクには、ヘッダー・ファイルの指定、初期化関数の作成、パラメータ・ブロック値の設定およびプラグイン関数の登録などがあります。

3.2.1 slapi-plugin.hヘッダー・ファイルの組込み

プラグインAPIはinstall-path/include/slapi-plugin.hで定義されます。ヘッダー・ファイルに、標準および拡張LDAP C APIのエントリ・ポイントであるldap.hおよびDirectory Serverによって使用されるエラー・メッセージ識別子のリストであるldap_msg.hが含まれていることを確認します。

一般的に、Directory Serverによって公開されるインタフェースはinstall-path/include/で指定されます。APIの特定の機能の詳細は、「プラグインAPIリファレンス」を参照してください。

APIを使用するには、プラグイン・ソースの宣言セクションにslapi-plugin.hを含めます。

#include "slapi-plugin.h"

通常、Makefileまたはプロジェクト・ファイルで適切なマクロを使用して、install-path/include/でヘッダー・ファイルを検索するようにリンカーに指示します。

3.2.2 プラグイン関数の作成

Directory Serverでは、Directory Server操作のコンテキスト内(たとえば、バインド、追加、検索、変更または削除の実行時)でプラグイン関数をコールします。これらの関数はエクスポートしないでください。関数は、起動時にDirectory Serverに登録されると、適切な範囲で使用できるようになります。このドキュメントでは、そのような関数の作成方法について説明します。

プラグイン関数のプロトタイプは、ローカルで使用されるその他の関数のプロトタイプと同様です。数多くのプラグイン関数にパラメータ・ブロックが渡されます。

int prebind_auth(Slapi_PBlock * pb); /* External authentication. */

Directory Serverに登録されていない追加のヘルパー関数も使用できます。このドキュメントでは追加のヘルパー関数については説明しませんが、製品に付属のサンプル・プラグインの一部にそのような関数が含まれています。

3.2.3 適切なリターン・コードの使用

一般的に、プラグイン関数が正常に完了した場合は、0を戻すようにします。一致を検索する一部の関数では、0は一致が見つかったことを意味し、-1は一致が見つからなかったことを意味します。事前操作関数の場合、0は、Directory Serverで操作の処理を続行する必要があることを意味します。事前操作関数の完了後に、サーバーで操作の処理が停止されるようにする場合は、1などの正数を戻します。

プラグイン関数が正常に完了しなかった場合は、必要に応じてクライアントに結果を送信し、エラー・メッセージをログに記録し、install-path/include/ldap-standard.hからのLDAP結果コードなどのゼロ以外の値を戻します。

3.2.4 初期化関数の作成

すべてのプラグインには初期化関数を含める必要があります。プラグイン・バージョンの互換性、プラグインの説明、プラグイン関数およびプラグインで必要なその他すべてのデータが、初期化関数によって登録されます。初期化関数では、Slapi_PBlock構造体へのポインタをパラメータとして取得します。「Hello Worldプラグイン」を参照してください。

すべての登録が成功すると、初期化関数から0が戻されます。いずれかの構成情報または関数の登録に失敗した場合は、初期化関数から-1が戻されます。プラグイン初期化関数からのリターン・コード-1により、サーバーが起動できなくなります。

Directory Serverでは、起動時に初期化関数を複数回コールできます。

3.2.5 パラメータ・ブロックを使用した構成情報の設定

Directory Serverによって、パラメータ・ブロック・ポインタがプラグイン初期化関数に渡されます。このパラメータ・ブロックには構成情報が保持されます。パラメータ・ブロックにはDirectory Serverの他のデータを保持できます。パラメータ・ブロックとは、slapi_pblock_set()のコールを使用した、構成情報およびプラグイン関数へのポインタの追加先となる構造体です。


ヒント:

パラメータ値を読み取るには、slapi_pblock_get()を使用します。パラメータ値を書き込むには、slapi_pblock_set()を使用します。他の関数を使用すると、サーバーがクラッシュする場合があります。


3.2.5.1 互換性の指定

slapi-plugin.hに定義されているプラグインAPIバージョンとの互換性を指定します(「プラグインAPIリファレンス」で説明されています)。新規プラグインを作成する場合は、たとえば、SLAPI_PLUGIN_CURRENT_VERSIONやSLAPI_PLUGIN_VERSION_03を使用します。たとえば、プラグインAPIの現行バージョンであるバージョン3がプラグインでサポートされることを指定するには、次のようにします。

slapi_pblock_set(pb,SLAPI_PLUGIN_VERSION, SLAPI_PLUGIN_VERSION_03);

ここで、pbは初期化関数に渡されるパラメータ・ブロック・ポインタです。SLAPI_PLUGIN_VERSIONは、パラメータ・ブロックにプラグインAPIバージョンの互換性を設定することを示します。

3.2.5.2 プラグインの説明の指定

「プラグインAPIリファレンス」で説明するとおり、プラグインの説明をSlapi_PluginDesc構造体にslapi-plugin.hで指定します。説明を登録するには、次のように、slapi_pblock_set()をコールします。

slapi_pblock_set(pb, SLAPI_PLUGIN_DESCRIPTION,(void *) &desc);

ここで、descはプラグインの説明を含むSlapi_PluginDesc構造体です。「Hello Worldプラグイン」を参照してください。

3.2.6 パラメータ・ブロックを使用した関数へのポインタの設定

Directory Serverによりどのような操作が実行されるかに応じて、プラグイン関数を登録します。また、操作がいつ実行されるかにも応じて、プラグイン関数を登録します。Directory Serverでは、通常、標準操作の実行前、実行中または実行後にプラグイン関数をコールします。

Directory Serverでいつプラグインをコールするかを指定するマクロの形式は、SLAPI_PLUGIN_*_FNです。サンプル・プラグインで示すとおり、プラグイン関数を登録するために使用されるマクロは、その関数の実行内容によってのみ決定されます。たとえば、Directory Serverの起動時にコールするようにプラグイン関数foo()を登録するには、次のようにします。

slapi_pblock_set(pb, SLAPI_PLUGIN_START_FN, (void *) foo);

ここで、pbは初期化関数に渡されるパラメータ・ブロック・ポインタです。SLAPI_PLUGIN_START_FNは、Directory Serverにより起動時にfoo()がコールされることを示します。成功すると、foo()から0が戻されることに注意してください。

3.2.7 サンプルの場所

サンプル・プラグインはinstall-path/examples/にあります。

3.3 Directory Serverプラグインの構築

この項では、プラグイン・バイナリの構築方法について説明します。この項では、Directory Serverプラグインのコンパイル要件およびリンク要件を示します。

3.3.1 プラグインAPIのヘッダー・ファイルの組込み

コンパイラでは、slapi-plugin.hなどのヘッダー・ファイルを検出できる必要があります。ヘッダー・ファイルはinstall-path/include/で検索します。

3.3.2 共有オブジェクトまたは動的リンク・ライブラリとしてのプラグインのリンク

プラグインをリンクして、プラグイン・ライブラリが再入可能および移植可能であり、共有できるようにします。次の例は、プラグイン・ライブラリを構築する1つの方法を示しています。例では、Solarisプラットフォームで稼働する64ビットDirectory Serverで使用されるコンパイラを示しています。

例3-2 64ビット: Solarisサンプル・プラグイン・ライブラリのMakefile

INCLUDE_FLAGS = -I../include
CFLAGS = $(INCLUDE_FLAGS) -D_REENTRANT -KPIC -xarch=v9 -DUSE_64
LDFLAGS = -G
DIR64 = 64

OBJS = dns.o entries.o hello.o internal.o testpwdstore.o \
 testsaslbind.o testextendedop.o testpreop.o testpostop.o \
 testentry.o testbind.o testgetip.o

all: MKDIR64 $(DIR64)/libtest-plugin.so

MKDIR64:
    @if [ ! -d $(DIR64) ]; then mkdir $(DIR64); fi

$(DIR64)/libtest-plugin.so: $(OBJS)
    $(LD) $(LDFLAGS) -o $@ $(OBJS)

.c.o:
    $(CC) $(CFLAGS) -c $<

clean:
    -rm -f $(OBJS) libtest-plugin.so $(DIR64)/libtest-plugin.so

CFLAGS -xarch=v9および-DUSE_64は、64ビット・サーバーで使用するライブラリがコンパイラによって構築されることを示します。64ビット・ライブラリが64/という名前のディレクトリに置かれることにも注意してください。この追加のディレクトリは64ビット・プラグインに必要です。64ビット・サーバーでは、ライブラリを検索するときに、追加ディレクトリの名前をパス名に追加します。詳細は、「プラグイン・ライブラリの検索」を参照してください。

次の例は、32ビットの場合のMakefileを示します。

例3-3 32ビット: Solarisサンプル・プラグイン・ライブラリのMakefile

INCLUDE_FLAGS = -I../include
CFLAGS = $(INCLUDE_FLAGS) -D_REENTRANT -KPIC
LDFLAGS = -G

OBJS = dns.o entries.o hello.o internal.o testpwdstore.o \
 testsaslbind.o testextendedop.o testpreop.o testpostop.o \
 testentry.o testbind.o testgetip.o

all: libtest-plugin.so

libtest-plugin.so: $(OBJS)
    $(LD) $(LDFLAGS) -o $@ $(OBJS)

.c.o:
    $(CC) $(CFLAGS) -c $<

clean:
    -rm -f $(OBJS) libtest-plugin.so

32ビット・バージョンおよび64ビット・バージョン両方のプラグイン・ライブラリが同じホスト上で共存できることに注意してください。

3.3.3 サンプル・ビルド・ルールの場所

ビルド・ルールはinstall-path/examples/にあります。ルールはinstall-path/examples/Makefile64にもあります。使用しているプラットフォームで推奨されるコンパイルおよびリンクの設定の詳細は、これらのファイルを参照してください。

3.4 Directory Serverへのライブラリのプラグイン

この項では、サーバーのプラグイン構成について説明します。この項では、プラグインのロード方法についても説明します。プラグインが正しくロードされると、Directory Serverでプラグインを正しく初期化および登録できます。Directory Serverプラグイン間の依存関係についても説明します。

3.4.1 プラグイン構成設定の指定

プラグイン構成設定により、Directory Serverで必要な情報が指定されます。サーバーではこの情報を使用して、起動時にプラグインをロードし、プラグインを識別し、ロード時にプラグインにパラメータを渡します。

構成設定には、dsconfコマンドから、サブコマンドcreate-pluginset-plugin-propおよびenable-pluginを使用してアクセスします。

dsconf create-pluginコマンドでは、必要なプラグイン構成設定を設定するようユーザーに強制します。設定には、名前、プラグイン初期化関数、プラグインを含むライブラリへのパスおよびプラグイン・タイプが含まれます。

dsconf set-plugin-propコマンドを使用すると、オプションの構成設定を設定できます。

dsconf enable-pluginコマンドを使用すると、プラグインをonまたはoffにできます。この設定を変更する場合は、サーバーを再起動する必要があります。

次の表に、構成設定およびその設定が必須(dsconf create-pluginにより設定)またはオプション(dsconf set-plugin-propにより設定)のいずれであるかを示します。

表3-1 プラグイン構成設定

設定 説明 必須またはオプション

プラグイン名

プラグインにより登録された名前に対応するプラグインの共通名

必須

初期化関数(-F)

Directory Serverの起動時にコールされる初期化関数の名前(プラグイン・コードに名前が出現する順にコールされる)

必須

ライブラリ・パス(-H)

プラグインを含むライブラリのフルパス(64ビット・プラグイン・ライブラリの64ビット・ディレクトリを除く)

詳細は、「プラグイン・ライブラリの検索」を参照してください。

必須

プラグイン・タイプ(-Y)

プラグインにより実装される関数のタイプを定義するプラグイン・タイプ

詳細は、「プラグイン・タイプおよび依存関係の理解」を参照してください。

必須

argument

Directory Serverの起動時にプラグインに渡されるパラメータ(suffix=dc=example,dc=comなど)

「プラグインに渡される引数の取得」を参照してください。

.

オプション

depends-on-named

State Change PluginMultimaster Replication Pluginなどのプラグイン名(RDN)に対する1つ以上のプラグイン依存関係

詳細は、「プラグイン・タイプおよび依存関係の理解」を参照してください。

オプション

depends-on-type

preoperationdatabaseなどのプラグイン・タイプに対する1つ以上のプラグイン依存関係

詳細は、「プラグイン・タイプおよび依存関係の理解」を参照してください。

オプション

desc

プラグインSlapi_PluginDesc構造体のspd_descriptionフィールドで指定された1行の説明

オプション

feature

プラグインSlapi_PluginDesc構造体のspd_idフィールドで指定された識別子

オプション

vendor

プラグインSlapi_PluginDesc構造体のspd_vendorフィールドで指定されたベンダー名

オプション

version

プラグインSlapi_PluginDesc構造体のspd_versionフィールドで指定されたバージョン番号

オプション


3.4.1.1 プラグイン・タイプおよび依存関係の理解

プラグインのタイプにより、プラグインにより登録できるプラグイン関数のタイプがDirectory Serverに示されます。プラグイン・タイプは、プラグインで実行される主な操作のタイプに対応しています。プラグイン・タイプの説明は、「プラグインとサーバーとの対話方法」および「使用例」を参照してください。「プラグインAPIリファレンス」では、プラグイン・タイプについて説明し、slapi-plugin.hで指定されたタイプ識別子に対応するタイプ・プロパティ設定を一覧表示しています。

プラグインの処理内容がわかっている場合、プラグイン・タイプを決定することは簡単です。たとえば、Directory Serverで、リクエストのバインドを処理する前に、そのリクエストの認証を処理するプラグインを作成する場合、タイプはpreoperationです。つまり、バインド操作のに、プラグインによって、リクエストに対するなんらかの処理が実行されます。したがって、そのようなプラグインでは、バインドの前にリクエストを処理するためのバインド前プラグイン関数を少なくとも1つ登録します。一方、パスワードをエンコードし、エンコードされたパスワードと受信パスワードとの比較も行うプラグインを作成する場合、タイプはpwdstorageschemeです。そのようなプラグインでは、少なくともパスワードのエンコーディングを登録し、関数の比較も行います。いずれの場合も、プラグイン・タイプはプラグイン関数に従います。

プラグイン依存関係は、プラグインが正しく機能するためには1つ以上の他のプラグインが必要であることをDirectory Serverに示します。Directory Serverでは、サーバーにプラグインがロードされるときに依存関係を解決します。このため、登録するプラグインの依存するプラグインを登録できない場合、Directory Serverではそのプラグインの登録に失敗します。

プラグインの依存関係は、depends-on-namedを使用して名前で指定するか、depends-on-typeを使用してタイプで指定します。ここで、プラグイン名は、構成エントリのプラグインの相対識別名(RDN)を指します。プラグイン・タイプは、第17章「パラメータ・ブロックのリファレンス」にあるタイプのリストのタイプ識別子です。depends-on-namedおよびnsslapddepends-on-typeのいずれにも、複数の値を指定できます。

プラグイン構成エントリでは、いずれかの種類または両方の種類の依存関係を指定できます。構成エントリを使用して、特定のプラグインに対する依存関係を名前で指定します。プラグインのタイプに対する依存関係はタイプで指定します。依存関係でプラグインが名前で指定される場合、Directory Serverでは、サーバーにその名前のプラグインが登録された後でのみプラグインを登録します。依存関係でプラグインがタイプで指定される場合、Directory Serverでは、指定されたタイプのすべてのプラグインがサーバーに登録された後でのみプラグインを登録します。

プラグイン登録の依存関係を、Directory Serverでプラグインがコールされる順序を指定するメカニズムと混同しないでください。

3.4.1.2 プラグイン・コールの順序付け

Directory Serverでは、プラグインがコールされる順序を定義できます。このメカニズムは、プラグインのロード依存関係を定義するメカニズムからは独立しています。

このメカニズムでは、DN cn=plugins,cn=monitorを持つエントリでの属性のセットを使用します。プラグイン・コールの順序付けは、各プラグインのタイプについて、値がプラグイン名のカンマ区切りリストである属性を使用して定義されます。各属性タイプ名はplugin-list-で始まり、サーバーのリクエスト処理中のどこでプラグインをコールできるかを示します。プラグインのカンマ区切りリストで、リストの最初のあるプラグインが最初にコールされ、2番目のプラグインが2番目にコールされ、その後も同様に続きます。

たとえば、6個の事後操作プラグインが変更操作の後にコールされます。cn=plugins,cn=monitorplugin-list-postoperation-modify属性は、これらの6個のプラグインがサーバーによりコールされる順序を示します。

plugin-list-postoperation-modify:
 Class of Service,
 Legacy replication postoperation plugin,
 Multimaster replication postoperation plugin,
 Retrocl postoperation plugin,
 Roles Plugin,
 State Change Plugin

これらの属性は、DN cn=plugins,cn=monitorを持つエントリで検索を実行することによっても取得できます。

プラグインのコール順序を変更する場合、plugin-list-で始まる属性タイプの値は変更しないでください。かわりに、plugin-order-で始まり、plugin-list-属性と末尾が同じ属性タイプに対応する値を変更する必要があります。また、DN cn=plugins,cn=configを持つエントリに、plugin-order-で始まる属性タイプを格納する必要もあります。

プラグイン・コール順序付け属性タイプの全リストを次に示します。

  • plugin-order-bepostoperation-add

  • plugin-order-bepostoperation-delete

  • plugin-order-bepostoperation-modify

  • plugin-order-bepostoperation-modrdn

  • plugin-order-beprecommit-add

  • plugin-order-beprecommit-delete

  • plugin-order-beprecommit-modify

  • plugin-order-beprecommit-modrdn

  • plugin-order-bepreoperation-add

  • plugin-order-bepreoperation-delete

  • plugin-order-bepreoperation-modify

  • plugin-order-bepreoperation-modrdn

  • plugin-order-internalpostoperation-add

  • plugin-order-internalpostoperation-delete

  • plugin-order-internalpostoperation-modify

  • plugin-order-internalpostoperation-modrdn

  • plugin-order-internalpreoperation-add

  • plugin-order-internalpreoperation-delete

  • plugin-order-internalpreoperation-modify

  • plugin-order-internalpreoperation-modrdn

  • plugin-order-postoperation-abandon

  • plugin-order-postoperation-add

  • plugin-order-postoperation-bind

  • plugin-order-postoperation-compare

  • plugin-order-postoperation-delete

  • plugin-order-postoperation-entry

  • plugin-order-postoperation-modify

  • plugin-order-postoperation-modrdn

  • plugin-order-postoperation-referral

  • plugin-order-postoperation-result

  • plugin-order-postoperation-search

  • plugin-order-postoperation-unbind

  • plugin-order-preoperation-abandon

  • plugin-order-preoperation-add

  • plugin-order-preoperation-attr-encode-result

  • plugin-order-preoperation-bind

  • plugin-order-preoperation-compare

  • plugin-order-preoperation-delete

  • plugin-order-preoperation-entry

  • plugin-order-preoperation-finish-entry-encode-result

  • plugin-order-preoperation-modify

  • plugin-order-preoperation-modrdn

  • plugin-order-preoperation-referral

  • plugin-order-preoperation-result

  • plugin-order-preoperation-search

  • plugin-order-preoperation-unbind

  • plugin-order-pwdpolicy-bind-fail

  • plugin-order-pwdpolicy-bind-success

たとえば、変更後に事後操作プラグインがコールされる順序を変更するには、まずplugin-list-postoperation-modifyを読み取ります。次に、plugin-list-postoperation-modifyの値からプラグイン名をコピーして、plugin-order-postoperation-modifyを設定します。次にDirectory Serverを再起動します。プラグイン名では大文字と小文字は区別されませんが、空白文字は考慮されます。認識されない名前は無視されます。

カンマ区切りリスト内の項目として1つのアスタリスク(*)を使用して、明示的に指定しないプラグインのコール順序がDirectory Serverで定義されるようにします。

最初はCall Me First、2つ目はCall Me Lastという2つの事後操作変更プラグインがある場合、plugin-list-postoperation-modifyを次のように設定できます。

plugin-order-postoperation-modify: Call Me First,*,Call Me Last

指定するプラグイン名は、slapi_register_plugin関数に渡されるname引数に同一である必要があります。また、カンマ・デリミタと隣接するプラグイン名の間および名前リストの末尾に空白文字を置くことはできません。

プラグインは、名前による明示的な指定や*を使用した暗黙的な指定をしないままにできます。そのようなプラグインは、Directory Serverにより、リストに示したプラグインをコールするにコールされます。

3.4.1.3 プラグインに渡される引数の取得

プラグインでは、複数値を持つ構成設定プロパティのargumentで指定されるパラメータを取得できます。Directory Serverでは、プラグイン初期化関数に渡されるパラメータ・ブロックを使用して、プラグインで引数を使用できるようにします。

構成設定にパラメータを含める場合、次のことが適用されます。

  • SLAPI_PLUGIN_ARGCは、パラメータの数を指定します。

  • SLAPI_PLUGIN_ARGVにはパラメータが含まれます。

次の例では、slapi_pblock_get()を使用してinstall-path/examples/testextendedop.cから引数を取得します。

例3-4 引数を使用するプラグイン(testextendedop.c)

#include "slapi-plugin.h"

Slapi_PluginDesc expdesc = {
    "test-extendedop",                 /* plug-in identifier       */
    "Oracle Corporation (test)",       /* vendor name              */
    "11.1.1.3.0",                      /* plug-in revision number  */
    "Sample extended operation plug-in"/* plug-in description      */
};

/* Register the plug-in with the server.                           */
#ifdef _WIN32
__declspec(dllexport)
#endif
int
testexop_init(Slapi_PBlock * pb)
{
    char ** argv;                      /* Args from configuration  */
    int     argc;                      /* entry for plug-in.       */
    char ** oid_list;                  /* OIDs supported           */
    int     rc = 0;                    /* 0 means success          */
    int     i;

    /* Get the arguments from the configuration entry.             */
    rc |= slapi_pblock_get(pb, SLAPI_PLUGIN_ARGV, &argv);
    rc |= slapi_pblock_get(pb, SLAPI_PLUGIN_ARGC, &argc);
    if (rc != 0) {
        slapi_log_info_ex(
            SLAPI_LOG_INFO_AREA_PLUGIN,
            SLAPI_LOG_INFO_LEVEL_DEFAULT,
            SLAPI_LOG_NO_MSGID,
            SLAPI_LOG_NO_CONNID,
            SLAPI_LOG_NO_OPID,
            "testexop_init in test-extendedop plug-in",
            "Could not get plug-in arguments.\n"
        );
        return (rc);
    }

    /* Extended operation plug-ins may handle a range of OIDs. */
    oid_list = (char **)slapi_ch_malloc((argc + 1) * sizeof(char *));
    for (i = 0; i < argc; ++i) {
        oid_list[i] = slapi_ch_strdup(argv[i]);
        slapi_log_info_ex(
            SLAPI_LOG_INFO_AREA_PLUGIN,
            SLAPI_LOG_INFO_LEVEL_DEFAULT,
            SLAPI_LOG_NO_MSGID,
            SLAPI_LOG_NO_CONNID,
            SLAPI_LOG_NO_OPID,
            "testexop_init in test-extendedop plug-in",
            "Registering plug-in for extended operation %s.\n",
            oid_list[i]
        );
    }
    oid_list[argc] = NULL;
    
    rc |= slapi_pblock_set(            /* Plug-in API version      */
        pb,
        SLAPI_PLUGIN_VERSION,
        SLAPI_PLUGIN_CURRENT_VERSION
    );
    rc |= slapi_pblock_set(            /* Plug-in description      */
        pb,
        SLAPI_PLUGIN_DESCRIPTION,
        (void *) &expdesc
    );
    rc |= slapi_pblock_set(            /* Extended op. handler     */
        pb,
        SLAPI_PLUGIN_EXT_OP_FN,
        (void *) test_extendedop
    );
    rc |= slapi_pblock_set(            /* List of OIDs handled     */
        pb,
        SLAPI_PLUGIN_EXT_OP_OIDLIST,
        oid_list
    );
    return (rc);
}

コマンドラインで複数のプロパティを使用して複数の引数を指定できます。dsconfコマンドにより、サーバーからプラグインに、コマンドラインで指定した順序で引数が渡されます。dsconfコマンドを使用して引数のリストを変更する場合、新しい引数で既存の引数が置き換えられます。引数はリストに追加されません。

3.4.1.4 プラグイン・ライブラリの検索

Directory Serverでは、dsconf create-pluginコマンドに-Hオプションで指定したライブラリ・パスを使用して、プラグイン・ライブラリを検索します。

  • 64ビット・サーバーでは、パス名の末尾にディレクトリ名を追加して64ビット・ライブラリを検索します。

    たとえば、-H /local/myplugins/mylib.soと指定すると、Solarisプラットフォーム上で稼働する64ビットDirectory Serverでは、次のような名前の64ビット・プラグイン・ライブラリが検索されます。

    /local/myplugins/64/mylib.so
    
  • 32ビットDirectory Serverでは、指定したとおりのパスを使用して32ビット・プラグイン・ライブラリを検索します。同じ構成エントリを使用する32ビットDirectory Serverでは、次の名前のプラグイン・ライブラリが検索されます。

    /local/myplugins/mylib.so
    

構成エントリに指定されたプラグイン・ライブラリが見つからないと、Directory Serverの起動は失敗します。

3.4.2 Directory Server構成の変更

Directory Serverが稼働している状態で、dsconfコマンドを使用してプラグイン構成設定を追加します。dsconf enable-plugin nameコマンドを使用して、プラグインを有効にします。

すべてが予期したとおりに動作した場合、instance-path/config/dse.ldifに格納されているプラグイン構成エントリが、Directory ServerによってDirectory Server構成に追加されます。構成ファイルを直接変更しないでください。

3.4.3 Directory Serverの再起動

Directory Serverでは、プラグインは動的にはロードされません。かわりに、サーバーを再起動する必要があります。これにより、Directory Serverによって起動時にプラグインが登録されます。

dsconf set-log-prop error level:err-pluginsコマンドを使用して、プラグイン情報メッセージがDirectory Serverによってログに記録されるように、ロギングを設定します。ログ・レベルを適切に設定したら、サーバーを再起動して、構成した新しいプラグインがサーバーにロードされることを確認します。

$ dsadm restart instance-path

ログ・レベルはサーバーの稼働中に調整できます。

3.5 プラグイン・メッセージのロギング

この項では、次の操作の実行方法について説明します。

3.5.1 3つのレベルのメッセージ重大度のロギング

プラグインAPIにより、致命的エラー・メッセージ、警告および情報を記録するためのログ関数が提供されます。エラー・メッセージおよび警告は常にログに記録されます。情報ロギングはデフォルトでオフになっています。ログ・レベルはDirectory Serverの稼働中に調整できます。


ヒント:

それぞれのログ・メッセージがディスクに書き込まれるとき、Directory Serverで待機が発生するため、サーバーの速度が低下します。

ロギングは必要な場合に使用してください。使用する必要がない場合はロギングをオフにしてください。


各ロギング関数の詳細は、第15章「Directory Server関数リファレンス(パートI)」を参照してください。

3.5.1.1 致命的エラー・メッセージ

致命的エラーにはslapi_log_error_ex()を使用します。多くの場合、メッセージをログに記録した後、-1を戻し、Directory Serverに対して、深刻な問題が発生したことを示します。

例3-5 致命的エラー・メッセージのロギング

#include "slapi-plugin.h"
#include "example-com-error-ids.h" /* example.com unique
                                      error IDs file       */
int
foobar(Slapi_PBlock * pb)
{
    char * error_cause;
    int    apocalypse = 1;         /* Expect the worst.    */

    /* ... */

    if (apocalypse) {              /* Server to crash soon */
        slapi_log_error_ex(
            EXCOM_SERVER_MORIBUND, /* Unique error ID      */
            SLAPI_LOG_NO_MSGID,
            SLAPI_LOG_NO_CONNID,
            SLAPI_LOG_NO_OPID,
            "example.com: foobar in baz plug-in",
            "cannot write to file system: %s\n",
            error_cause
        );
        return -1;
    }
    return 0;
}

この例では、foobar()によって、Directory Serverがクラッシュする寸前であるというエラーがログに記録されます。


ヒント:

プラグインが国際化されている場合、slapi_log_*_ex()関数に対する最後の2つの引数には、リテラル文字列ではなくマクロを使用してください。


3.5.1.2 警告メッセージ

注意が必要であり、常にメッセージを記録する必要がある深刻な状況には、slapi_log_warning_ex()を使用します。

次の例では、ディスクがほぼ一杯であるため、foobar()によって警告がログに記録されます。

例3-6 警告メッセージのロギング

#include "slapi-plugin.h"
#include "example-com-warning-ids.h" /* example.com unique
                                        warning IDs file  */
int
foobar()
{
    int disk_use_percentage;

    /* ... */

    if (disk_use_percentage>= 95) {
        slapi_log_warning_ex(
            EXCOM_DISK_FULL_WARN,    /* unique warning ID */
            SLAPI_LOG_NO_MSGID,
            SLAPI_LOG_NO_CONNID,
            SLAPI_LOG_NO_OPID,
            "example.com: foobar in baz plug-in",
            "disk %.0f%% full, find more space\n",
            disk_use_percentage
        );
    }
    return 0;
}

3.5.1.3 情報メッセージ

情報またはデバッグ・メッセージには、slapi_log_info_ex()を使用します。この関数はデフォルト・ロギング用に設定でき、この設定は、プラグインでロギングがオフになっている場合はメッセージがログに記録されないことを意味します。情報ロギングは、負荷の高いロギングが使用されている場合にのみ発生するように設定することもできます。これにより、プラグイン・ロギングがオンになっており、かつ、すべての情報メッセージをログに記録するように設定されている場合に、メッセージが記録されます。

プラグインからの情報メッセージをログに記録する方法の例は、「プラグインの確認」を参照してください。

3.5.2 Directory Server構成での適切なログ・レベルの設定

ログ・レベルは、プラグインの情報メッセージおよびその他多数のDirectory Serverサブシステムに対して設定できます。Directory Service Control Centerを使用してログ・レベルを設定できます。dsconf set-log-propコマンドを使用してコマンドラインからログ・レベルを設定することもできます。

dsconf set-log-prop error level:err-pluginsと設定すると、サーバーによりプラグインの情報ロギングがオンになります。

3.5.3 ログ内のメッセージの検索

エラー、警告および情報メッセージのログ・ファイルはinstance-path/logs/errorsです。すべてのメッセージが同じログに記録されるため、イベントの発生順を簡単に判別できます。

この例に示すとおり、メッセージはタイムスタンプ、その次に識別子、その次にログ・メッセージ内のその他の情報という構成になっています。印刷ページではこのログ・メッセージは壊れていることに注意してください。

[02/Jan/2006:16:54:57 +0100] - INFORMATION - 
 start_tls - conn=-1 op=-1 msgId=-1 - 
 Start TLS extended operation request confirmed.

識別子を使用して不要な項目をフィルタリングしてください。