今使ってるスクリプトでDDNSの自動更新がうまくいかないこともあり、たびたびアクセスできなくなることがあったので、自動更新のスクリプトを見直すことにした。この自宅サーバはddo.jpのDDNSを使ってるので、いろいろ調べて見たら、こちらのサイトで紹介されてるスクリプトが良さそうなので使わせてもらうことにした。
自動更新の動きとしては
(1)ddo.jpサイトで用意しているリモートIP確認サイトで現在のIPを確認。
(2)前回更新時のIPと変更時間をテンポラリーファイルから読み込む。
(3)前回更新時とIP同じで、かつ前回更新時から2週間以上経ってなかったら終了。
(4)そうでなかったら、DDNSを更新。変更内容をテンポラリーファイルとログに書き込む。
という感じで自動更新されるとのことなので、<2週間以上経ってなかったら終了>の所を1週間に変更して使うことにした。
あとこのスクリプトは、lynxが使えることが前提となってるようなので、まずlynxをインストールすることにする。
[root@server ~]# yum -y install lynx
今までと同じディレクトリに作成
[root@server ~]# cd /usr ← /usr ディレクトリへ移動 [root@server usr]# mkdir -p ddns ← ddns ディレクトリの作成 [root@server usr]# cd ddns ← ddns ディレクトリへ移動
■ 自動更新スクリプトの作成
[root@server 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@server ddns]# chmod +x ddo.jpIP_upgrade.pl
■ このスクリプトをcronで1分おきに実行するように/etc/crontabに追加。
[root@server ddns]# cd [root@server ~]# vi /etc/crontab */1 * * * * root /usr/ddns/ddo.jpIP_upgrade.pl
■ 停電などで再起動させたとき自動で実行するように設定
[root@server ~]# vi /etc/rc.local ← システム起動時実行コマンド定義ファイル編集 以下を最終行へ追加 chmod +x /usr/ddns/ddo.jpIP_upgrade.pl /usr/ddns/ddo.jpIP_upgrade.pl