#!/bin/sh
export LANG=ja_JP.UTF-8

# Ver 20120206

# サブドメインの指定
SUB="winows"

# 取得したいグローバルIPアドレスのゲートウェイを指定。
# この場合、IPアドレス取得ページへアクセスする時に限り192.168.10.1ルーターを使用する。
# ルータ1機にてルーティングで対応する場合はデフォルトゲートウェイを指定して下さい。
GW="192.168.10.1"

# DNSファイルの指定
FILE="/var/named/chroot/var/named/ry.tl.db.wan"

# DNSレコードを変更した場合にメールを送信するか否か。「no」で無効。（デフォルト有効）
MAILMESSAGES="yes"
# メール送信先アドレス。（デフォルトroot宛）
MAILADDRESS="root"
# TMPディレクトリ
TMP_DIR="/tmp"

# ルーティングテーブルを一時的に書き換えるか否か。「no」で無効（デフォルト有効）
# ルーター1機構成で適切に設定している場合や、
# サブドメイン側IPのプロキシサーバーを経由している等でwgetを制御出来ている場合は無効でも可
ROUTE="yes"

# 以降設定不要

# 日付取得
DATE=`date '+%Y%m%d'`
DATE2=`date '+%Y/%m/%d %k:%M:%S'`

# TMPファイル定義
TMP="$TMP_DIR/DNS.tmp"
TMP_MISS="$TMP_DIR/DNS_MISS.tmp"

# ルーティングテーブルを一時的に変更
if [ $ROUTE = "yes" ] ; then
	route add 202.229.158.229 gw $GW
	GW_FLAG="1"
else
	GW_FLAG="0"
fi

# 現在のIPアドレス取得
IP=`wget  -t 1 -T 1 -q -O - 202.229.158.229/ip.shtml | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"`
# →高負荷時に失敗する等、場合によってはタイムアウト時間（-T）及びリトライ回数（-t）を変更して下さい。

# IPアドレス取得失敗時、処理の中止
if [ "$IP" = "" ] ; then
# メール送信用
        if [ $MAILMESSAGES = "yes" -a ! -e $TMP_MISS ] ; then
		echo -e "IPアドレスの取得に失敗しました。"| mail -s "$0" $MAILADDRESS
		echo [$DATE2] IPアドレスの取得に失敗 >> $TMP_MISS
	fi
	exit 0
else
	rm -rf $TMP_MISS
fi

# 現在設定している情報取得
DNSR=`cat $FILE | grep -w $SUB`
# IPアドレス取得
DNSIP=`cat $FILE | grep -w $SUB | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"`
# Serial取得
SERIAL_DATE=`cat $FILE | grep -o "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"`
SERIAL=`cat $FILE | grep -o "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"`

FLAG="0"

# 登録が無い場合
if [ "$DNSR" = "" ] ; then
	FLAG="1"
	echo $SUB    IN A     $IP >> $FILE
# 登録されているIPアドレスと現在のIPアドレスに相違がある場合
elif [ "$DNSIP" != "$IP" ] ; then
	FLAG="1"
	sed -i "s/$DNSIP/$IP/g" $FILE
fi
# シリアル変更
if [ $FLAG -eq 1 ] ; then
	if [ "$SERIAL_DATE" = "$DATE" ] ; then
		NEWSERIAL=`expr $SERIAL + 1`
		sed -i "s/$SERIAL/$NEWSERIAL/g" $FILE
	else
		NEWSERIAL="${DATE}01"
		sed -i "s/$SERIAL/$NEWSERIAL/g" $FILE
	fi
fi

# ゾーン書き換えた場合
if [ $FLAG -eq 1 ] ; then
# DNSサーバーを再起動
	/etc/rc.d/init.d/named restart
# メール送信用
	if [ $MAILMESSAGES = "yes" ] ; then
		echo "IPアドレスの変更を検知。DNS設定を変更しました。" > $TMP
		echo "[$DNSIP]→[$IP]" >> $TMP
		echo "" >> $TMP
		cat $FILE >> $TMP
		cat $TMP | mail -s "$0" $MAILADDRESS
		rm -f $TMP
	fi
fi

# ルーティングテーブルを書き換えている場合は、元に戻す
if [ $GW_FLAG -eq 1 ] ; then
	route del 202.229.158.229 gw $GW
	GW_FLAG="0"
fi

