[ SPECIAL ]

CentOS 5.6

browscap のデータファイルを自動的に更新する

2011/09/09 Tomohiro Kumagai
Update: 2011/10/16 Tomohiro Kumagai

□ browscap のデータファイルを自動更新する

訪問者の Web ブラウザーの種類を判定する方法として browscap を用いてブラウザーの判定を可能にする というお話を以前にしたことがありました。

この方法で CentOS 5.6 上で稼働している Apache でブラウザーの判定を行っていたのですけど、ブラウザーのバージョンアップや携帯電話やスマートフォンの新機種が登場すると、古い browscap のデータではそれらを正しく判定できなくなってしまうことがありました。

そのため、最新の browscap データファイルが出ていないかをチェックして、必要であれば差し替えるといった作業が必要になってくるのですけど、それもなかなか面倒で、忘れがちになってしまいます。

 

そこで、以前に DNS のルートヒントを自動的に更新する でやったのと同じ要領で、browscap のデータファイルも自動的にダウンロードして更新するようにしてみることにしました。

browscap データファイルが更新されたかどうかを監視するスクリプトを Cron で定期的に実行して、ファイルが更新されていたら、それをダウンロードして差し替えるスクリプトを作成してみました。差し替えの際には、ダウンロードされた新しい browscap データファイルと、以前の browscap との差分データが、テキストファイルで添付されるようにしてみています。

 

そんな感じで用意した browscap 自動更新スクリプトは、以下の内容になりました。これを今回は "/etc/browscap/update-browscap.sh" という名前で、サーバーに保存しておきます。

#!/bin/sh

############################################

NOTIFICATE_ADDRESS="root"

NOTIFICATE_SENDER="browscap"
BROWSCAP_URL="http://browsers.garykeith.com/stream.asp?PHP_BrowsCapINI"

BROWSCAP_FILENAME="php_browscap.ini"
BROWSCAP_DATADIR="/etc/httpd/browscap"

NOTIFICATE_TITLE="Update: browscap"

TMPDIR="/tmp"
RELOADCMD="service httpd reload"

############################################


