前のページ « | 1 | » 次のページ

DDNS(ddo.jp)自動更新

2009, 01, 24

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


前のページ « | 1 | » 次のページ