ONC+ 開発ガイド

構成ファイルとスクリプト

構成スクリプトのインタプリタ: doconfig()

libnsl.so に定義されているライブラリルーチン doconfig() は、ファイル /etc/saf/pmtag/_sysconfig (システムごとの構成スクリプト)、/etc/saf/_sysconfig (ポートモニタごとの構成スクリプト)、/etc/saf/pmtag/svctag (サービスごとの構成スクリプト) に入っている構成スクリプトを解釈します。doconfig() の構文を次に示します。

# include <sac.h>
int doconfig (int fd, char *script, long rflag);

script は構成スクリプト名です。fd は、ストリーム操作オペレーションが適用されるストリームのファイル記述子です。rflag は、script を解釈するモードを指定するビットマスクです。rflag に指定できる値は、NORUNNOASSIGN、またはこの 2 つの OR を取った値です。rflag がゼロの場合は、構成スクリプトのすべてのコマンドが解釈されます。rflagNOASSIGN ビットがオンになっていると、assign コマンドは解釈できず doconfig() はエラー終了します。rflagNORUN ビットがオンになっていると、runrunwait のコマンドは解釈できず doconfig() はエラー終了します。

スクリプトのどれかのコマンドでエラーが起こった場合、doconfig() はそこでスクリプトの解釈を終了し正の整数を返します。この値は、エラーが起こった行番号を表します。システムエラーが起こった場合は、-1 を返します。

スクリプトでエラーが起こった場合は、スクリプトが実行環境を設定していたプロセスは起動されません。

次の例では、サービスごとの構成スクリプトを解釈するのに doconfig() を使用しています。

. . .
 	if ((i = doconfig (fd, svctag, 0)) != 0){
 	error ("doconfig failed online %d of script %s",i,svctag);
}

システムごとの構成ファイル

システムごとの構成ファイル /etc/saf/_sysconfig は空の状態で配布されます。このファイルはシステム上の全サービスの環境をカスタマイズするもので、この章と doconfig(3NSL) のマニュアルページで説明するインタプリタ言語で書かれたコマンドスクリプトが入っています。SAC は、起動されると doconfig() 関数を呼び出してシステムごとの構成スクリプトを翻訳します。SAC が起動されるのは、システムがマルチユーザーモードに入ったときです。

ポートモニタごとの構成ファイル

ポートモニタごとの構成ファイル (/etc/saf/pmtag/_config) はオプションの構成ファイルです。ユーザーはこのファイルを使用して、ポートモニタの環境と、ポートモニタが管理している特定のポートで提供されるサービスの環境とをカスタマイズできます。ポートモニタごとの構成スクリプトも、システムごとの構成スクリプトと同じ言語で書かれます。

ポートモニタごとの構成スクリプトは、ポートモニタが起動されたときに翻訳されて実行されます。ポートモニタが SAC に起動されるのは、SAC が起動されて自分自身の構成スクリプト (/etc/saf/_sysconfig) を実行した後です。

ポートモニタごとの構成スクリプトがあると、システムごとの構成スクリプトで提供されるデフォルトの構成スクリプトではなく、ポートモニタごとのスクリプトが実行されます。

サービスごとの構成ファイル

ユーザーは、サービスごとの構成ファイルを使用して特定のサービスの環境をカスタマイズできます。たとえば、一般ユーザーには許されていない特殊な特権を必要とするサービスがあるとします。doconfig(3NSL) のマニュアルページに記述されている言語を使用すると、特定のポートモニタで提供される特定のサービスにこのような特殊な特権を与えたり奪ったりするスクリプトを書くことができます。

サービスごとの構成スクリプトを作成しておくと、上位レベルの構成スクリプトで提供されるデフォルトのスクリプトの代わりに、そのスクリプトが実行されます。たとえば、サービスごとの構成スクリプトで、デフォルトとは異なる STREAMS モジュールセットを指定することができます。

構成スクリプト言語

構成スクリプトを記述する言語は、一連のコマンドで構成されており、各コマンドはそれぞれ個別に翻訳されます。5 つのキーワード assignpushpoprunwaitrun が定義されています。コメント文字は # です。空白行は無視されます。スクリプトの各行は 1024 文字を超えることはできません。

assign variable=value

assign コマンドは環境変数を定義するのに使用します。variable は環境変数名で、value は環境変数に割り当てられる値です。value は文字列定数でなければなりません。パラメータ置換は使用できません。value は引用符で囲むことができます。引用符で囲むときの規則は、シェルで環境変数を定義するときの規則と同じです。新たな環境変数を割り当てるための空間が足りない場合、指定構文に誤りがあるときは assign コマンドでエラーが起こります。

push module1[, 
 module2, module3, ...] 

push コマンドは、STREAMS モジュールを fd で指定されたストリームにプッシュします。doconfig(3NSL) のマニュアルページを参照してください。module1 は最初にプッシュされるモジュール名、module2 は 次にプッシュされるモジュール名です。(module3 以下も同様)。指定したどれかのモジュールがプッシュできなかったとき、このコマンドはエラーとなります。その場合、同じ行で指定している残りのモジュールは無視され、既にプッシュされたモジュールはポップされます。

pop [module]

