• このエントリーをはてなブックマークに追加

はじめに

自宅サーバへアクセスするため,DynDNSで無料で利用させていただいているダイナミックDNSですが,ドメイン名が長いのでちょっと飽きてきた今日この頃...衝動的にドメインを取得してみました.VALUE DOMAINで.

以下,そんなVALUE DOMAINで取得したドメインを,ダイナミックDNSで利用できるようにするための流れについてざっと.更新を自動化するためのPerlスクリプトも書いてみました.

ダイナミックDNS設定に関する情報

次のURLに,ダイナミックDNS設定に関する情報が記載されています.

DNS更新をリクエストするスクリプト

上記URLの情報を参考に,次のようなスクリプトをテキトーに書きました.

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use LWP::UserAgent;
 
#
# 設定
#
my $ipaddr = '';
my $domain = 'yourdomain.com';
my $passwd = 'yourpasswd';
my $host   = '*';
#
# 設定 ここまで
#
 
my $logfile = sprintf '/var/log/ddns/%s.log', $domain;
my $ua = LWP::UserAgent->new;
my $res;
 
my ($ss, $mm, $hh, $d, $m, $y) = localtime time;
$y+=1900; $m++;
my $datetime = sprintf('%04d-%02d-%02d %02d:%02d:%02d',
		       $y, $m, $d, $hh, $mm, $ss
		      );
 
#
# IPアドレスの取得
#
if($ipaddr eq '') {
  my $url_get_ip = 'http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip';
  $res = $ua->get($url_get_ip);
  chomp($ipaddr = $res->content);
}
 
#
# DNS更新リクエスト
#
my $url_update = sprintf('http://dyn.value-domain.com/cgi-bin/dyn.fcg'
                           . '?d=%s&p=%s&h=%s&i=%s',
                         $domain, $passwd, $host, $ipaddr,
			);
$res = $ua->get($url_update);
chomp(my $content = $res->content);
$content =~ s{(\x0d\x0a?|\x0a)}{ // }g;
 
#
# print log
#
open(my $fh, '>>', $logfile)  or  die $!;
printf $fh "[%s] Request: %s, Result: %s\n", $datetime, $ipaddr, $content;
close $fh;
 
__END__

これを,/home/iwata/cron/ddns-yourdomain.com.plみたいな感じで保存します.

crontabに追記

あとはこれを定期的に呼び出したいので,次のような1行を/etc/crontabに追記します.

*/10 * * * *  root  /usr/bin/perl /home/iwata/cron/ddns-yourdomain.com.pl >/dev/null 2>&1

これを保存すれば,自動的に定期実行の対象になります.

ログファイル

こんな感じです.ときどき失敗してますね><

...
 
[2009-10-13 08:00:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 08:10:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 08:20:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 08:30:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 08:40:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 08:50:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 09:00:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 09:10:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 09:20:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 09:30:01] Request: ***.***.***.***, Result: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> // <HTML><HEAD> // <TITLE>503 Service Temporarily Unavailable</TITLE> // </HEAD><BODY> // <H1>Service Temporarily Unavailable</H1> // The server is temporarily unable to service your // request due to maintenance downtime or capacity // problems. Please try again later. // </BODY></HTML>
[2009-10-13 09:40:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 09:50:01] Request: ***.***.***.***, Result: 500 Server closed connection without sending any data back
[2009-10-13 10:00:01] Request: ***.***.***.***, Result: 500 Server closed connection without sending any data back
[2009-10-13 10:10:01] Request: ***.***.***.***, Result: status=0 // OK
[2009-10-13 10:20:01] Request: ***.***.***.***, Result: status=0 // OK
 
...

おわりに

こんな感じで,VALUE DOMAINで取得したドメインをダイナミックDNSで利用できるようにしてみました.今のところ大丈夫っぽいです.

...こういったスクリプトを,RubyとかPythonとかでも書いてみるといいのかな,と,名古屋Ruby会議01の余韻.