ONC+ 開発ガイド

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

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

SAC の管理ファイル _sactab

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

SAC の管理ファイルの各エントリには、表 F-1 で示されている次の情報が含まれています。

表 F-1 SAC_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 にだけ必要なプロンプト文字列が入っています。ポートモニタのタイプごとに、ポートモニタの固有データを引数とし、そのデータを適当な形式で管理ファイルの中に書き出すコマンドが提供されていなければなりません。ttymon に対しては ttyadm コマンドが、listen に対しては nlsadmin コマンドがこの処理を行います。ユーザーがポートモニタを作成するときは、このような管理コマンドも同時に作成する必要があります。


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

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

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

SVCTAG には、14 文字までの英数字が入ります。サービスエントリは、表 F-2 で定義されています。

表 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 が実行する。SACinit() により起動される。そのためには、/etc/inittabsac を呼び出すためのエントリを入れておく

_pid

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

_pmtab

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

_pmpipe

ポートモニタが sac からのメッセージを受信するための FIFO

svctag

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

../_sacpipe

ポートモニタが sac へのメッセージを送信するための FIFO

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

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

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


注 -

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