Solaris のシステム管理 (IP サービス)

DHCP クライアントのイベントスクリプト

Oracle Solaris DHCP クライアントを適切に設定すれば、実行可能なプログラムやスクリプトを実行して、クライアントシステムに必要な任意のアクションを行うことができます。「イベントスクリプト」と呼ばれるこのプログラムやスクリプトは、一定の DHCP リースイベントが発生すると自動的に実行されます。イベントスクリプトを使用すれば、特定のリースイベントに応じてほかのコマンドやプログラム、スクリプトを実行できます。この機能を使用するためには、独自のイベントスクリプトを作成する必要があります。

dhcpagent では、DHCP リースイベントを表すために次のイベントキーワードが使用されます。

イベントキーワード

備考欄

BOUNDBOUND6

インタフェースが DHCP 用に構成されました。クライアントは、DHCP サーバーから肯定メッセージ (DHCPv4 ACK) または (DHCPv6 Reply) を受け取り、IP アドレスに対するリース要求を認められます。このイベントスクリプトは、インタフェースの構成が正常に終わると直ちに呼び出されます。

EXTENDEXTEND6

クライアントによるリースの延長が成功しました。このイベントスクリプトは、クライアントが更新要求に対する肯定メッセージを DHCP サーバーから受け取ると直ちに呼び出されます。

EXPIREEXPIRE6

リース時間が終了すると、リースが期限切れになります。DHCPv4 の場合、このイベントスクリプトは、リースされたアドレスがインタフェースから削除され、インタフェースが停止状態にされる直前に呼び出されます。DHCPv6 の場合、このイベントスクリプトは、最後に残っているリースされたアドレスがインタフェースから削除される直前に呼び出されます。

DROPDROP6

クライアントがインタフェースを DHCP 制御下から削除する目的でリースを中断しました。このイベントスクリプトは、インタフェースが DHCP 制御から削除される直前に呼び出されます。

RELEASERELEASE6

クライアントが IP アドレスを解放します。このイベントスクリプトは、クライアントがインタフェース上のアドレスを解放し、DHCPv4 RELEASE または DHCPv6 Release パケットを DHCP サーバーに送信する直前に呼び出されます。

INFORM INFORM6

インタフェースは、DHCPv4 INFORM または DHCPv6 Information-Request メッセージを使用して、新しい構成情報または更新された構成情報を DHCP サーバーから取得します。これらのイベントは、DHCP クライアントがサーバーから構成パラメータだけを取得し、IP アドレスリースを取得しない場合に発生します。

LOSS6

リースが期限切れになったとき、有効なリースが 1 つ以上残っている場合は、期限切れのアドレスが削除される直前にこのイベントスクリプトが呼び出されます。削除されるアドレスは IFF_DEPRECATED フラグでマークされます。

これらのイベントが発生するたびに、dhcpagent は次のコマンドを呼び出します。


/etc/dhcp/eventhook interface event

ここで interface は DHCP を使用しているインタフェースを、event は前述のイベントキーワードの 1 つをそれぞれ表します。たとえば、最初に ce0 インタフェースを DHCP 用に構成すると、dhcpagent は、イベントスクリプトを次のように呼び出します。


/etc/dhcp/eventhook ce0 BOUND

イベントスクリプト機能を使用するためには、次のことを行う必要があります。

イベントスクリプトは、そのプログラム環境を dhcpagent から継承し、root 特権で実行します。スクリプトでは、必要に応じて、dhcpinfo ユーティリティーを使ってより詳しいインタフェースの情報を取得できます。詳細は、dhcpinfo(1) のマニュアルページを参照してください。

dhcpagent デーモンは、イベントスクリプトがすべてのイベントに対して終了するまで待ちます。55 秒経ってもイベントスクリプトが終了しないと、dhcpagentSIGTERM シグナルをスクリプトプロセスに送信します。さらに、追加の 3 秒が過ぎてもプロセスが終了しないと、デーモンは SIGKILL シグナルを送信してプロセスを強制的に終了させます。

dhcpagent(1M) のマニュアルページにイベントスクリプトの一例が示されています。

例 16–3 は、DHCP イベントスクリプトを使って /etc/resolv.conf ファイルの内容を最新の状態に保つ方法を示しています。BOUNDEXTEND イベントが発生すると、スクリプトは、ドメインサーバーとネームサーバーの名前を変更します。 EXPIREDROPRELEASE イベントが発生すると、スクリプトは、ドメインサーバーとネームサーバーの名前をファイルから削除します。


注 –

このスクリプト例では、DHCP が、ドメインサーバー名およびネームサーバー名の正式な情報源であることを想定しています。さらに、DHCP 制御下のすべてのインタフェースが、一貫性のある最新の情報を返すことを想定しています。これらの前提は、実際のシステムの条件と一致しない場合があります。



例 16–3 /etc/resolv.conf ファイルを更新するイベントスクリプト

#!/bin/ksh -p

PATH=/bin:/sbin export PATH
umask 0222

# Refresh the domain and name servers on /etc/resolv.conf

insert ()
{
	dnsservers=`dhcpinfo -i $1 DNSserv`
	if [ -n "$dnsservers" ]; then
		# remove the old domain and name servers
		if [ -f /etc/resolv.conf ]; then
			rm -f /tmp/resolv.conf.$$
			sed -e '/^domain/d' -e '/^nameserver/d' \
			    /etc/resolv.conf > /tmp/resolv.conf.$$
		fi

		# add the new domain
		dnsdomain=`dhcpinfo -i $1 DNSdmain`
		if [ -n "$dnsdomain" ]; then
			echo "domain $dnsdomain" >> /tmp/resolv.conf.$$
		fi

		# add new name servers
		for name in $dnsservers; do
			echo nameserver $name >> /tmp/resolv.conf.$$
		done
		mv -f /tmp/resolv.conf.$$ /etc/resolv.conf
	fi
}

# Remove the domain and name servers from /etc/resolv.conf

remove ()
{
	if [ -f /etc/resolv.conf ]; then
		rm -f /tmp/resolv.conf.$$
		sed -e '/^domain/d' -e '/^nameserver/d' \
		    /etc/resolv.conf > /tmp/resolv.conf.$$
		mv -f /tmp/resolv.conf.$$ /etc/resolv.conf
	fi
}

case $2 in
BOUND | EXTEND)
	insert $1
	exit 0
	;;
EXPIRE | DROP | RELEASE)
	remove
	exit 0
	;;
*)
	exit 0
	;;
esac