@niftyのダイナミックDNS更新スクリプト
NIFTYでは月額210円でサブドメイン(***.atnifty.com)を取得することができ、このHPも以前はサブドメインを取得したサーバー上 で稼働していました。
稼働しているサーバーが固定IPであれば特に問題はないのですが、IPが変わるような環境では、定期的にDNSに登録するIPを更新しないといけません。残念ながら、NIFTYではUNIX・Linuxで動くIP更新ツールを提供していないようなので、サーバ運用を行うときには困ってしまいます。幸いにも、NIFTYに対応したIP更新スクリプトを作成してくれた人がいましたので、ここでスクリプトを紹介させてもらいます。ただ、どこで公開されていたものか忘れてしまったので、作者の方、問題あれば言ってください。
うちのサーバはこのスクリプトでかれこれ6年くらい運用しています。
スクリプト
#!/usr/bin/perl
use Encode;
use Net::SSLeay qw(get_https post_https make_headers make_form);
use MIME::Base64;
if ($#ARGV != 2) {
print STDERR "usage: perl updateip.pl username password command\n";
print STDERR "command = {newip|offline}\n";
exit 0;
}
($user, $pass, $command) = @ARGV;
if ($command ne "newip" && $command ne "offline") {
print STDERR "command must be \"newip\" or \"offline\"\n";
exit 0;
}
$htmlfile1 = "/tmp/ipcheck1.html";
$htmlfile2 = "/tmp/ipcheck2.html";
# get 1st page
($page) = get_https('www.atnifty.com', 443, '/ddns/p13.php');
&create_file($htmlfile1);
# read it
open (IN, $htmlfile1) or die "what??\n";
$status = 0;
$mode_count = 0;
while () {
&get_form_information($_);
}
close IN;
# some variables
#$command = "newip"; # use this to update IP address
#$command = "offline"; # use this to disable dinamic DNS
if ($action =~ /^(.+?)(\/.+)$/) {
$post_url = $1;
$post_dir = $2;
} else {
print STDERR "bad action : $action\n";
exit 0;
}
# post values
($page, $response, %reply_headers) =
post_https($post_url,
443,
$post_dir,
make_headers('Authorization' =>
'Basic ' . MIME::Base64::encode("$user:$pass",'')),
make_form(
ipaddress => $valuemap{"ipaddress"},
nifty_id => $valuemap{"nifty_id"},
update => $command,
valid => $valuemap{"valid"}));
print "response = $response\n";
&create_file($htmlfile2);
exit 0;
http://kirihari.net/solaris/nifty_ddns_update.pl subr
sub create_file($) {
my $filename = shift;
open(OUT, ">$filename") or die "cannot create $filename\n";
binmode OUT;
$octets = decode("shift-jis", $page);
$euc = encode("euc-jp", $octets);
print OUT $euc;
close OUT;
}
sub get_form_information($) {
my $tmp = shift;
if ($status == 0) {
if ($tmp =~ /^<form/) {
$status = &found_form($tmp);
}
return;
}
if ($status == 1) {
$status = set_value($tmp);
return;
}
}
sub found_form {
my $tmp = shift;
if ($tmp =~ /action=\"https:\/\/(.+?)\"/) {
$action = $1;
return 1;
}
print STDERR "cannot set action\n";
return 0;
}
# map some keys to values
sub set_value {
my $tmp = shift;
if ($tmp =~ /javascript/) { # end of form
$mode_count = 1;
return 0;
}
if ($tmp =~/^<input\s+type=/) {
if ($tmp =~ /name=\"(.+?)\"\s+value=\"(.*?)\"/) {
if ($mode_count == 0) {
$valuemap{$1} = $2;
}
}
}
return 1;
}
(ファイル)
・nifty_ddns_update.pl
ちゃんと調べていませんが、どうもDiCE for Linux+@niftyプラグインがあり、これでもうまくいくようです。
トラックバック(0)
トラックバックURL: http://kirihari.net/mt/mt-tb.cgi/9
コメントする