2017年5月3日(水)
最近、@niftyのDDNS更新スクリプトがエラーを出力していたので原因を調査してみました。
その結果、@nifty側でDDNSのURLやアクセス方法を変更していることがわかり、これに合わせて更新スクリプトを修正対応しました。
以下が最新版となります。
#!/usr/bin/perl -w
use strict;
use Encode;
#-------------------------------------------------------------------------------#
# 2009.09.26 #
# @nifty DDNSサービスのIPアドレス更新を行うスクリプト #
# #
# このスクリプトには@niftyのユーザIDとパスワードをテキストで埋め込むため、スク #
# リプトファイルのパーミッションモードは0700としておく方が良い。 #
# このスクリプトを定期的に実行するためにクローンに登録する。なお、IPアドレスの #
# 更新が無い場合でも1週間(期間は以下の変数でカスタマイズ可能)に一度は更新処理 #
# をする(スクリプトが自動で判断して実行)。 #
# crontabの例) #
# 0,10,20,30,40,50 * * * * hogehoge /home/umihiko/bin/niftyddns.pl #
# #
# 2009.09.26 初版 #
# 2010.01.27 @nifty DDNSのWebにアクセスできない場合の処理追加 #
# 2014.04.28 $current_ipにアドレスをgetできなかった場合に$current_ipを初期化 #
# する処理追加 #
# 2017.05.03 @nifty DDNSのWebのアドレスとURLエンコードの内容が@nifty側で変更 #
# されていたため、この変更に対応 #
# #
#-------------------------------------------------------------------------------#
#-------------------------------------------------------------------------------#
# グローバル変数
## ユーザ毎にカスタマイズが必要な変数
my $niftyid = "TAE03353"; # @niftyのユーザID
my $niftypasswd = "8VEEDQ3T"; # @niftyのパスワード
my $basedir = "/home/umihiko/bin"; # このスクリプトをインストールするディレクトリ
my $datadir = "$basedir/atniftyddns"; # このスクリプトで使うファイル(IPアドレスの保存ファイル、wgetの出力結果等)を保存するディレクトリ
my $addrfile = "$datadir/prev_ip.txt"; # 前回のIPアドレスを保存するファイル名
my $updatetime = "$datadir/update.txt"; # 前回、IPアドレス更新を実行した時間(time関数値)を保存するファイル名
my $resultfile = "$datadir/result.txt"; # スクリプトの結果(IPアドレスに変更が無かったか、あるいはIPアドレス更新処理をしたか)を記録するファイル名
my $interval = 7; # IPアドレス変更が無い場合でもこの変数で指定された日にち(デフォルト7日)が経過したら更新処理を行う
## カスタマイズ不要な変数
my $atniftyddns = "https://domain.nifty.com/domain/DdnsIpChangeConfirm.do"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK
my $conf_ipaddr = 'DDNS_CHANGE_IP=IP%95%CF%8DX%83y%81%5B%83W%82%D6'; # 今後、@nifty DDNSサービスで変更がなければこのままでOK (2017.05.03)
my $change_atniftyddns = "https://domain.nifty.com/cp/ddns/DdnsIpChangeAdd.do"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK (2017.05.03)
# my $update_ip = "DDNS_UPDATE_IP_ADDRESS"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK
my $update_ip = 'change_type=ip'; # 今後、@nifty DDNSサービスで変更がなければこのままでOK (2017.05.03)
my $wget;
my $current_ip = ''; # 現在のIPアドレス (2017.05.03)
my $previous_ip; # 前回のIPアドレス
my $change = 1; # 前回のIPアドレスと現在のIPアドレスが一致していない場合、または、初めてこのスクリプトを実行する場合に1にセット
my $updated; # $updatetimeファイルに保存されているIPアドレス更新実行時間
#------------------------------------------------------------------------------#
#------------------------------------------------------------------------------#
# スクリプトで使うファイルの保存ディレクトリが無い場合にディレクトリを作成
if( !-d $datadir ) {
mkdir( $datadir, 0755 ) || die "ディレクトリ生成失敗 : $!";
}
#------------------------------------------------------------------------------#
#------------------------------------------------------------------------------#
# @nifty DDNSのIPアドレス更新ページをwgetでアクセスし、現在のIPアドレスを確認
$wget = `wget --secure-protocol=auto -O - -q $atniftyddns?$conf_ipaddr`;
$wget =~/[0-9]+(\.[0-9]+){3}/;
$current_ip = $&;
# if ( $current_ip eq '' ) { $current_ip = '0.0.0.0'; }
# print "current_ip = $current_ip\n";
#------------------------------------------------------------------------------#
#------------------------------------------------------------------------------#
# 前回のIPアドレスと現在のIPアドレスが一致するか比較し、一致していない場合には
# IPアドレスが変更したとして$changeフラグをセット
## 前回のIPアドレスを保存しているファイルが存在している場合は現在のIPアドレスと
## 一致するか確認
if ( -e $addrfile ) {
open( FH, "<$addrfile" );
$previous_ip = ;
close( FH );
if ( $current_ip eq $previous_ip ) {
$change = 0;
}
elsif ( $current_ip eq "" ) { # @nifty DDNSにアクセスできない場合
if ( -e $resultfile ) {
unlink( $resultfile );
}
open( FH, ">$resultfile" );
print FH '@nifty DDNS Webページにアクセスできませんでした。' . "\n";
close( FH );
exit;
}
else {
unlink $addrfile;
open( FH, ">addrfile" );
print FH $current_ip;
close( FH );
}
}
## 前回のIPアドレスを保存しているファイルが存在しない場合は現在のIPアドレスを
## 保存
else {
open( FH, ">$addrfile" );
print FH $current_ip;
close( FH );
}
#------------------------------------------------------------------------------#
#------------------------------------------------------------------------------#
# 最終更新時から$intervalで指定した日数経過している場合は、IPアドレスに変更が
# なくても更新処理を実行する($changeフラグをセットする)
if ( -e $updatetime ) {
open( FH, "<$updatetime" );
$updated = ;
close( FH );
if ( $updated <= time - ( $interval * 24 * 3600 ) ) {
$change = 1;
unlink $updatetime;
open( FH, ">$updatetime" );
print FH time;
close FH;
}
}
else {
$change = 1;
open( FH, ">$updatetime" );
print FH time;
close FH;
}
#------------------------------------------------------------------------------#
# $changeフラグがセットしてある場合、IPアドレス更新を実行し、IPアドレス保存ファ
# イルに保存しているIPアドレスを現在のIPアドレスに更新
if ( $change ) {
if ( -e $resultfile ) {
unlink( $resultfile );
}
$wget = `wget --secure-protocol=auto -O - -q --http-user=$niftyid --http-password=$niftypasswd $atniftyddns?$update_ip`;
$wget =~/[0-9]+(\.[0-9]+){3}/;
$current_ip = $&;
my $remain = $';
$remain =~/
/;
$remain = $`;
Encode::from_to($remain, 'shiftjis', 'utf-8');
open( FH, ">$resultfile" );
print FH $current_ip . $remain . "\n";
close( FH );
}
else {
unlink( $resultfile );
open( FH, ">$resultfile" );
print FH "IPアドレス($current_ip)は変更されていません。\n";
close( FH );
}