赤字の部分は利用者の環境に応じて変更いただきたい。
#!/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;