#!/usr/bin/perl
# -w ワーニングを出す
# /usr/local/bin/ddns4nifty/ddo/ddns-ddo-121109.pl
# IPアドレスに変更があった場合にうまく更新されない。
# パスワードエラーがでる??
# 修正してみた うまくいくのか?? (行 249)
# /usr/local/bin/ddns4nifty/ddo/ddns-ddo-120829.pl
# を元にサブルーチンの引数を整理(広域変数として)
#
# niftyのプログラムを元に修正
#
use strict; # 宣言した変数以外を使えなくする
my $ddoid="ddoID";
my $ddopass="ddoPASSWORD";
my $file="/usr/local/bin/ddns4nifty/ddo/ipaddr.txt";
my $update="/usr/local/bin/ddns4nifty/ddo/update.log";
my $no_update="/usr/local/bin/ddns4nifty/ddo/no_update.log";
my $ip_change_log="/usr/local/bin/ddns4nifty/ddo/ip_change_log.txt";
my $ip_change_log_temp="/usr/local/bin/ddns4nifty/ddo/ip_change_log_temp";
my $dmy="/usr/local/bin/ddns4nifty/ddo/dmy";
my $update_d_t="/usr/local/bin/ddns4nifty/ddo/update_d_t.txt";
my $wget;
my $ipaddr ;
my $oldipaddr;
my $ipaddr_success ; # 正しくIPアドレスが更新されたか? 0:正しく更新 1:エラー
my $i ;
my $i_count ;# ip addressが何回目に得られたか
my $ii_count ;# wgetが何回目に得られたか
my $ok_pattern = "SUCCESS";
my $ok_update="";
my $line ;
my $null="";
$| = 1; # ゼロ以外が代入されると出力をバッファリングしなくなる。
# ########################### メインプログラム ###############################
open FH, "<",$file || die "Error: ipaddr.txt $!\n" ; #ファイルを入力で開く
$oldipaddr = <FH> ; # 記録されているIPアドレスを入力
close FH;
LABEL1: for($i=1 ; $i<4 ; $i++ ) { ; # IPアドレスの更新チェック、
# 最大3回IPアドレスを求める
$ipaddr=&newip(); # 新しいipアドレスに変更されているかチェック
$i_count=$i ;
# print "Debug 47\n";
last LABEL1 if($ipaddr ne $null ) ; # 新しいIPアドレスが正しく
# 得られていればループを抜ける
} ; # end for
# print "Debug 51\n";
if( $ipaddr eq $null ) { ; # 正しくIPアドレスが得られたか? *********
&no_new_ip() ; # 新しいIPアドレスが得られないエラー。
# 3回トライしました、でもipアドレスが得られません。
# print "Debug 57\n";
} # end if
elsif( $ipaddr eq $oldipaddr ) { # IPアドレスに変更なし ---------------------
&noipchange();
# print "Debug 62\n";
} # end elsif
else { # ----------------------------------------------------------------------
for ( $i=1 ; $i<4 ; $i++) { # IPアドレスに変更有り、
# 最大3回IPアドレスの更新を試みる
# print "Debug 67\n";
# 2012/7/7変更 サブルーチン化する
#
$ipaddr_success=&ip_update_func();
# print $ipaddr_success; # Debug
if($ipaddr_success eq 0) {
# print "Debug 75\n";
exit; #正しく更新されて、終了
}
} # end of for
# --------------------- 正しくIPアドレスが更新されなかった場合 --------------
&time_prt($update); # 時刻の呼び出しとプリント
open (OUT,">> $update"); # 更新記録を書き込むupdate.log fileを開く
print OUT "3回試みましたが正しくIPアドレスが更新されませんでした\n" ;
# IPアドレスが正しく更新されなかった。
close(OUT);
&time_prt($ip_change_log); # 時刻の呼び出しとプリント
open IN,"<",$ip_change_log_temp; # サーバーの更新ログが記録されている
# # 仮ファイルを開く
open (OUT,">> $ip_change_log"); # $ip_change_log.txtに変更に失敗した
# # サーバーログを書き込むファイルを開く
print OUT "\n"; # 時刻を記述した後に
# #「改行コード」を加える
while ($line = <IN>) { ; # 1行づつ読み込む
print OUT "$line" ; # 1行づつ書き出す(append)、
# 元の行に「改行コード」があるため、改行は記述せず
} ; # end while
print OUT "New IP ADDRESS=$ipaddr new_ip_count=$i_count new_wget=$ii_count\n\n" ;
# 変更されなかったIPアドレスなど書き出す
close IN ;
close (OUT) ;
# print "Debug 105\n";
} # end of else -----------------------------------------------------------------
# ####################### メインプログラム エンド #####################
# ----------------------- 新しいipアドレスを求める ------------------------
sub newip {
my $ip;
my $wget_s = `wget -O- -q http://info.ddo.jp/remote_addr.php` ;
# 2012/07/01 ddo.jp アドレスを得る(無料サイト)
$wget_s =~/[0-9]+(\.[0-9]+){3}/; # IPアドレスとのマッチパターン
$ip = $&; # マッチしたIPアドレスを入力
# print "Debug 120 newip=:$ip\n"; # デバッグ用 IPアドレス出力
return $ip ;
}
# ----------- 新しいIPアドレスが得られなかった -------------
sub no_new_ip {
&time_prt($no_update); # 時刻の呼び出しとプリント
open (OUT,">>$no_update");
print OUT "3回トライしました。でもipアドレスが得られません。\n" ;
# 新しいIPアドレスが得られないエラー
close(OUT);
}
# ------------------ IPアドレスに変更なし -------------------------
sub noipchange {
if ( &date_time_chk( $update_d_t ) eq 0 ) { # 7日以上IPアドレスが変わっていない?
# 7日未満でIPアドレスを更新しない
# print "Debug 143 no_update file :$no_update\n";
&time_prt($no_update); # 時刻の呼び出しとプリント
open (OUT,">>$no_update");
print OUT "ip address is not changed:$ipaddr i_count=$i_count\n" ;
# # IPアドレスに変更無し
print OUT "" ;
close(OUT);
} # end of if
else { # 7日以上経過した場合 IPアドレスの強制更新と記録
$ipaddr_success=&ip_update_func();
if($ipaddr_success eq 0) {
# print "Debug 154\n";
exit; # 強制更新が正しく行われて終了
} # end of if
} # end of else
} # end of sub noipchange
# ------------------- 時刻のプリント -----------------------------
sub time_prt {
my $no_up2=$_[0]; # 引数が一つの場合は$_[0]を、
# 引数が複数の場合は@_[0],@_[1],----@_[n]を使う
my $sec;
my $min;
my $hour;
my $mday;
my $mon;
my $year;
my $wday;
my $yday;
my $isdst;
my $tt;
$tt=time();
($sec, $min, $hour, $mday, $mon, $year,
$wday, $yday, $isdst) = localtime($tt);
$year=$year+1900;
$mon=$mon+1;
open (OUT,">> $no_up2");
printf OUT "%02d/%02d/%02d %02d:%02d:%02d ", $year,$mon,$mday,$hour,$min,$sec ;
close(OUT);
}
# -------------- 自動更新用、日付時刻のファイルへの書出 --------------------
#
# 2012/07/06 追加
#
sub date_time_prt {
my $tt=time();
open (OUT,"> $update_d_t");
printf OUT $tt ; # 日付時刻をファイルに書き出す
close(OUT);
} ; # end of sub date_time_prt
# -------------- 日付時刻が7日を過ぎているか判断 --------------------
#
# 2012/07/06 追加
#
sub date_time_chk {
my $tt_now=time(); # 現在の日付時刻
my $tt ; # 比較する日付時刻
open (IN,"< $update_d_t"); # ファイルから日時を読み出す
$tt = <IN> ;
close(IN);
# print "Debug 215 update_d_t.txt =$tt\n" ;
if ($tt_now >= $tt+7*24*3600-5 ) {
# if ($tt_now >= $tt+120 ) {
# print "Debug 218 IP change by force\n" ;
return 1 ; # 7日以上過ぎていればフラグを立てる
} # end of if
else {
return 0 ; # 7日未満であればフラグクリアー
} # end of else
} # end of sub date_time_chk
# ------------ IPアドレスの更新 ---------------------------
#
#
sub ip_update_func {
#$wget=`wget -O $ip_change_log_temp -o $ip_change_log_temp http://free.ddo.jp/dnsupdate.php?dn=$ddoid&pw=$ddopass`;
# 2012/07/01 ddo.jpのアドレス更新(無料サイト)
# ↑これでは下のエラーがでて、IPアドレスが更新されない。(IPアドレスに変更があった場合)
# <a href="http://ddo.jp/">Dynamic DO!.jp</a><br>
# FAIL:更新できませんでした。<br>
# ドメイン名またはパスワードが違います。<br>
#
#
# http://free.ddo.jp/dnsupdate.php?dn=ドメイン&pw=パスワード
#
# 以下のように修正してみた(2012/11/09) うまくいくのか??
$wget=`wget -O $ip_change_log_temp -o $dmy 'http://free.ddo.jp/dnsupdate.php?dn=$ddoid&pw=$ddopass'`;
$ii_count=$i ; # for loop の回数 何度目にwgetが得られたか
sleep(1) ; # 1秒待つ
open IN,"<",$ip_change_log_temp; # サーバーの更新ログが
# # 記録されている仮ファイルを開く
LABEL3: while ($line = <IN>) { ; # ok パターンを探す
if ( $line =~/SUCCESS/ ) {;# ok パターンにマッチ
# print "Debug 243 ok_pattern_\n" ;
$ok_update ="SUCCESS";
last LABEL3 ; # while文を終了
} ; # end if
} ; # end while
close IN ;
# print "Debug 250 $ok_update\n" ;
if ( $ok_update eq $ok_pattern ) {
# 正しくIPアドレスが更新された場合 -------
# print "Debug 254\n";
open FH,">",$file|| die "Error: ipaddr.txt $!\n" ;
print FH "$ipaddr" ; # 変更された新しいIPアドレスをfileに書き出す
close FH;
&time_prt($ip_change_log); # 時刻の呼び出しとプリント
open IN,"<",$ip_change_log_temp;# サーバーの更新ログが
# 記録されている仮ファイルを開く
open (OUT,">> $ip_change_log"); # $ip_change_log.txtにサーバーログを書き込むファイルを開く
print OUT "\n"; # 時刻を記述した後に「改行コード」を加える
while ($line = <IN>) { ; # 1行づつ読み込む
print OUT "$line" ; # 1行づつ書き出す(append)、
# 元の行に「改行コード」があるため、改行は記述せず
} # end while
print OUT "New IP ADDRESS=$ipaddr new_ip_count=$i_count new_wget=$ii_count\n\n" ; # 変更された新しいIPアドレスをfileに書き出す
close IN ;
close (OUT) ;
&time_prt($update); # 時刻の呼び出しとプリント
open (OUT,">> $update"); # 更新記録を書き込むupdate.log fileを開く
print OUT "ip addres is changed:$ipaddr\n" ;
# # IPアドレスが更新された旨を書き出す
close(OUT);
&date_time_prt(); # 更新日時を記録
return 0 ; # 正常に更新された。
} # end if
return 1; # 正常にIPアドレスが更新されなかった
} # end of sub ip_update_func