Sun Cluster 3.0 データサービス開発ガイド

すべてのメソッドに共通な機能の提供

この節では、サンプルのデータサービスのすべてのメソッドで使用される次のような機能について説明します。

コマンドインタプリタの指定およびパスのエクスポート

シェルスクリプトの最初の行は、コマンドインタプリタを指定します。サンプルのデータサービスの各メソッドスクリプトは、次に示すように、コマンドインタプリタを指定します。


#!/bin/ksh

サンプルアプリケーション内のすべてのメソッドスクリプトは、Sun Cluster のバイナリとライブラリへのパスをエクスポートします。ユーザーの PATH 設定には依存しません。


###############################################################################
# MAIN
##############################################################################
export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

PMF_TAGSYSLOG_TAG 変数の宣言

すべてのメソッドスクリプト (VALIDATE を除く) は、リソース名を渡し、pmfadm(1M) を使用してデータサービスまたはモニターのいずれかを起動します。各スクリプトは変数 PMF_TAG を定義し、pmfadm に渡すことによって、データサービスまたはモニターを識別できます。

同様に、各メソッドスクリプトは、logger(1) コマンドを使用してメッセージをシステムログに記録します。各スクリプトは変数 SYSLOG_TAG を定義し、-t オプションで logger に渡すことによって、メッセージが記録されるリソースのリソースタイプ、リソースグループ、リソース名を識別できます。

すべてのメソッドは、次に示す例と同じ方法で SYSLOG_TAG を定義します。dns_probedns_svc_startdns_svc_stopdns_monitor_check の各メソッドは、次のように PMF_TAG を定義します (なお、pmfadmloggerdns_svc_stop メソッドのものを使用しています)。


##############################################################################
# MAIN
##############################################################################
PMF_TAG=$RESOURCE_NAME.named
PMF_TAG=$RESOURCE_NAME.named
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME

	# SIGTERM シグナルをデータサービスに送信し、合計タイムアウト値の 80% だけ待機する。
	pmfadm -s $PMF_TAG.named -w $SMOOTH_TIMEOUT TERM
	if [ $? -ne 0 ]; then 
		logger -p ${SYSLOG_FACILITY}.info ¥
		    -t [$SYSLOG_TAG] ¥
		    "${ARGV0} Failed to stop HA-DNS with SIGTERM; Retry with ¥
		     SIGKILL"

dns_monitor_stopdns_monitor_stopdns_update の各メソッドは、次のように PMF_TAG を定義します (なお、pmfadmdns_monitor_stop メソッドのものを使用しています)。


##############################################################################
# MAIN
##############################################################################
PMF_TAG=$RESOURCE_NAME.monitor
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME
...

# モニターが動作しているかどうかを調べ、動作している場合は強制終了する。
if pmfadm -q $PMF_TAG.monitor; then 
	pmfadm -s $PMF_TAG.monitor KILL

関数の引数の構文解析

RGM は、次に示すように、すべてのコールバックメソッド (VALIDATE を除く) を呼び出します。


method_name -R resource_name -T resource_type_name -G resource_group_name 

method_name は、コールバックメソッドを実装するプログラムのパス名です。データサービスは、各メソッドのパス名を RTR ファイルに指定します。このようなパス名は、RTR ファイルの Rt_basedir プロパティに指定されたディレクトリからのパスになります。たとえば、サンプルのデータサービスの RTR ファイルでは、ベースディレクトリとメソッド名は次のように指定されます。


RT_BASEDIR=/opt/SUNWsample/bin;
START = dns_svc_start;
STOP =  dns_svc_stop;
...

コールバックメソッドの引数はすべて、フラグ付きの値として渡されます。-R はリソースインスタンスの名前を示し、-T はリソースのタイプを示し、-G はリソースが構成されているグループを示します。コールバックメソッドについての詳細は、rt_callbacks(1HA) のマニュアルページを参照してください。


注 -

VALIDATE メソッドを呼び出すときは、追加の引数 (リソースのプロパティ値と呼び出されるリソースグループ) を使用します。詳細は、「プロパティ更新の処理」を参照してください。


