ddo!jp ダイナミックdnsの非更新時のperlスクリプトを修正
ダイナミックdo(ddo!jp)の強制更新を止めた
1.変更した部分
# ------------------ IPアドレスに変更なし ------------------------- sub noipchange { ## 仕様の変更(2013/6/30)に伴い移行期間内に広告を載せるようにした。また同日付の仕様変更 ## で「IPアドレスの更新が1ヶ月以上ない場合、登録が削除される」ことが無くなったので、 ## 遅ればせながら、IPアドレスの強制更新部分を削除することとした 「##」部分(2018/6/13) ## 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
2.全体のperlスクリプト
#!/usr/bin/perl # -w ワーニングを出す # /usr/local/bin/ddns4nifty/ddo/ddns-ddo-180619.pl ## 仕様の変更(2013/6/30)に伴い移行期間内に広告を載せるようにした。また同日付の仕様変更 ## で「IPアドレスの更新が1ヶ月以上ない場合、登録が削除される」ことが無くなったので、 ## 遅ればせながら、IPアドレスの強制更新部分を削除することとした(2018/6/19) # # /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 =; # 記録されている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 = ) { ; # 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 { &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 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 = ; 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アドレスに変更があった場合) # Dynamic DO!.jp
# FAIL:更新できませんでした。
# ドメイン名またはパスワードが違います。
# # # 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 =) { ; # 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 = ) { ; # 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