#!/usr/bin/perl -w # -w ワーニングを出す # /usr/local/bin/ddns4nifty/ddns4nifty-090301.pl # nifty ddns 2008/12/3 のリニューアルに対応 # new ip 読み込み他をサブルーチン化する 2009/02/26--->2009/03/01 # wgetで正しく更新されたことを確認した後、その旨を書き出す 2009/02/26--->2009/03/01 # 完成(?) 2009/03/01 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 $null=""; my $i ; my $ok_pattern = "0K .......... "; my $ok_update=""; my $line ; $| = 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"); print OUT $year,"/",$mon,"/",$mday," ",$hour,":",$min,":",$sec," " ; close(OUT); }