赤字の部分は利用者の環境に応じて変更いただきたい。


#!/usr/bin/perl
# -*- coding: euc-japan; mode: cperl -*-
#
#      DynDNS update utility
#
#          1.DynDNS ドメイン情報を DDUP ユーティリティで更新する.
#            以下いずれでもない場合は何もしないで終了する.
#          (1) ルータ IP が変更になった場合
#          (2) 前回更新から月が変わった場合
#
#          2.更新後 DNS リゾルバで確認する.
#
#          3.更新/DNS 確認結果を管理者にメール送信する.
#
#          Initial version for YAMAHA RTA-52i  (May 26 2001)
#          Revised for PLANEX BRL-04F          (Oct 25 2002)
#          Revised for YAMAHA RTA-55i          (Jul 18 2003)
#          Revised DNS 確認,メール送信追加    (Dec 11 2004)
#
#                                            (c) 2001-2004, Isao YASUDA
#

use strict;                                  # Strict check
use Net::DNS;                                # DNS module
use Net::Telnet;                             # Telnet module
use Mail::Sender;                            # Mail module

my $rta55i    = "rthostname";                # RTA-55i hostname
my $pass      = "PASS";                      # passwd
my $date      = `/bin/date '+%D %H:%M:%S'`; chomp($date);
my $ipfile    = "/tmp/IPREC"                 # IP addres record
my $log       = "/var/log/ipaddress.log";    # log file path
my $ddup      = "/usr/local/sbin/ddup";      # ddup path
my $mydomain  = "mydomain.dyndns.org";       # DynDNS my domain name
my $newIPaddr;

my $smtpsv    = 'smtp.host.name';            # SMTP host
my $mailfrom  = 'from@domain.net';           # Mail address from
my $mailto    = 'to@report.ddup.net';        # Mail address to
my $mailsub   = "DynDNS update report";      # Mail subject

#
# RTA-55i に Telnet で接続し,IP ステータスを取得する.
#
my $t = new Net::Telnet(-host => "$rta55i", -port => 23);
$t->waitfor('/Password:/');
$t->print("$pass");
$t->waitfor('/>/');
$t->print("show status pp 1");           # get IP status
my @buffer = $t->waitfor('/>/');
$t->close;

#
# IP ステータス情報から割当てられた IP アドレスを切り出す.
#
foreach (@buffer) {
	if (/PP IP Address Local: (([0-9]{1,3}\.){3}[0-9]{1,3})/) {
		$newIPaddr = $1;
	}
}

#
# 前回変更したときの情報を読み込み,IP アドレスと日付(月)を取得する.
#
my $IPrec = `/bin/cat $ipfile`;          # read stored record
(my $olddate, my $oldIPaddr) = split(/,/, $IPrec);
(my $oldmonth, my @wa) = split(/\//, $olddate,3);
(my $newmonth, @wa) = split(/\//, $date,3);
chomp($oldIPaddr);

open(LOG, ">> $log");

#
# 前回の IP アドレスと,現在のルータ IP アドレスが一致するか,
# 月が変わっているか,確認する.
#
if ($oldIPaddr eq $newIPaddr) {          # 前回/今回 IP アドレス比較
	if ($newmonth != $oldmonth) {    # 月比較
		print LOG "$date : IP address is to be refreshed. $newIPaddr\n";
	} else {                         # IP,月ともに変更なければ
		exit;                    # 何もせず終了する.
	}
} else {                                 # IP アドレスが変わった場合
	print LOG "$date : IP address is changed. $oldIPaddr -> $newIPaddr\n";
}

#
# アドレスが不一致または月が変わっていれば DynDNS サイトに接続し,
# ドメイン情報を更新する.
#
my $result = "$ddup --host $mydomain --wildcard --ip $newIPaddr --debug\n";
$result .= `$ddup --host $mydomain --wildcard --ip $newIPaddr --debug`;

open(IP, ">$ipfile");
print IP "$date,$newIPaddr";             # update stored IP record

#
# 更新が成功したか,実際に DNS リゾルバで確認する.
#
my $res = new Net::DNS::Resolver;
my $query = $res->search($mydomain);

if ($query) {
	foreach my $rr ($query->answer) {
		next unless $rr->type eq "A";
		$result .= "\n\nDomain\t: " . $mydomain . "\n" .
			"IP address\t: " . $rr->address . "\n";
		$mailsub .= " Suceeded! " . $date;
	}
} else {
	$result .= "\n\n*** Query failed: " . $res->errorstring . "\n";
	$mailsub .= " Failed! ". $date;
}

#
# 更新/DNS 確認結果を管理者にメールする.
#
$Mail::Sender::NO_X_MAILER = 1;          # no X-Mailer
my $mailer = new Mail::Sender;
$mailer->MailMsg({smtp => $smtpsv,
                  from => $mailfrom,
                  to => $mailto,
                  subject => $mailsub,
                  msg => $result});

if ($Mail::Sender::Error) {
	print IP "$date,".$Mail::Sender::Error."\n";
}

#
# 後始末.
#
close(IP);
close(LOG);
exit;