今日は、DDNS自動更新する仕掛けをでーもん君に仕込みます。
  DDNSについては、「DDNSとは」とかのキーワードでググって見てください。

 さて、自分はddo.jpDDNSを使っています。で、IPが変わったときにDDNS自動更新するには、何らかの仕掛けを仕込む必要があります。windowsだったら、DiCE for Windowsが有名だけど、UNIX系はとくに専用のツールがあるわけではないです。なんで、LinuxやFreeBSDでは作りこまなければならないんですが、この程度のことならシェルとかperlとかで作りこんでcronでグルグルまわす程度で実現できてしまいます。(まあ、比較的楽にできるから専用のツールがないというウワサもあるけどΣ(´д`ノ)ノ )

 そんなわけで、DDNS(ddo.jp)を自動更新する仕掛けをperlで作りました。動きとしては、
  (1)ddo.jpサイトで用意しているリモートIP確認サイトで現在のIPを確認。
  (2)前回更新時のIPと変更時間をテンポラリーファイルから読み込む。
  (3)前回更新時とIP同じで、かつ前回更新時から2週間以上経ってなかったら終了。
  (4)そうでなかったら、DDNSを更新。変更内容をテンポラリーファイルとログに書き込む。

 あとこのperlスクリプトは、lynxが使えることが前提になります。

#!/usr/bin/perl
#
# Check ip address, and update DDNS for "ddo.jp"
#
#

# parameters
# "ddo.jp" ID & PASSWD
local $ID     = 'xxxxxxxxxx'; # Login ID(It serves as a domain name)
local $PASSWD = 'xxxxxxxxxx'; # 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 = 1209600;       # 2 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);
}


このスクリプトをcronで定期的に(今は1分おきに)実行してます。
(/etc/crontabに下記のエントリーを追加します。perlファイルを"/home/shell/ddo_update.pl"とした場合)
*/1 * * * * root /home/shell/ddo_update.pl

<履歴>
2005.10.12 ddo.jpさんのIPアドレスチェック用URLの変更に伴い設定を変更
post a comment













管理者にだけ表示を許可する