ダイナミックDNSへの同期スクリプト
program
|
comments(0) | 2008/12/30 23:06
Value Domainからドメインを購入して 自宅サーバを作動させていますが、 プロバイダから付与されるIPアドレスが接続の度に変わるので 簡単なスクリプトを作成し5分毎にcronで実行しています。 以下使用中のスクリプト。
なお、スクリプトはLinux上で使用しているものです。流れとしては、
- 現在のIPアドレスを取得(初期設定でhttp://dyn.value-domain.com/cgi-bin/dyn.fcg?ipから)
- 取得IPをローカルに保存しておいたIPと比較
- 異っていた場合は取得IPをダイナミックDNSサービスに通知し、取得IPをローカルに保存する
- 2で同じだった場合は何もせず終了
ローカルに保存する仕様としたのは、 インターネット上に更新専用とはいえパスワードを垂れ流している(但しValue Domainの場合)ことに一抹の不安を覚えるからです。 まずはローカル内に保存したIPと比較することによりインターネット上へパスワードなどを垂れ流すのを最小限に抑えます。
ちなみに現在のIPアドレスはhttp://dyn.value-domain.com/cgi-bin/dyn.fcg?ipから取得します。 もし異る方法を希望する場合はGetGlobalIP関数内をいじくってください。 失敗した場合は1秒後に再試行するようにしています(初期設定では10回まで)。
その他の注意点は…
- bashスクリプトを実行できる環境が必要(Linux/Unixなど)
- 改変改造再配布はご自由に。ただし一切無保証、無責任。
- IP更新はValue Domain用に作成してあります。
- wgetが必要です(Wgetを使おう的ページ参照)。
以下がスクリプト全文です。
#! /bin/sh
#-*- coding:euc-jp; -*-
# this script use global variable
# --------------------------------------------------------------------
# Basic information
# --------------------------------------------------------------------
GET_IP_URL=http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip
GET_IP_ACCESS_COUNT_LIMIT=10
GLOBAL_IP_SAVED_FILE=/tmp/global_ip_saved
# --------------------------------------------------------------------
# Sync destination information
# --------------------------------------------------------------------
IPURL01='http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=your_domain.com&p=your_password&h=*'
IPURL02='http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=your_domain.com&p=your_password&h=mail'
IPURL03='http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=your_domain.com&p=your_password&h=@'
IPURL="$IPURL01 $IPURL02 $IPURL03"
# --------------------------------------------------------------------
# GetGlobalIP global IP address from value-domain service
# --------------------------------------------------------------------
GetGlobalIP () {
wget \
-O - $GET_IP_URL
}
# --------------------------------------------------------------------
# main
# --------------------------------------------------------------------
# get Global IP
GLOBAL_IP_TEMP=
COUNT=$GET_IP_ACCESS_COUNT_LIMIT
while [ $COUNT -gt 0 ] ;do
GLOBAL_IP_TEMP=`GetGlobalIP`
if [ x$GLOBAL_IP_TEMP = x ]; then
COUNT=$((COUNT - 1))
sleep 1
else
COUNT=0
fi
done
# get Saved IP
if [ -r $GLOBAL_IP_SAVED_FILE ]; then
MYDNS_IP_SAVED=`cat $GLOBAL_IP_SAVED_FILE`
else
MYDNS_IP_SAVED=
fi
# print header
echo -n `date +'%Y/%m/%d(%H:%M)'`
# check global ip addres
if [ x$GLOBAL_IP_TEMP = x ]; then
echo " Can't get Global IP (try $GET_IP_ACCESS_COUNT_LIMIT times)."
exit 0
else
echo -n " GlobalIP=$GLOBAL_IP_TEMP"
fi
# print saved ip
if [ x$MYDNS_IP_SAVED = x ]; then
echo -n " SavedIP=Empty"
else
echo -n " SavedIP=$MYDNS_IP_SAVED"
fi
# check saved ip
if [ x$GLOBAL_IP_TEMP = x$MYDNS_IP_SAVED ]; then
echo " ... Not updated. Done."
exit 0
else
echo -n " ... Begin to sync ..."
fi
# sync IP
for i in $IPURL
do
echo -n " `expr $i : ".*h=\([^&]*\)"`.`expr $i : ".*d=\([^&]*\)"`/"
if [ `wget -O - $i | grep "status=0"` ]
then
echo -n OK
else
echo -n ERROR
fi
done
# Update saved IP
echo -n $GLOBAL_IP_TEMP > $GLOBAL_IP_SAVED_FILE
echo " ... Update saved IP"
# exit
exit 0
使用している/etc/crontabから上のスクリプト部分(抜粋)。
# 5分毎に実行して、結果をログに保存
*/5 * * * * root /usr/local/bin/dynamicsync-server-ip >> /var/log/dynamicsync-server-ip.log
# 3時間毎にログを削除
0 */3 * * * root rm /var/httpd/dynamicsync-server-ip.log
cronで出力されたログ(/var/log/dynamicsync-server-ip.log)の内容例
2005/10/16(11:05) GlobalIP=211.231.12.1 SavedIP=211.231.12.1 ... Not updated. Done.
2005/10/16(11:10) GlobalIP=211.231.12.1 SavedIP=211.231.12.1 ... Not updated. Done.
2005/10/16(11:15) GlobalIP=211.231.12.1 SavedIP=211.231.12.1 ... Not updated. Done.
2005/10/16(11:20) GlobalIP=211.168.3.1 SavedIP=211.231.12.1 ... Begin to sync ... @.your_domain.com/OK mail.your_domain.com/OK ... Update saved IP
2005/10/16(11:25) GlobalIP=211.168.3.1 SavedIP=211.168.3.1 ... Not updated. Done.