ONC+ 開発ガイド

ポートモニターの管理インタフェース

この項では、SAC で使用できる管理ファイルについて説明します。

SAC の管理ファイル _sactab

サービスアクセスコントローラの管理ファイルには、SAC の管理下にある全ポートモニターの情報が入っています。このファイルは配布システムに入っています。最初、このファイルには SAC のバージョン番号の入ったコメント行が 1 行入っているだけです。SAC 管理ファイル内でエントリを作成することにより、システムへポートモニターを追加できます。エントリを追加するには、管理コマンド sacadm-a オプションを付けて実行します。SAC の管理ファイルからエントリを削除するときも、sacadm を使用します。

SAC の管理ファイル内の各エントリには次の表に示す情報が含まれます。

表 F–1 サービスアクセスコントローラ _sactab ファイル

フィールド 

説明 

PMTAG

個々のポートモニターを一意的に識別できるタグ。ポートモニターの命名はシステム管理者が行う。SAC は、管理目的でポートモニターを識別するときはこのタグを使用する。PMTAG には、14 文字までの英数字が入る。

PMTYPE

ポートモニターのタイプ。各ポートモニターには、それを一意に識別できるタグのほかにタイプ指示子がある。タイプ指示子は、同一エンティティを別々に起動したことによるポートモニターグループを示す。有効なポートモニタータイプの例として ttymonlisten が挙げられる。タイプ指示子を使用すると、関連ポートモニターからなるグループの管理が楽になる。タイプ指示子がないと、システム管理者は各ポートモニタータグがどのタイプのポートモニターなのか判断できない。PMTYPE には、14 文字までの英数字が入る。

FLGS

現在定義されているフラグは次の 2 つがある。 

-d は、起動時にポートモニターを有効にしない。

-x は、ポートモニターを起動しない。

フラグを指定しないと、デフォルトのアクションが実行される。デフォルトでは、ポートモニターは起動され有効に設定される。 

RCNT

ポートモニターが何回エラーを起こしたらエラー停止状態になるかを示す。 SAC は、エラー停止状態になったポートモニターは再起動しない。エントリ作成時にこの回数を指定しないと、このフィールドは 0 になる。再起動回数が 0 ということは、ポートモニターが一度でもエラーストップすると、以後再起動されないことを意味する。

COMMAND

ポートモニターを起動するコマンドの文字列。文字列の最初の要素 (コマンド自体) は、フルパスで指定しなければならない。 

ポートモニターの管理ファイル _pmtab

各ポートモニターは、それぞれ 2 つの専用ディレクトリを持ちます。カレントディレクトリには、SAF で決められたファイル (_pmtab_pid) と、サービスごとの構成スクリプト (作成した場合のみ) とがあります。ディレクトリ /var/saf/pmtag (pmtag はポートモニターのタグ) には、ポートモニターのプライベートファイルを入れることができます。

各ポートモニターは自分の管理ファイルを持っています。この管理ファイル内へサービスエントリを追加、削除、変更するには、 pmadm コマンドを使用します。 pmadm で管理ファイルを変更するたびに、対応するポートモニターはそのファイルを読み直します。ポートモニターの管理ファイルの各エントリでは、個々のポートの扱いと、そのポートで呼び出されるサービスを定義します。

どのタイプのポートモニターでも省略できないフィールドがあります。エントリには、サービスを一意的に識別するためのサービスタグと、サービスの起動時に割り当てられる ID、たとえば、root が必ず入っていなければなりません。

サービスタグとポートモニタータグを組み合わせると、サービスインスタンスが一意的に定義されます。別のポートモニターのサービスを指定する際に同じサービスタグを使用できます。レコードにはポートモニターに固有のデータも入っています。たとえば、ポートモニター ttymon の場合、ttymon にだけ必要なプロンプト文字列が入っています。ポートモニターのタイプごとに、ポートモニターの固有データを引数とし、そのデータを適当な形式で管理ファイルの中に書き出すコマンドが提供されていなければなりません。コマンド ttyadmttymon の形式を提供し、nlsadmin listen の形式を提供します。 ユーザーが定義するポートモニターでも、同じような管理コマンドを提供する必要があります。

ポートモニター管理ファイルの各サービスエントリには、次の情報が次の形式で入っていなければなりません。

svctag:flgs:id:reserved:reserved:reserved:pmspecific# comment 

SVCTAG はサービスを一意的に識別するタグです。タグは、サービスが提供されるポートモニターの中でのみ一意になるようにします。別のポートモニターのサービス (同一サービスまたは別のサービス) には、同じタグが付けられていてもかまいません。サービスを一意的に識別するには、ポートモニタータグとサービスタグの両方が必要です。

SVCTAG には、14 文字までの英数字が入ります。次の表にサービスエントリを定義します。

表 F–2 SVCTAG サービスエントリ

サービスエントリ 

説明 

FLGS

このフィールドには、現在次のフラグを入れることができる  

-x を指定すると、このポートは有効にしない。デフォルトでは有効になる

-u を指定すると、このサービスの utmpx エントリを作成する。デフォルトではサービスの utmpx エントリは作成されない

ID

サービスを起動するときの ID。ID は、 /etc/passwd に入っているログイン名と同じ形式を持つ

PMSPECIFIC

ポートモニター固有情報の例として、アドレス、実行するプロセスの名前、接続を渡す STREAMS パイプの名前が挙げられる。この情報はポートモニターのタイプごとに異なる

