2010/03/06

linux(というかdebian)でvaluedomainのDDNSを更新するスクリプト

ダイナミックDNS(DDNS)Value-Domain 自動登録スクリプト
bash 入門
if 文と test コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス

を参考にさせて頂きました。

あまり原型を残してませんが、
・bashの勉強に作ってみた
・WANのIPアドレスが変化したときに更新
・DNSの情報と自分のIPアドレスが一致しないときも更新(ホストが*な時を除く)
・関数で回せるので複数のドメインを更新するときにはそれで
・lynxを入れてないのでwgetを使う
ようにした感じです。

とりあえずエラーは出なかったのできっと動いてるんでしょう。変数が全て{}で括ってあるのは趣味です。
不備があればご指摘頂ければ幸いです。

使い方は元と同じで、スクリプトに必要な情報を書いて、/etc/crontabに設定するか、crontab -eでユーザ毎に設定するかです。
パスワードとかは直書きなのでchmod 700を忘れずに・・・。

# for yourdomain.com Value-Domain update
*/10 * * * * /usr/local/etc/DDNS/yourdomain.com.sh
20 1 */3 * * /usr/local/etc/DDNS/yourdomain.com.sh reflesh

ハマッたのは
http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=ドメイン名&p=パスワード&h=ホスト名&i=IPアドレス
で成功したときに帰ってくるのが
status=0 ”改行” OK
ってところで。改行があることに気がつかず、条件が成立しない、と延々と悩んでました。
あとは関数に*を渡すときダブルクォートを付けずに渡していたので展開されてしまっていたところ。

nslookupもdigもdnsutilsに入っているのですが、一緒に他の物も入れるのがしゃくだったんでコマンドだけのhostになったという・・・。


#!/bin/bash
#参考:http://miyazaki.ddo.jp/linuxserver/ddns_valuedomain.html
#require-package host wget bash ・・・後は何だろ?
#
#
# for yourdomain.com Value-Domain update
# crontab -e and write like as follows
# */10 * * * * /usr/local/etc/ddns/valuedomain.sh >/dev/null 2>&1
# 20 0 */7 * * /usr/local/etc/ddns/valuedomain.sh reflesh >/dev/null 2>&1


function setip()
{
local DOMAIN=$1
local PASS=$2
local HOST=$3
# local WANIP=$4

case ${HOST} in
'*' ) local HOST2="_.";;
'@' ) local HOST2="";;
* ) local HOST2="${HOST}.";;
esac

local IPFILE="${IPDIR}${HOST2}${DOMAIN}.ipaddress"

if [ ! -f "${IPFILE}" ]; then
echo "0.0.0.0" > "${IPFILE}"
elif [ "${REFLESH}" = "reflesh" ]; then
rm -f ${IPFILE}
/usr/bin/logger -p daemon.info -t ${LOGTAG} "reflesh ${IPFILE}"
return 0
fi

# 外部IPアドレスが前回もしくはdnsの正引きIPアドレスと異なる場合に更新
if [ "${WANIP}" != "`cat \"${IPFILE}\"`" ] || \
{ [ "${HOST}" != '*' ] && \
[ -z "`host ${HOST2}${DOMAIN} ${NAMESERV} | grep ${WANIP}`" ] ;}; then

local URL="${CGI}d=${DOMAIN}&p=${PASS}&h=${HOST}&i=${WANIP}"
local RESULT="`wget \"${URL}\" -q -O - | grep status`"

if [ "${RESULT}" = "status=0" ]; then
/usr/bin/logger -p daemon.info -t ${LOGTAG} "${HOST}.${DOMAIN} ipaddress=${WANIP} ${RESULT}"
echo "${WANIP}" > "${IPFILE}"
return 0
else
/usr/bin/logger -p daemon.warning -t ${LOGTAG} "${HOST}.${DOMAIN} ipaddress=${WANIP} ${RESULT}"
return 1
fi
fi

return 0
}


# VALUEDOMAIN 更新CGI
CGI='http://dyn.value-domain.com/cgi-bin/dyn.fcg?'
# VALUEDOMAIN 自グローバルIPアドレス取得CGI
WANIP=`wget http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip -q -O -`
# VALUEDOMAIN NS(問い合わせ先) 指定しなくても良い
NAMESERV="ns$(((RANDOM%5)+1)).value-domain.com"
# log tag
LOGTAG=ddns
# tmpファイルの場所を指定
IPDIR="/tmp/ddns/"
[ -d ${IPDIR} ] || mkdir ${IPDIR};
# 第1引数はrefleshするかどうか ==refleshでファイル削除
REFLESH=$1

if [ "${WANIP}" = "" ]; then
RESULT="could not retrieve global IP address"
/usr/bin/logger -p daemon.warning -t ${LOGTAG} ${RESULT}
exit 1
fi

# DOMAIN='ドメイン名'
# PASS='パスワード'
# HOST='ホスト名(@や*)'

# setip "${DOMAIN}" "${PASS}" "${HOST}" "${WANIP}"
setip "${DOMAIN}" "${PASS}" "${HOST}"

exit 0


(備考)
・よくよく考えると外部IPアドレスと違う場合の判定だけでよい気がするけど、ホスト名が*の時はどうしようもないので良いか・・・。

0 件のコメント:

コメントを投稿