#!/usr/bin/perl
# -w ワーニングを出す
# /usr/local/bin/ddns4nifty/ddo/ddns-ddo-120706.pl
# ddo!.jpのddnsに対応 2012/07/01-->07 完成か?バッチでは走った。
# niftyのプログラムを元に修正 2012/7/8 完成
#
# new ip 読み込み他をサブルーチン化する 2009/02/26--->2009/03/01
# wgetで正しく更新されたことを確認した後、その旨を書き出す
# 2009/02/26--->2009/03/01
# マッチパターンにマッチしなかった場合にif文での判断を修正(2009/03/03)
#
# 完成
# perlのワーニング(-w)を止めた+コメント文の表現を修正(2009/03/10)
# IPアドレスが何回目で正しく得られているかを出力する(2009/03/18)
# wgetがが何回目で正しく得られているかを出力する(2009/03/18)
#
#
#
use strict; # 宣言した変数以外を使えなくする
my $ddoid="DDO_ID";
my $ddopass="DDO_password";
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 $update_d_t="/usr/local/bin/ddns4nifty/ddo/update_d_t.txt";
my $wget;
my $ipaddr ;
my $oldipaddr;
my $i ;
my $i_count ;# ip addressが何回目に得られたか
my $ii_count ;# wgetが何回目に得られたか
my $ok_pattern = "0K ";
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 55\n";
last LABEL1 if($ipaddr ne $null ) ; # 新しいIPアドレスが正しく
# 得られていればループを抜ける
} ; # end for
# print "Debug 59\n";
if( $ipaddr eq $null ) { ; # 正しくIPアドレスが得られたか? *********
&no_new_ip( $no_update ) ; # 新しいIPアドレスが得られないエラー。
# 3回トライしました、でもipアドレスが得られません。
# print "Debug 65\n";
} # end if
elsif( $ipaddr eq $oldipaddr ) { # **************** IPアドレスに変更なし
&noipchange( $i,$ip_change_log,$ddoid,$ddopass,$ipaddr,$ok_pattern,$file,$ip_change_log_temp,$i_count,$update,$no_update, $update_d_t);
# print "Debug 70\n";
} # end elsif
else { # ***********************************************************
for ( $i=1 ; $i<4 ; $i++) { # IPアドレスに変更有り、
# 最大3回IPアドレスの更新を試みる
# print "Debug 75\n";
# 2012/7/7変更 サブルーチン化する
#
&ip_update_func($i,$ip_change_log,$ddoid,$ddopass,$ipaddr,$ok_pattern,$file,$ip_change_log_temp,$i_count,$update); #2012/7/7 追加
# print "Debug 81\n";
} # 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 109\n";
} # end of else
exit ;
# ####################### メインプログラム エンド #####################
# ----------------------- 新しい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 124 newip=:$ip\n"; # デバッグ用 IPアドレス出力
return $ip ;
}
# ----------- 新しいIPアドレスが得られなかった -------------
sub no_new_ip {
my $no_up=$_[0];
&time_prt($no_up); # 時刻の呼び出しとプリント
open (OUT,">>$no_up");
print OUT "3回トライしました。でもipアドレスが得られません。\n" ;
# 新しいIPアドレスが得られないエラー
close(OUT);
}
# ------------------ IPアドレスに変更なし -------------------------
sub noipchange {
# 引数が一つの場合は$_[0]を、
# 引数が複数の場合は@_[0],@_[1],----@_[n]を使う
my $i=$_[0] ; # カウンター for
my $ip_change_log=$_[1] ; # ip_change_log.txt
my $ddoid=$_[2] ; # ddo!のID
my $ddopass=$_[3] ; # ddo!のパスワード
my $ipaddr=$_[4] ; # 得られたIPアドレス ルーチン内変数
my $ok_pattern=$_[5] ; #
my $file=$_[6] ; # ipaddr.txt 保存ファイル
my $ip_change_log_temp=$_[7] ; # ip_change_log_tmp
my $i_count=$_[8] ; # カウンター
my $update=$_[9] ; # update.log
my $no_update=$_[10] ; # no_update.log
my $update_d_t=$_[11] ; # update_d_t.txt 変更日時の保存file
#
my $wget;
my $ii_count;
my $line ;
my $ok_update="";
if ( &date_time_chk( $update_d_t ) eq 0 ) { # 7日以上IPアドレスが変わっていない?
# 7日未満でIPアドレスを更新しない
# print "Debug 170 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アドレスの強制更新と記録
&ip_update_func($i,$ip_change_log,$ddoid,$ddopass,$ipaddr,$ok_pattern,$file,$ip_change_log_temp,$i_count,$update, $update_d_t); #2012/7/7 追加
} # 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 $date_t=$_[0]; # 出力するファイル名
# 引数が一つの場合は$_[0]を、
# 引数が複数の場合は@_[0],@_[1],----@_[n]を使う
my $tt=time();
open (OUT,"> $date_t");
printf OUT $tt ; # 日付時刻をファイルに書き出す
close(OUT);
} ; # end of sub date_time_prt
# -------------- 日付時刻が7日を過ぎているか判断 --------------------
#
# 2012/07/06 追加
#
sub date_time_chk {
my $date_t_in=$_[0]; # 入力するファイル名
# my $date_t_out=@_[1]; # 出力するファイル名
# 引数が一つの場合は$_[0]を、
# 引数が複数の場合は@_[0],@_[1],----@_[n]を使う
my $tt_now=time(); # 現在の日付時刻
my $tt ; # 比較する日付時刻
open (IN,"< $date_t_in"); # ファイルから日時を読み出す
$tt = <IN> ;
close(IN);
# print "Debug 245 update_d_t.txt =$tt\n" ;
if ($tt_now >= $tt+7*24*3600 ) {
# if ($tt_now >= $tt+3600 ) {
# print "Debug 248 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 {
# 引数が一つの場合は$_[0]を、
# 引数が複数の場合は@_[0],@_[1],----@_[n]を使う
my $i=$_[0] ;# for loop の回数
my $ip_change_log=$_[1] ;
my $ddoid=$_[2] ;
my $ddopass=$_[3] ;
my $ipaddr=$_[4] ;
my $ok_pattern=$_[5] ;
my $file=$_[6] ;
my $ip_change_log_temp=$_[7] ;
my $i_count=$_[8] ;
my $update=$_[9] ;
my $update_d_t=$_[10] ; # 日時を記録したファイル
#
my $wget;
my $ii_count;
my $line ;
my $ok_update="";
$wget=`wget -O- -v -o $ip_change_log_temp --http-user=$ddoid --http-passwd=$ddopass http://free.ddo.jp/dnsupdate.php?dn=$ddoid&pw=$ddopass&ip=$ipaddr` ;
# 2012/07/01 ddo.jpのアドレス更新(無料サイト)
$ii_count=$i ;# for loop の回数 何度目にwgetが得られたか
sleep(1) ; # 1秒待つ
open IN,"<",$ip_change_log_temp; # サーバーの更新ログが
# 記録されている仮ファイルを開く
LABEL3: while ($line = <IN>) { ; # ok パターンを探す
if ( $line =~/0K / ) {; # ok パターンにマッチ
# print "Debug 291 ok_pattern_\n" ;
$ok_update ="0K ";
last LABEL3 ; # while文を終了
} ; # end if
} ; # end while
close IN ;
# print "Debug 298 $ok_update\n" ;
if ( $ok_update eq $ok_pattern ) {
# 正しくIPアドレスが更新された場合 -------
# print "> ddns-ddo-120701.pl> ddns-ddo-120701.pl 306\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);
# ##### 更新日時を記録 以下1行 2012/7/6追加
&date_time_prt($update_d_t); # 更新日時を記録
exit ; # ループを抜けて、終了する。
} # end if
} # end of sub ip_update_func