IPアドレス自動更新DDNS(ddo.jp)

今使ってるスクリプトで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

DDNSの自動更新エラー

今日、DDNSの自動更新エラーのメールが届いた

Cron <root@server1> /usr/ddns/ddo.jpIP_upgrade.pl
Looking up info.ddo.jp
Unable to locate remote host info.ddo.jp.
Alert!: Unable to connect to remote host.
lynx: Can't access startfile http://info.ddo.jp/remote_addr.php

自宅サーバーは「lynx」を使い、「ddo.jp」にアクセスしてリモートアドレスを取得、取得したアドレスをサーバーに記録、時間をおいて、「ddo.jp」にアクセスしてリモートアドレスを取得、サーバーに記録しているアドレスと比較する。一致していればなにもしないでそのまま、一致していなければアドレスを更新するという仕組みなっている。ところが、今回はどうも肝心要の「ddo.jp」にアクセスできてないようだ。

[root@server1 ~]# /usr/ddns/ddo.jpIP_upgrade.pl
探索中: info.ddo.jp
リモートホスト info.ddo.jp の位置を特定できません。
警告!: リモートホストに接続できません。
lynx: スタートファイルにアクセスできません http://info.ddo.jp/remote_addr.php

ということで、一旦「lynx」をアンインストールして新たにインストールしなおしてみた。

[root@server1 ~]# yum remove lynx
[root@server1 ~]# yum install lynx
Loaded plugins: downloadonly, fastestmirror, priorities, refresh-packagekit, security
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* centosplus: ftp.tsukuba.wide.ad.jp
* epel: mirror.premi.st
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
101 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package lynx.x86_64 0:2.8.6-27.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
====================================================================================================
Package             Arch                  Version                        Repository           Size
====================================================================================================
Installing:
lynx                x86_64                2.8.6-27.el6                   base                1.3 M
Transaction Summary
====================================================================================================
Install       1 Package(s)
Total download size: 1.3 M
Installed size: 4.7 M
Is this ok [y/N]: y
Downloading Packages:
lynx-2.8.6-27.el6.x86_64.rpm                                                 | 1.3 MB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : lynx-2.8.6-27.el6.x86_64                                                         1/1
Verifying  : lynx-2.8.6-27.el6.x86_64                                                         1/1
Installed:
lynx.x86_64 0:2.8.6-27.el6
Complete!

「lynx」とは、IE、Firefox等とは違い、コンソールのようなテキストしか表示出来ない環境でも、テキストベースでWebページを表示することができる。
インストールし直してみたらちゃんと動くようになった。
[root@server1 ~]# lynx url ddo.jp/
20140529-ws000085
lynxコマンドでリモートアドレス取得先のURLを入れてみると、ちゃんとリモートアドレスを取得できたようだ。
[root@server1 ~]# lynx url info.ddo.jp/remote_addr.php
20140529-ws000086
エラーも出なくなった。