ValueDomain用のdynamicDNS更新のBashスクリプト

前々からDiCE使ってましたが、なぜか無駄にCPU食ってるので、
スクリプト作ってcronでまわそうかと思って作りました。
(それにしても、何でほとんどアイドルのはずなのに10%とかとるんだろ?)
調べてみたら何人もやってる人が居ましたが…さっき出来たので。

参考:http://team2ch.org/blog/?p=894

上記のスクリプトを拝借させていただき、ちょこっと改造しました。
まだBashは慣れません…。


こうした:

  • 沢山あるドメイン、ホストを順々に登録。
  • 帰ってきたエラーによって再実行するかどうか判断。
  • グローバルIPわからないので、valueドメインに教えてもらう…(一日一回にするから許してね)
#!/bin/bash

# "ドメイン ホスト1 ホスト2 ホスト3 ..." というふうに指定する。
vdomains=(
    "smihica.com @ www"
    "sh-a.jp @ www"
    "ranoba.com @ www static"
    "geidai-kendo.com @ www"
    )

# パスワード
passwds=(
    "passwd"
    "passwd"
    "passwd"
    "passwd"
    )

# value domainのミラーサーバ
# busyとかが帰ってきたときに順々に接続していく。
servers=(
    "dyn.value-domain.com"
    "dyn1.value-domain.com"
    "dyn2.value-domain.com"
    "dyn3.value-domain.com"
    "dyn4.value-domain.com"
    "dyn5.value-domain.com"
)

# Getting the current script directory
current_dir=`echo $(cd $(dirname $0);pwd)`

# Get older ip address
oldip=`cat $current_dir/last_ip`;

# Get new ip address
wget -q -O last_ip "http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip"
newip=`cat $current_dir/last_ip`;

sleep 5

function try_renew_host { # domain host pass newip
    local domain=$1
    local host=$2
    local pass=$3
    local newip=$4
    local result=""

    local count=0
    for server in "${servers[@]}"; do

        result=""
        echo -n > $current_dir/last_status_$domain

        echo "(`date '+%y%m%d%H%M%S'`)" wget -O $current_dir/last_status_$domain "http://${servers[count]}/cgi-bin/dyn.fcg?d=$domain&p=$pass&h=$host&i=$newip" >> $current_dir/log;
        wget -O $current_dir/last_status_$domain "http://${servers[count]}/cgi-bin/dyn.fcg?d=$domain&p=$pass&h=$host&i=$newip"
        result=`sed -e '2,$d' -e 's/^status=//g' "$current_dir/last_status_$domain"`
        if [ "$result" = "0" ]; then
            echo "(`date '+%y%m%d%H%M%S'`) \"$host.$domain\" -> \"$newip\" Renew ip success !!" >> $current_dir/log;
            break
        elif [ "$result" = "5" -o "$result" = "9" ]; then
            echo "(`date '+%y%m%d%H%M%S'`) database srever is busy or other error. -> $result" >> $current_dir/log;
            sleep 20
            echo "(`date '+%y%m%d%H%M%S'`) retry." >> $current_dir/log;
            count=$count+1
            continue
        else
            echo "(`date '+%y%m%d%H%M%S'`) ERROR !!! -> $result." >> $current_dir/log;
            cat $current_dir/last_status_$domain >> $current_dir/log;
            echo "">> $current_dir/log;
            break
        fi
    done
}

function try_renew { #domain_and_hosts pass newip
    local dah=($1)
    local pass=$2
    local newip=$3
    local domain="${dah[0]}"

    local count=0
    for h in "${dah[@]}"; do
        if [ $count -ne 0 ]; then
            try_renew_host "$domain" "${dah[count]}" "$pass" "$newip"
            sleep 8
        fi
        count=$(($count+1))
    done
}

# Renew (or do not renew)
if [ "$oldip" != "$newip" ]; then
    echo "(`date '+%y%m%d%H%M%S'`) *** IP address changing detected! *** $oldip -> $newip" >> $current_dir/log;
    count=0
    for vd in "${vdomains[@]}"; do

        try_renew "${vdomains[count]}" "${passwds[count]}" "$newip"

        count=$(($count+1))
    done
fi

# status code.
#0 succeed.
#1 invalid request.
#2 invalid domain or passwd.
#3 invalid ip address.
#4 password authentication failed.
#5 database server is busy.
#9 other error.

見てのとおり、「5 database server is busy」 か 「9 other error」
が帰ったらサーバをミラーにしてやり直す。
あと、ドメインの後にホストを好きなだけ追加できるので、定義が楽になった。
ログは以下のようになる。

(110107003532) *** IP address changing detected! *** 0.0.0.0 -> 125.54.116.187
(110107003532) wget -O /last_status_smihica.com http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=smihica.com&p=&h=@&i=125.54.116.187
(110107003532) "@.smihica.com" -> "125.54.116.187" Renew ip success !!
(110107003540) wget -O /last_status_smihica.com http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=smihica.com&p=&h=www&i=125.54.116.187
(110107003540) "www.smihica.com" -> "125.54.116.187" Renew ip success !!
(110107003548) wget -O /last_status_sh-a.jp http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=sh-a.jp&p=&h=@&i=125.54.116.187
(110107003548) database srever is busy or other error. -> 5
(110107003608) retry.
(110107003608) wget -O /last_status_sh-a.jp http://dyn1.value-domain.com/cgi-bin/dyn.fcg?d=sh-a.jp&p=&h=@&i=125.54.116.187
(110107003608) "@.sh-a.jp" -> "125.54.116.187" Renew ip success !!
(110107003616) wget -O /last_status_sh-a.jp http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=sh-a.jp&p=&h=www&i=125.54.116.187
(110107003616) "www.sh-a.jp" -> "125.54.116.187" Renew ip success !!
(110107003624) wget -O /last_status_ranoba.com http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=ranoba.com&p=&h=@&i=125.54.116.187
(110107003624) "@.ranoba.com" -> "125.54.116.187" Renew ip success !!
(110107003632) wget -O /last_status_ranoba.com http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=ranoba.com&p=&h=www&i=125.54.116.187
(110107003632) "www.ranoba.com" -> "125.54.116.187" Renew ip success !!
(110107003640) wget -O /last_status_ranoba.com http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=ranoba.com&p=&h=static&i=125.54.116.187
......
  • エラーのときちゃんとやり直してる。えらいぞ。
  • passwordとかディレクトリとかは消してある。
  • あとは、これをcronに一日とか半日で登録すれば良いと思う。
  • もしこれを使う場合は、同じディレクトリに「last_ip」というファイルを作って、「0.0.0.0」とか適当な値を書いておかないと始まらない。
  • 詳しくはスクリプトをよんでください。

では。今年もよろしくです。