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」とか適当な値を書いておかないと始まらない。
- 詳しくはスクリプトをよんでください。
では。今年もよろしくです。