以前から@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 = "https://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 ); }
必要な人は自由にお使いください。
コメントする