pop コマンドは、指定したストリームから STREAMS モジュールをポップするのに使用します。引数なしで pop コマンドを実行すると、ストリームの一番上のモジュールがポップされます。引数を指定して pop コマンドを実行すると、指定したモジュールがストリームの一番上に来るまで、モジュールが 1 つずつポップされます。指定したモジュールがストリームにない場合は、ストリームはもとの状態のままで、コマンドはエラー終了します。モジュール名の代わりに特殊キーワード ALL を指定すると、ストリームから全モジュールがポップされます。ただし、一番上のドライバより上のモジュールだけが対象になることに注意してください。

runwait command

runwait コマンドは、コマンドを実行してその終了を待ちます。command には、実行するコマンドのパス名を指定します。command/bin/sh -c を付けて実行されます。シェルスクリプトもこのようにして構成スクリプトから実行できます。指定した command が見つからないか実行できなかったとき、または、command は存在していてもステータスが 0 以外のときは、runwait コマンドがエラー終了します。

run command

run コマンドは runwait コマンドと同じですが、run コマンドでは command の終了を待たない点が違います。command には、実行するコマンドのパス名を指定します。run コマンドがエラー終了するのは、command を実行する子プロセスを作成できなかったときだけです。

構文上は区別がつきませんが、runrunwait で実行されるコマンドのいくつかはインタプリタの組み込みコマンドです。インタプリタの組み込みコマンドが使用されるのは、プロセスのコンテキストの中でプロセスの状態を変える必要があるときです。doconfig() の組み込みコマンドは、シェルの特殊コマンドと同様、実行するための別のプロセスを生成しません。sh(1) のマニュアルページを参照してください。組み込みコマンドの初期セットを次に示します。

cd ulimit umask

構成スクリプトの印刷、インストール、置き換え

この節では、SAC とポートモニタの管理コマンドを使用して、3 種類の構成スクリプトをインストールする方法を説明します。システムごとの構成スクリプトとポートモニタごとの構成スクリプトは sacadm コマンドで管理します。サービスごとの構成スクリプトは pmadm コマンドで管理します。

システムごとの構成スクリプト

sacadm -G  [ -z  script ]

システムごとの構成スクリプトを印刷するか置き換えるときは、-G オプションを使用します。-G オプションだけを指定すると、システムごとの構成スクリプトが印刷されます。-G オプションと -z オプションを組み合わせると、/etc/saf/_sysconfigscript に指定されたファイルの内容で置き換えられます。-G オプションは -z オプション以外のオプションと組み合わせて使用することはできません。

システムごとの構成スクリプトの例

次に示すシステムごとの構成ファイル (_sysconfig) では、時間帯を示す変数 TZ を設定しています。

assign TZ=EST5EDT # set TZ
runwait echo SAC is starting > /dev/console

ポートモニタごとの構成スクリプト

sacadm -g -p pmtag [ -z script ]

-g オプションは、ポートモニタごとの構成スクリプトの印刷、インストール、置き換えを行うときに使用します。-g オプションには -p オプションが必要です。-g オプションに -p オプションだけを組み合わせて指定すると、pmtag に指定したポートモニタのポートモニタごとの構成スクリプトが印刷されます。-g オプションに -p オプションと -z オプションを組み合わせると、script に指定したファイルがポートモニタ (pmtag) に対するポートモニタごとの構成スクリプトとしてインストールされます。あるいは、/etc/saf/pmtag/_config が既に存在している場合は、そのファイルの内容が script に指定したファイルで置き換わります。-g オプションをこれ以外のオプションと組み合わせて使用することはできません。

ポートモニタごとの構成スクリプトの例

次に示す _config ファイルの例では、/usr/bin/daemon を、STREAMS マルチプレクサを構築するデーモンプロセスを起動するためのコマンドとします。この構成スクリプトをインストールすると、ポートモニタが必要とするコマンドを、ポートモニタの起動の直前に実行できます。

# build a STREAMS multiplexor
run /usr/bin/daemon
runwait echo $PMTAG is starting > /dev/console

サービスごとの構成スクリプト

pmadm -g -p pmtag -s  svctag [ -z script ]
 pmadm -g -s svctag -t type -z script

サービスごとの構成スクリプトは、サービスが呼び出される前に、ポートモニタによって解釈されて実行されます。


注 -

SAC は自分自身の構成ファイル (_sysconfig) と、ポートモニタの構成ファイルの両方を解釈して実行します。サービスごとの構成ファイルだけは、ポートモニタが実行します。


-g オプションは、サービスごとの構成スクリプトの印刷、インストール、置き換えを行うときに使用します。-g オプションに -p オプションと -s オプションを組み合わせると、ポートモニタ (pmtag) で提供されるサービス (svctag) のサービスごとの構成スクリプトが印刷されます。-g オプションに -p オプション、-s オプション、-z オプションを組み合わせると、指定したファイル (script) に入っているスクリプトが、ポートモニタ (pmtag) で提供されるサービス (svctag) のサービスごとの構成スクリプトとしてインストールされます。-g オプションに -s オプション、-t オプション、-z オプションを組み合わせると、指定したファイル (script) が、ポートモニタタイプ (type) で提供されるサービス (svctag) のサービスごとの構成スクリプトとしてインストールされます。-g オプションを、上で述べた以外のオプションと組み合わせて使用することはできません。

サービスごとの構成スクリプトの例

次に示すサービスごとの構成スクリプトでは 2 つのことを実行します。1 つは、プロセスの ulimit4096 に設定することにより、プロセスが作成するファイルサイズの上限を設定しています。もう 1 つは、umask077 に設定することにより、プロセスが作成するファイルに適用される保護マスクを指定しています。

runwait ulimit 4096
runwait umask 077