今使ってるスクリプトでDDNSの自動更新がうまくいかないこともあり、たびたびアクセスできなくなることがあったので、自動更新のスクリプトを見直すことに。このサイトはddo.jpのDDNSを使ってるので、いろいろ調べて見たら、こちらのサイトで紹介されてるスクリプトが良さそうなので使わせてもらうことにした。
自動更新の動きとしては
(1)ddo.jpサイトで用意しているリモートIP確認サイトで現在のIPを確認。
(2)前回更新時のIPと変更時間をテンポラリーファイルから読み込む。
(3)前回更新時とIP同じで、かつ前回更新時から1週間以上経ってなかったら終了。
(4)そうでなかったら、DDNSを更新。変更内容をテンポラリーファイルとログに書き込む。
という感じで自動更新されるとのこと。あとこのスクリプトは、lynxが使えることが前提となってるようなので、まずlynxをインストールすることにする。
■ lynxのインストール
[root@server ~]# yum -y install lynx
■ 自動更新スクリプトの作成
[root@server1 ~]# cd /usr ← /usr ディレクトリへ移動 [root@server1 usr]# mkdir -p ddns ← ddns ディレクトリの作成 [root@server1 usr]# cd ddns ← ddns ディレクトリへ移動 [root@server1 ddns]# vi ddo.jpIP_upgrade.pl ← 自動更新スクリプトの作成 #!/usr/bin/perl # # Check ip address, and update DDNS for "ddo.jp" # # # parameters # "ddo.jp" ID & PASSWD local $ID = 'ドメイン'; # Login ID(It serves as a domain name) local $PASSWD = 'パスワード'; # Login password # file names local $CRT_IPF = '/tmp/CRT_IP2.dat'; local $LOG = '/var/log/ddns.log'; # Check current ip address on the appointed URL web page. local $CHK_URL="http://info.ddo.jp/remote_addr.php"; # local $INTERVAL = 604800; # 1 weeks # $ENV{'PATH'}="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"; #--------------------------------------------------- # main my ($NEW_IP,$CRT_IP,$CRT_TIME,$i); # get current ip address which set as the domain. $CRT_IP = ""; $CRT_TIME = "0"; open(INPUT, $CRT_IPF); foreach(<INPUT>){ chop; /^IP:/ && do{ $CRT_IP = $' }; /^TIME:/ && do{ $CRT_TIME = $' }; } close(INPUT); # check a assigned ip address open(INPUT, "lynx -dump \"$CHK_URL\" | "); foreach(<INPUT>){ /([0-9\.].*)/ && do{ $NEW_IP = $1}; } close(INPUT); # Lapsed time from the last update $i = time() - $CRT_TIME; # change DDNS, supposing the IP address is changed. if ( ( ($NEW_IP ne "" )&&($CRT_IP ne $NEW_IP) ) || ( $i > $INTERVAL) ) { # change DDNS open(INPUT2, "lynx -dump \"http://ddo.jp/dnsupdate.php?dn=$ID&ip=$NEW_IP&pw=$PASSWD\" |"); # check whether change of DDNS has been successful foreach(<INPUT2>){ /SUCCESS: / && do{ $TEMP = 1;}; } if( $TEMP == 1){ # save a new IP address. $i = time(); open (OUTPUT ,">$CRT_IPF"); print OUTPUT "IP:$NEW_IP\nTIME:$i\n"; close OUTPUT; # write a message on the log file $time = conv_date(time()); open(LOG, ">> $LOG"); print(LOG $time . ":change \"" . $ID . ".ddo.jp\" <= " . $NEW_IP . "\n"); close(LOG); } } sub conv_date{ my ($times,$mode) = @_; my ($sec,$min,$hour,$mday,$month,$year,$wday); ($sec,$min,$hour,$mday,$month,$year,$wday,undef,undef) = localtime($times); $month++; $year += 1900; $times = sprintf("%d/%02d/%02d %02d:%02d", $year, $month, $mday, $hour, $min); return($times); }
■ スクリプトに実行権限を与える
[root@server1 ddns]# chmod +x ddo.jpIP_upgrade.pl
■ このスクリプトを毎時2分、5分、8分と3分おきに実行するように /etc/cron.d/ に追加。※メインサーバーのみ
[root@server1 ~]# echo "2-59/3 * * * * root /usr/ddns/ddo.jpIP_upgrade.pl" > /etc/cron.d/ddns
■テンポラリーファイルとログファイルの作成
[root@server1 ~]# echo -n "" > /tmp/CRT_IP2.dat [root@server1 ~]# echo -n "" > /var/log/ddns.log
■ 停電などで再起動させたとき自動で実行するように設定※メインサーバーのみ
[root@server1 ~]# vi /etc/rc.local ← システム起動時実行コマンド定義ファイル編集 以下を最終行へ追加 chmod +x /usr/ddns/ddo.jpIP_upgrade.pl /usr/ddns/ddo.jpIP_upgrade.pl