#!/usr/bin/perl   
#               -w ワーニングを出す
# /usr/local/bin/ddns4nifty/ddo/ddns-ddo-120831.pl
#
# /usr/local/bin/ddns4nifty/ddo/ddns-ddo-120829.pl
#  を元にサブルーチンの引数を整理(広域変数として)
#
# nifty用のプログラムを元に修正
#

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 $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 ) { 
#  if ($tt_now >= $tt+3600 ) { 
    # 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のアドレス更新(無料サイト)
$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