ようこそNICのホームページへ(なが〜い試運転中 from 2001/5/12)
  • @nifty atnifty-ddns ddo.jp dip.jp   HP パソコン 健康 落語 海外 思うまま 電子工作
  • ddo!jp ダイナミックdnsの非更新時のperlスクリプトを修正
    ダイナミックdo(ddo!jp)の強制更新を止めた

  • Last update:2018/6/19    Build:2018/6/19
  •  
     ddo!jpを使い出してから10年余りになる。 2013年7月1日から仕様が変更になり、無料で使用するには広告を掲載することが 義務づけられた。以前からの利用者には最大18ヶ月の移行期間があった。 この仕様変更で、「IPアドレスの更新が1ヶ月以上ない場合、登録が削除される」ことが無くなったので、 遅ればせながら、IPアドレスの強制更新部分を削除することとした。
    前回のスクリプトの更新はここ。 今回の変更はサブルーチン「 sub noipchange 」の7日以上IPアドレスの更新が なかったら、強制更新する部分を「##」でコメントアウトした。

    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
    過去にダイナミックdnsのperlを更新した一覧です。
    参考 Dynamic DO!.jp の2013年7月1日の規約変更 及び無料継続条件は

    パソコンへ     HomePage     このページのトップ