各メソッドには、渡された引数を構文解析する関数が必要です。すべてのコールバックメソッドには同じ引数が渡されるので、データサービスは、アプリケーション内のすべてのコールバックメソッドで使用される単一の構文解析関数を提供します。

次に、サンプルのアプリケーションのメソッドで使用される parse_args 関数を示します。


##############################################################################
# プログラム引数を解析する。
#
function parse_args # [args ...]
{
			typeset opt

			while getopts 'R:G:T:' opt
			do
						case "$opt" in
						R)
									# DNS リソースの名前
									RESOURCE_NAME=$OPTARG
									;;
						G)
									# リソースが構成されているリソース
									# グループの名前
									RESOURCEGROUP_NAME=$OPTARG
									;;
						T)
									# リソースタイプの名前
									RESOURCETYPE_NAME=$OPTARG
									;;
						*)
								logger -p ${SYSLOG_FACILITY}.err ¥
								-t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] ¥
								"ERROR: Option $OPTARG unknown"
								exit 1
								;;
						esac
			done
}


注 -

サンプルのアプリケーションの PROBE メソッドはユーザー定義メソッドですが、Sun Cluster コールバックメソッドと同じ引数で呼び出されます。したがって、このメソッドには、他のコールバックメソッドと同じ構文解析関数が含まれています。


構文解析関数は、次に示すように、MAIN の中で呼び出されます。


parse_args "$@"

エラーメッセージの生成

エラーメッセージをエンドユーザーに出力するには、syslog 機能をメソッドに使用することを推奨します。サンプルのデータサービスのすべてのメソッドは、次に示すように、scha_cluster_get コマンドを使用し、クラスタログ用に使用されている syslog 機能番号を取得します。


SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

この値はシェル変数 SYSLOG_FACILITY に格納されます。logger(1) コマンドの機能として使用すると、エラーメッセージをクラスタログに記録できます。たとえば、サンプルのデータサービスの START メソッドは、次に示すように、SYSLOG_FACILITY を取得し、データサービスが起動したことを示すメッセージを記録します。


SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`
...
if [ $? -eq 0 ]; then
	logger -p ${SYSLOG_FACILITY}.err ¥
			-t [$SYSLOG_TAG] ¥
			"${ARGV0} HA-DNS successfully started"
fi

詳細は、scha_cluster_get(1HA) のマニュアルページを参照してください。

プロパティ情報の取得

ほとんどのメソッドは、データサービスのリソースとリソースタイプのプロパティについての情報を取得する必要があります。このために、API は scha_resource_get コマンドを提供しています。

リソースプロパティには 2 種類 (システム定義プロパティと拡張プロパティ) あります。システム定義プロパティは事前に定義されており、拡張プロパティはデータサービス開発者が RTR ファイルに定義します。

scha_resource_get を使用してシステム定義プロパティの値を取得するときは、-O パラメータでプロパティの名前を指定します。このコマンドは、プロパティのだけを戻します。たとえば、サンプルのデータサービスの MONITOR_START メソッドは検証プログラムを特定し、起動できるようにしておく必要があります。検証プログラムはデータベースのベースディレクトリ (RT_BASEDIR プロパティが指す位置) 内に存在します。したがって、MONITOR_START メソッドは、次に示すように、RT_BASEDIR の値を取得し、その値を RT_BASEDIR 変数に格納します。


RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME -G ¥
$RESOURCEGROUP_NAME`

拡張プロパティの場合、データサービス開発者は、これが拡張プロパティであることを示す -O パラメータを指定し、最後のパラメータとしてプロパティの名前を指定する必要があります。拡張プロパティの場合、このコマンドは、プロパティのタイプの両方を戻します。たとえば、サンプルのデータサービスの検証プログラムは、次に示すように、probe_timeout 拡張プロパティのタイプと値を取得し、次に awk(1) コマンドを使用して値だけを PROBE_TIMEOUT シェル変数に格納します。


probe_timeout_info=`scha_resource_get -O Extension -R $RESOURCE_NAME ¥
-G $RESOURCEGROUP_NAME Probe_timeout` ¥
PROBE_TIMEOUT=`echo $probe_timeout_info | awk '{print $2}'`