#!/usr/bin/perl -w  
#               -w ワーニングを出す
# /usr/local/bin/ddns4nifty/ddns4nifty-090302.pl
# nifty ddns 2008/12/3 のリニューアルに対応
# new ip 読み込み他をサブルーチン化する 2009/02/26--->2009/03/01
# wgetで正しく更新されたことを確認した後、その旨を書き出す 2009/02/26--->2009/03/01
# マッチパターンにマッチしなかった場合にif文での判断を修正(2009/03/03)
# 
# 完成 2009/03/03

use strict; # 宣言した変数以外を使えなくする

my $niftyid="NIFTYID";
my $niftypass="NIFTYPASSWORD";

my $file="/usr/local/bin/ddns4nifty/ipaddr.txt";
my $update="/usr/local/bin/ddns4nifty/update.log";
my $no_update="/usr/local/bin/ddns4nifty/no_update.log";
my $ip_change_log="/usr/local/bin/ddns4nifty/ip_change_log.txt";
my $ip_change_log_temp="/usr/local/bin/ddns4nifty/ip_change_log_tmp";
my $wget;
my $ipaddr ;
my $oldipaddr;
my $i ;
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++ ) { ; # 最大3回IPアドレスを求める
    $ipaddr=&newip(); # 新しいipアドレスに変更されているかチェック
#    print "Debug 1\n";
    last LABEL1 if($ipaddr ne $null ) ; # 新しいIPアドレスが正しく得られていればループを抜ける
}
#    print "Debug 2\n";


if( $ipaddr eq $null ) { ; # 正しくIPアドレスが得られたか?
     &no_new_ip( $no_update ) ; # 3回トライしました。でもipアドレスが得られません。新しいIPアドレスが得られないエラー
#    print "Debug 3\n";
     }
elsif ( $ipaddr eq $oldipaddr ) {
    &noipchange( $no_update ); # IPアドレスに変更なし ---------------------------------------------------------------
#    print "Debug 4\n";
    }
else {
    for ( $i=1 ; $i<4 ; $i++ ) { ; # 最大3回IPアドレスの更新を試みる     
#    print "Debug 5\n";
          $wget=`wget --secure-protocol=auto --no-check-certificate -O- -v  -o $ip_change_log_temp --http-user=$niftyid --http-passwd=$niftypass  https://domain.nifty.com/cp/ddns/DdnsIpChangeAdd.do?change_type=ip` ; # 2008/12/3 のniftyのddnsリニューアルに伴い変更

          sleep(1) ; # 1秒待つ
          open IN,"<",$ip_change_log_temp;# 記録されているサーバーの更新ログを読み込む
          LABEL3:   while ($line = <IN>) { ;# ok パターンを探す
               if ( $line    =~/0K .......... / ) {; # ok パターンにマッチ
#                   print "Debug 11 ok_pattern_\n" ;
                   $ok_update ="0K .......... ";
                   last LABEL3 ;
               }
          }
          close IN ;


#          print "Debug 12 $ok_update\n" ;


          if ( $ok_update eq $ok_pattern ) { ; # 正しくIPアドレスが更新された場合 ----------------
#                print "Debug 6\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)、元の行に「改行コード」があるため、改行は記述せず
                 }
                 print OUT "New IP ADDRESS=$ipaddr\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);

                 exit ; # ループを抜けて、終了する。
          }
#    print "Debug 7\n";
    }
    # 正しくIPアドレスが更新されなかった場合 ------------------------------------------------------
    &time_prt($update); # 時刻の呼び出しとプリント
    open (OUT,">> $update");
    print OUT "3回試みましたが正しくIPアドレスが更新されませんでした\n" ; # IPアドレスが正しく更新されなかった。
    close(OUT);
#    print "Debug 8\n";
}

exit(0) ;
# ##################################  メインプログラム エンド  #####################




# -------------------------------  新しいipアドレスを求める ----------------------------
sub newip  {
    my $ip;
    my $wget_s = `wget --no-check-certificate -O- -q http://domain.nifty.com/domain/DdnsIpChangeConfirm.do?DDNS_CHANGE_IP=IP%95%CF%8DX%83y%81%5B%83W%82%D6` ; # 2008/12/3 niftyのddnsリニューアルに伴い変更

    $wget_s =~/[0-9]+(\.[0-9]+){3}/; # IPアドレスとのマッチパターン
    $ip = $&;  # マッチしたIPアドレスを入力
#    print "Debug newip=:$ip\n";
    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 {
  my $no_up=$_[0];
#  print "Debug no_update file :$no_up\n";
  &time_prt($no_up); # 時刻の呼び出しとプリント
  open (OUT,">>$no_up");
  print OUT "ip address is not changed:$ipaddr\n" ;  #IPアドレスに変更無し
  print OUT "" ;
  close(OUT);
}



# -----------------------------  時刻のプリント ----------------------------------------------
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);

}