« 神之川キャンプ場 | トップページ | Movable Type 5.0beta2 »

@nifty DDNS更新スクリプト

@nifty DDNS更新スクリプト

以前から@niftyのDDNSとDiCEのLinux版を利用していましたが、サーバとして使っていたPCが壊れたためPC買い換えとOS(元々Debian 5.0で今回も同じ)再インストールをしたところ、DiCEでの更新が上手くいかなくなりました。「サーバに接続できません」とクレームを言われます。

以前は同一OSで動作していたのですが、今回OS再インストールしたことからおそらく何らかのライブラリが不足していると思われます。もちろn、Open SSLやCryptoライブラリはインストール済ですが、どうしてもエラーを解決できないので仕方ないから自分でスクリプトを作成することとしました。

とは言っても一から作るのは大変なので、ググって見たところココにありました。このスクリプトを参考にさせていただきちょっと手直ししたのがこのniftyddns.plです。

#!/usr/bin/perl -w
use strict;
use Encode;

#------------------------------------------------------------------------------#
# 2009.09.26                                                                   #
# @nifty DDNSサービスのIPアドレス更新を行うスクリプト(niftyddns.pl)            #
#                                                                              #
# このスクリプトには@niftyのユーザIDとパスワードをテキストで埋め込むため、スク #
# リプトファイルのパーミッションモードは0700としておく方が良い。               #
# このスクリプトを定期的に実行するためにクローンに登録する。なお、IPアドレスの #
# 更新が無い場合でも1週間(期間は以下の変数でカスタマイズ可能)に一度は更新処理  #
# をする(スクリプトが自動で判断して実行)。                                     #
# crontabの例)                                                                 #
#   0,10,20,30,40,50 * * * * hogehoge /home/hogehoge/bin/niftyddns.pl          #
#                                                                              #
#------------------------------------------------------------------------------#

#------------------------------------------------------------------------------#
# グローバル変数
## ユーザ毎にカスタマイズが必要な変数
my $niftyid     = "hogehoge";               # @niftyのユーザID
my $niftypasswd = "mypasswd";               # @niftyのパスワード
my $basedir     = "/home/hogehoge/bin";     # このスクリプトをインストールするディレクトリ
my $datadir     = "$basedir/atniftyddns";   # このスクリプトで使うファイル(IPアドレスの保存ファイル、wgetの出力結果等)を保存するディレクトリ
my $addrfile    = "$datadir/prev_ip.txt";   # 前回のIPアドレスを保存するファイル名
my $updatetime  = "$datadir/update.txt";    # 前回、IPアドレス更新を実行した時間(time関数値)を保存するファイル名
my $resultfile  = "$datadir/result.txt";    # スクリプトの結果(IPアドレスに変更が無かったか、あるいはIPアドレス更新処理をしたか)を記録するファイル名
my $interval    = 7;                        # IPアドレス変更が無い場合でもこの変数で指定された日にち(デフォルト7日)が経過したら更新処理を行う

## カスタマイズ不要な変数
my $atniftyddns = "http://domain.nifty.com/domain/DdnsIpChangeConfirm.do"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK
my $conf_ipaddr = "DDNS_CHANGE_IP";         # 今後、@nifty DDNSサービスで変更がなければこのままでOK
my $update_ip   = "DDNS_UPDATE_IP_ADDRESS"; # 今後、@nifty DDNSサービスで変更がなければこのままでOK
my $wget;
my $current_ip;                             # 現在のIPアドレス
my $previous_ip;                            # 前回のIPアドレス
my $change = 1;                             # 前回のIPアドレスと現在のIPアドレスが一致していない場合、または、初めてこのスクリプトを実行する場合に1にセット
my $updated;                                # $updatetimeファイルに保存されているIPアドレス更新実行時間
#------------------------------------------------------------------------------#

#------------------------------------------------------------------------------#
# スクリプトで使うファイルの保存ディレクトリが無い場合にディレクトリを作成
if( !-d $datadir ) {
    mkdir( $datadir, 0755 ) || die "ディレクトリ生成失敗 : $!";
}
#------------------------------------------------------------------------------#

#------------------------------------------------------------------------------#
# @nifty DDNSのIPアドレス更新ページをwgetでアクセスし、現在のIPアドレスを確認
$wget = `wget --secure-protocol=auto -O - -q $atniftyddns?$conf_ipaddr`;
$wget =~/[0-9]+(\.[0-9]+){3}/;
$current_ip = $&;
#------------------------------------------------------------------------------#

#------------------------------------------------------------------------------#
# 前回のIPアドレスと現在のIPアドレスが一致するか比較し、一致していない場合には
# IPアドレスが変更したとして$changeフラグをセット