get_fileinfo()
{
	local DATE=`date +%Y%m%d`

	local BROWSCAP_WITHOUT_EXT=${BROWSCAP_FILENAME%.*}
	local BROWSCAP_ONLY_EXT=${BROWSCAP_FILENAME##*.}

	TARGET_FILENAME="${BROWSCAP_WITHOUT_EXT}.${DATE}.${BROWSCAP_ONLY_EXT}"
	DIFF_FILENAME="${BROWSCAP_WITHOUT_EXT}.${DATE}.diff"

	TEMP_PATH="${TMPDIR}/${TARGET_FILENAME}.$$"
	TEMP_DIFF="${TMPDIR}/${DIFF_FILENAME}.$$"

	BROWSCAP_PATH="${BROWSCAP_DATADIR}/${TARGET_FILENAME}"
	BROWSCAP_LINK="${BROWSCAP_DATADIR}/${BROWSCAP_FILENAME}"
	BROWSCAP_DIFF="${BROWSCAP_DATADIR}/${DIFF_FILENAME}"
}

download_browscap()
{
	rm -f ${TEMP_PATH}
	wget ${BROWSCAP_URL} -O ${TEMP_PATH} > /dev/null

	return $?
}

check_update()
{
	diff "${TEMP_PATH}" "${BROWSCAP_LINK}" > "${TEMP_DIFF}"

	if test "$?" = 1
	then
		RESULT_VALUE=1
	else
		RESULT_VALUE=0
	fi

	return ${RESULT_VALUE}
}

message_attachment()
{
	local BOUNDARY="$1"
	local FILENAME="$2"
	local ATTACHNAME="$3"
	local OR_MESSAGE="$4"

	echo "--${BOUNDARY}"
	echo "Content-Type: text/plain;"
	echo "	format=flowed;"

	if test "${ATTACHNAME}" != ""
	then
		echo "	name=\"${ATTACHNAME}\";"
	fi

	echo "	charset=\"iso-2022-jp\";"
	echo "	reply-type=original"

	echo "Content-Transfer-Encoding: 7bit"

	if test "${ATTACHNAME}" != ""
	then
		echo "Content-Disposition: attachment;"
		echo "	filename=\"${ATTACHNAME}.txt\""
	fi

	echo

	if test "${FILENAME}" != ""
	then
		cat "${FILENAME}"
	else
		echo "${OR_MESSAGE}"
	fi

	echo ""
}

message_for_notificate()
{
	local TO="$1"
	local FROM="$2"
	local SUBJECT="$3"
	local MESSAGE="$4"

	local BOUNDARY='-----------EZAUTOUPDATEBROWSCAP'
	local CHARSET='iso-2022-jp'

	echo "To: ${TO}"
	echo "From: ${FROM}"
	echo "Subject: ${SUBJECT}"
	echo "MIME-Version: 1.0"
	echo "Content-Type: multipart/mixed;"
	echo "	boundary=\"${BOUNDARY}\""
	echo "Content-Transfer-Encoding: 7bit"
	echo "X-Mailer: EZ-NET Browscap updater"
	echo ""
	echo "This is a multi-part message in MIME format."
	echo ""

	message_attachment "${BOUNDARY}" "" "" "${MESSAGE}"
	message_attachment "${BOUNDARY}" "${BROWSCAP_PATH}" "${TARGET_FILENAME}"
	message_attachment "${BOUNDARY}" "${BROWSCAP_DIFF}" "${DIFF_FILENAME}"

	echo "--${BOUNDARY}--"
}

send_notificate()
{
	echo ${MAIL_MESSAGE}

	local SUBJECT="${NOTIFICATE_TITLE}: ${MAIL_STATUS}"

	message_for_notificate "${NOTIFICATE_ADDRESS}" "${NOTIFICATE_SENDER}" "${SUBJECT}" "${MAIL_MESSAGE}" | sendmail "${NOTIFICATE_ADDRESS}"

	return $?
}

update_browscap()
{
	mv -vf "${TEMP_DIFF}" "${BROWSCAP_DIFF}"
	mv -vf "${TEMP_PATH}" "${BROWSCAP_PATH}"

	if test "$?" = 0
	then
		rm -f "${BROWSCAP_LINK}"
		ln -vs "${BROWSCAP_PATH}" "${BROWSCAP_LINK}"

		${RELOADCMD}
	fi

	if test "$?" = 0
	then

		MAIL_STATUS="Succeeded"
		MAIL_MESSAGE="The browscap '${BROWSCAP_LINK}' was updated successfully."
	else
		MAIL_STATUS="Failed"
		MAIL_MESSAGE="Failed to update the browscap '${BROWSCAP_LINK}'."
	fi

	send_notificate
}


get_fileinfo

download_browscap

if test "$?" = 0
then
	check_update

	if test $? = 1
	then
		update_browscap;

		EXIT_CODE=$?
	else
		echo "The browscap '${BROWSCAP_LINK}' is up to date."

		EXIT_CODE=1
	fi
else
	EXIT_CODE=1

	MAIL_STATUS="Failed"
	MAIL_MESSAGE="Failed to download a browscap file from '${BROWSCAP_URL}'"

	send_notificate
fi

rm -f ${TEMP_PATH}
rm -f ${TEMP_DIFF}

echo "done."

スクリプトの動作は、冒頭に定義されている変数で、環境に合わせて値を調整します。

NOTIFICATE_ADDRESS browscap データファイルの自動更新を行った際や、自動更新の処理中にエラーが発生した場合に通知するメールアドレスです。
mail コマンドでメールを送信します。
NOTIFICATE_SENDER 通知メールの送信元として指定されるアドレスです。
BROWSCAP_URL ダウンロードしたい browscap データファイルへの URL です。
wget コマンドでダウンロードを試みます。
BROWSCAP_FILENAME 運用中のサーバーに保存されている browscap ファイルのファイル名です。
ファイル名および拡張子名のみで指定し、ディレクトリ名は含みません。
BROWSCAP_DATADIR 運用中のサーバーで、browscap データファイルを格納しているディレクトリ名です。
ディレクトリ名の末尾には "/" は記載せずに指定します。
RELOADCMD browscap データファイルを差し替えた後には Web サーバーの設定再読み込みが必要なため、ここで Web サーバーに設定を再読み込みさせるためのコマンドを設定します。

 

これらの値を環境に合わせて調整したら、このスクリプトに次のようにして実行権限を与えます。

chmod +x /etc/browscap/update-browscap.sh

後はこれを実行すれば、browscap データファイルをサーバーからダウンロードして、それが運用サーバーに保存されているものと異なるようであれば、差し替える処理を行ってくれます。

この自動更新スクリプトを定期的に自動実行させたい場合には、CentOS 5.6 であれば、次のようにして Cron に登録してあげるます。

ln -s /etc/browscap/update-browscap.sh /etc/cron.weekly/

例えばこのようにすることで、CentOS 5.6 であれば、毎週日曜日の午前 3 時 49 分に、登録した browscap 自動更新スクリプトが実行されるようになりました。自動実行のタイミングについては、どの程度の頻度で更新されたいかなど、サイトの事情に合わせて設定すると良いと思います。

このように設定して、指定したスケジュールごとに自動的に browscap のデータファイルのチェックが行われて、更新があった場合には、差し替えが自動で行われるようになりました。


 

カスタム検索

copyright © Tomohiro Kumagai @ EasyStyle G.K.
contact me: please from mail-form page.