COMMENT

サービスエントリに関するコメントを書く


注 –

サービス呼び出し方法からみて、utmpx を作成するのが適当でない場合は、ポートモニターが -u フラグを無視します。サービスによっては、utmpx エントリが作成されていないと正しく起動できないものもあります。たとえば、login サービスです。


各ポートモニターの管理ファイルには、次の形式の特殊なコメントが入っていなければなりません。

# VERSION=value 

ここで、value はポートモニターのバージョン番号を表す整数です。バージョン番号により、ポートモニターの管理ファイルの形式がわかります。このコメント行は、ポートモニターをシステムに追加したときに自動的に作成されます。これだけが 1 行となってサービスエントリの前に入ります。

SAC 管理コマンド sacadm

sacadm は SAF 階層の上位レベル、つまりポートモニター管理用の管理コマンドです。 sacadm(1M) マニュアルページを参照してください。SAF では、sacadm コマンドを使用して SAC の管理ファイルを変更することによりポートモニターを管理します。sacadm は、次にのような機能があります。

ポートモニターの管理コマンド pmadm

pmadm は、SAF 階層の下位レベル、つまりサービス管理用の管理コマンドです。pmadm(1M) マニュアルページを参照してください。複数のポートで同じサービスを提供することは可能ですが、1 つのポートには 1 つのサービスしか結合できません。pmadm の機能を次に示します。

サービスインスタンスを一意的に識別するには、pmadm コマンドで、サービス (-s) と、サービスが提供されるポートモニター (-p または -t) の両方を指定する必要があります。

モニタ固有の管理コマンド

前の節では、_pmtab ファイル内の 2 つの情報、すなわち、ポートモニターのバージョン番号と、_pmtab ファイルのサービスエントリに入っているポートモニター情報を説明しました。新たなポートモニターを追加するときは、_pmtab ファイルを正しく初期化するためにバージョン番号がわかっていなければなりません。新たなサービスを追加するときは、ポートモニター側の _pmtab エントリを正しくフォーマットする必要があります。

各ポートモニターには、この 2 つの処理を行うための管理コマンドが必要です。ポートモニターの設計者は、そのような管理コマンドとその入力オプションも定義しなければなりません。 管理コマンドは、そのような入力オプションを指定して呼び出されると、サービスエントリのポートモニター固有部分に必要な情報を、ポートモニターの _pmtab ファイルに入るようにフォーマットし、それを標準出力に書き出さなければなりません。バージョン番号を調べるときは、コマンドに -V オプションを付けて実行します。その場合管理コマンドは、ポートモニターの現在のバージョン番号を標準出力に書き出さなければなりません。

どちらの処理を実行している場合も、管理コマンドに何らかのエラーが起これば、標準出力には何も表示されません。

ポートモニターとサービスのインタフェース

ポートモニターとサービスのインタフェースは、サービスの側から決まります。サービスを呼び出す方法の例として、2 つの方法を説明します。

サービスの新規呼び出し

インタフェースの 1 つに、要求ごとに新たにサービスを起動する方法があります。この場合、最初にポートモニターに子プロセスの fork() を要求します。子プロセスは、exec() を実行することで、指定されたサービスになります。ポートモニターは、exec() が起こる前に、ポートモニター固有のアクションを実行します。ただし、サービスごとの構成スクリプトがあれば、必ずそれを読み込んで実行しなければなりません。これはライブラリルーチン doconfig() を呼び出すことによって実行されます。

実行中のサービスの呼び出し

現在実行中のサービスを呼び出すためのもう 1 つのインタフェースがあります。このインタフェースを使用するサービスは、ストリームパイプの一端をオープンにしておき、そこを通して接続を受信できるようにしておかなければなりません。

ポートモニターに必要な条件

ポートモニターを開発するには、いくつかの一般的な条件が満たされていなければなりません。この節では、そのような条件を簡単に説明します。ポートモニター自体のほかに、管理コマンドを提供する必要があります。

起動時の環境

ポートモニターが起動されるときは、次のような初期実行環境が整っていなければなりません。

重要なファイル

カレントディレクトリには、次に示すポートモニターの主要ファイルが存在します。

表 F–3 ポートモニターの主要ファイル

ファイル 

説明 

_config

ポートモニターの構成スクリプト。ポートモニターの構成スクリプトは SAC が実行する。SAC は init() により起動される。そのためには、/etc/inittab に sac を呼び出すためのエントリを入れておく

_pid

ポートモニターが自身のプロセス ID を書き込むファイル

_pmtab

ポートモニターの管理ファイル。このファイルには、ポートモニターの管理下にあるポートとサービスの情報が入っている 

_pmpipe

ポートモニターが SAC からのメッセージを受け取る際に経由する FIFO 

svctag

svctag というタグを持つサービスの構成スクリプト

../_sacpipe

ポートモニターが SAC へメッセージを送信する際に経由する FIFO 

ポートモニターの実行すべきタスク

ポートモニターは、ポートモニター固有機能のほかに次のタスクを実行します。

ポートモニターはサービスを起動するときに次のタスクを実行しなければなりません。


注 –

サービスの起動方法から見て utmp エントリを作成する意味がなければ、ポートモニターは -u フラグを無視します。これとは反対に、utmp エントリが作成されていないと正しく起動できないサービスもあります。