## 前回のIPアドレスを保存しているファイルが存在している場合は現在のIPアドレスと
## 一致するか確認
if ( -e $addrfile ) {
    open( FH, "<$addrfile" );
    $previous_ip = ;
    close( FH );
    if ( $current_ip eq $previous_ip ) {
        $change = 0;
    }
    else {
        unlink $addrfile;
        open( FH, ">addrfile" );
        print FH $current_ip;
        close( FH );
    }
}
## 前回のIPアドレスを保存しているファイルが存在しない場合は現在のIPアドレスを
## 保存
else {
    open( FH, ">$addrfile" );
    print FH $current_ip;
    close( FH );
}
#------------------------------------------------------------------------------#

#------------------------------------------------------------------------------#
# 最終更新時から$intervalで指定した日数経過している場合は、IPアドレスに変更が
# なくても更新処理を実行する($changeフラグをセットする)
if ( -e $updatetime ) {
    open( FH, "<$updatetime" );
    $updated = ;
    close( FH );
    if ( $updated <= time - ( $interval * 24 * 3600 ) ) {
        $change = 1;
        unlink $updatetime;
        open( FH, ">$updatetime" );
        print FH time;
        close FH;
    }
}
else {
    $change = 1;
    open( FH, ">$updatetime" );
    print FH time;
    close FH;
}
#------------------------------------------------------------------------------#
# $changeフラグがセットしてある場合、IPアドレス更新を実行し、IPアドレス保存ファ
# イルに保存しているIPアドレスを現在のIPアドレスに更新
if ( $change ) {
    if ( -e $resultfile ) {
        unlink( $resultfile );
    }
    $wget = `wget --secure-protocol=auto -O - -q --http-user=$niftyid --http-password=$niftypasswd $atniftyddns?$update_ip`;
    $wget =~/[0-9]+(\.[0-9]+){3}/;
    $current_ip = $&;
    my $remain = $';
    $remain =~/
/;     $remain = $`;     Encode::from_to($remain, 'shiftjis', 'utf-8');     open( FH, ">$resultfile" );     print FH $current_ip . $remain . "\n";     close( FH ); } else {     unlink( $resultfile );     open( FH, ">$resultfile" );     print FH "IPアドレス($current_ip)は変更されていません。\n";     close( FH ); }

必要な人は自由にお使いください。

|

« 神之川キャンプ場 | トップページ | Movable Type 5.0beta2 »

パソコン・インターネット」カテゴリの記事

コメント

 有用なスクリプトを示していただき有難うございます.
 DiCEd が対応できなくなってからは LWP::UserAgent, HTTP::Request を利用したスクリプトを書いていました.Niftyのサービスリニューアル(もう5年前?)でそのスクリプトが動作しなくなるも,回線プロバイダの乗換えでIPアドレスが実質的に遷移しない状況になっていたので,当面は手動対応としたまま時間が経過していました.IPアドレスが実質固定の状況は続いていますが,最近スクリプトを再検討し始めた次第です.
 手動対応の手順をそのまま自動化しようとすると,セッションの維持・クッキーの保持など面倒な処理が必要そうで,最終段階に至っていなかったのですが,$update_ip をつけて $atniftyddns に `wget` するだけで良かったんですね.実に楽に希望の動作が実現でき,有難うございました.
 なお,IPv6対応のサーバで IPv4のDNS を生かすためには,--inet4-only (-4) オプションを付加するのが効果的だったようです.
 ## カスタマイズ不要な変数 の $atniftyddns, $update_ip につき,『今後、@nifty DDNSサービスで変更がなければこのままでOK』がいつまで有効か分からないのは致し方ないですね.

投稿: Chorian | 2013年11月 4日 (月) 21時20分

もし可能でしたらご教示頂けると幸いです。
上記スクリプトを設定、実行したところ、64行目、90行目にsyntax errorがあるとのエラーメッセージが表示されます。

64# $previous_ip = ;
90# $updated = ;

の部分なのですが、なにかヒントありますでしょうか。

投稿: takizawa | 2014年12月15日 (月) 20時34分

当方の環境ではシンタックスエラーは表示されないのですが、
$previous_ip = "";
$updated = "";
とすることでエラーを回避できませんか。

投稿: | 2014年12月16日 (火) 22時43分

ご回答ありがとうございました。
どうやら当方の環境がipv6に移行してしまったため、上記のスクリプトではうまくいかないようです。
もう少し研究してみます。

投稿: takizawa | 2014年12月25日 (木) 20時07分

$previous_ip = <FH>;
$updated = <FH>;

で行けませんか?
※<>は半角で。

投稿: ままれ | 2015年1月21日 (水) 01時07分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1255289/40276240

この記事へのトラックバック一覧です: @nifty DDNS更新スクリプト:

« 神之川キャンプ場 | トップページ | Movable Type 5.0beta2 »