ブログ

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 ); }

今日は萌の中学校入学式でした。

今日は彩那の高校入学式でした。

今日は萌の卒業式でした。

今日は彩那の中学校卒業式でした。

2016年10月1日(土)

今朝、犬の散歩中に何十年ぶりかで野生のヘピを見つけ捕まえました。ジムグリの子供です。

20161001-0001.jpg

とりあえず子供に見せるために家まで持って帰ったところ、萌は喜んで写真を撮り名前まで付けていましたが彩那は嫌がっていました。

夕方、犬の散歩に行ったときに見つけたところで放しました。

8月に伊豆に旅行に行きましたが、帰ってきた日に車が故障しエンジンがかからなくなりました。
ディーラーに調べてもらった結果、インジェクションコイルとハーネスの交換が必要ということでしたが12年も乗ったエルグランドでそのハーネスは既に生産終息しており修理が難しいと言われ車を買い換えることとしました。

会社の永年勤続賞でもらった旅行券を利用して熱海後楽園ホテルへ2泊してきました。
旅行券の金額分より追加でかかる費用の方が高くなってしまいましたが、まあ仕方がありません。

例年通り、九十九里ハーブガーデンキャンプ場に海水浴をかねたキャンプです。

今年2回目のキャンプです。

ブログ

海の家

ショッピング(ナチュラム)

最近のブログ記事

清里中央オートキャンプ場
海の家ブログ上
2014年ピアノ発表会
海の家ブログ上
東中学校入学式
海の家ブログ上