以前にPHPで作ってみたんだけど、CentOS6では何故かうまく動かなかったのでBシェルで作り直してみた。
スクリプトは下記の通り。
[root@centos ~]# vim /root/bin/vdupdate.sh
#!/bin/sh
Fqdn='dyn.value-domain.com'
Domain='si1230.com' # ドメイン名を環境に合わせて設定
Password='xxxxxxxx' # パスワードを環境に合わせて設定
Host=$1 # ホスト名を引数にする
Url="http://$Fqdn/cgi-bin/dyn.fcg?d=$Domain&p=$Password&h=$Host"
WLog=`mktemp`
WFile=`mktemp`
LDir="/var/log/vdupdate/$1"
LFile="$LDir/update.log"
Error="$LDir/error.log"
LDate=`date +"%Y/%m/%d %H:%M:%S"`
Mailto='admin@si1230.com' # エラー時の通知先メールアドレス
Subject='VDUPDATE Error'
# ログディレクトリが無かったら作る
if [ ! -d $LDir ]; then
mkdir -p $LDir
fi
# 引数にホスト名が設定されてなかったらエラーログとメールを出して停止
if [ ! -n "$Host" ]; then
EMsg='Host argument is not set!'
echo "$LDate $EMsg" >> $Error | echo "$0 $EMsg" | mail -s "$Subject" "$Mailto"
exit
fi
wget "$Url?d=$Domain&p=$Password&h=$Host" -o $WLog -O $WFile
# メッセージはGoogle翻訳そのまま
Result=`awk -F '=' '/status=/{print $2}' $WFile` # ステータスコードのみ取得
LFormat="$Host.$Domain: Status=$Result:"
Status0="Update successful"
Status1="Bad request"
Status2="Password and an incorrect domain name"
Status3="Invalid IP address"
Status4="Passwords do not match"
Status5="Database server is congested"
Status9="Other errors"
# ログ書き込みとステータスコードが0(正常)以外はメール
case $Result in
'0') echo "$LDate $LFormat $Status0" >> $LFile ;;
'1') echo "$LDate $LFormat $Status1" >> $LFile | echo "$0 $LFormat $Status1" | mail -s "$Subject" "$Mailto" ;;
'2') echo "$LDate $LFormat $Status2" >> $LFile | echo "$0 $LFormat $Status2" | mail -s "$Subject" "$Mailto" ;;
'3') echo "$LDate $LFormat $Status3" >> $LFile | echo "$0 $LFormat $Status3" | mail -s "$Subject" "$Mailto" ;;
'4') echo "$LDate $LFormat $Status4" >> $LFile | echo "$0 $LFormat $Status4" | mail -s "$Subject" "$Mailto" ;;
'5') echo "$LDate $LFormat $Status5" >> $LFile | echo "$0 $LFormat $Status5" | mail -s "$Subject" "$Mailto" ;;
'9') echo "$LDate $LFormat $Status9" >> $LFile | echo "$0 $LFormat $Status9" | mail -s "$Subject" "$Mailto" ;;
esac
rm -f $WLog $WFile
パスワード、ドメインを引数にしても良いが、パーミッションを考慮して直書きにする。あとはVALUE-DOMAINが公表しているステータスコードがいいかげんだ。パスワードが間違っていても正常(0)を返してくる。その他は簡単に確認したのみ。
そしてrootのみ実行可能にする。
[root@centos ~]# chmod 700 /root/bin/vdupdate.sh
cronに登録する。実行するユーザごとにファイルを分けている。
[root@centos ~]# vim /etc/cron.d/root
*/30 * * * * root /root/bin/vdupdate.sh www */30 * * * * root /root/bin/vdupdate.sh www1 */30 * * * * root /root/bin/vdupdate.sh www2
一応、ログローテーション設定をしてみる。Yumの設定を参考に。
[root@centos ~]# vim /etc/logrotate.d/vdupdate
/var/log/vdupdate/*log {
missingok # ログファイルが存在しなくてもエラーを出さない
notifempty # ログファイルが空ならローテーションしない
size 30k # これより大きい場合にローテーションする
monthly # 月次でローテーションする
create 0600 root root # ローテーション後に新たな空のログファイルを作成
}
[ad#ad-1]
VALUE-DOMAINのダイナミックDNS更新スクリプトを作ってみた

