VALUE-DOMAIN バリュードメイン専用 DDNS 更新スクリプト
|
DDNS更新用スクリプトは色々有りますが、VALUE-DOMAIN用 というのは殆ど無く、
また、■「複数ホスト名の同時更新」に対応しているスクリプトは、mocha には
見つけられませんでした。
■「複数ホスト名の同時更新」とは?
通常、VALUE-DOMAIN で DDNS 更新する場合は、ホスト名をワイルドカード( * )
として、全ホストの更新に適用します。(ex. www.moca-cocoa.net、 hoge.moca-cocoa.net 等)
所が、ワイルドカードで更新すると、ホスト名無しのドメインには適用されません。
(ex. moca-cocoa.net)
ゆえに同時更新するには、別々にスクリプトを設置して運用する必要が有りました。
(Dice では、設定を2つ作ります。)
Perl の練習を兼ねて、mocha が作ってみました。(^_^;)
FreeBSD 6.0 にて動作確認。 Vine Linux 等でも動作すると思いますが、未確認です。
このスクリプトに関してのメールは、http://www.moca-cocoa.net/ の
webmaster まで。
ただし、個々の返答は、原則として出来ません。あしからず。
また、今回からIPアドレスが変わらなくても、一定期間で更新する「インターバル更新」に
対応しました。 (※VALUE-DOMAIN バリュードメイン では、本来必要無いんですが。(笑) )
#!/usr/bin/perl # ※VALUE-DOMAIN 専用 DDNS 更新スクリプト(複数ホスト名 対応版) # ※Script by mocha 2006/08/17 Ver.0.91 # # Copyright (C) 2006 mocha All Rights Reserved # Web Site http://www.moca-cocoa.net/ # #FreeBSD 6.0 にて動作確認。 要 wget(/usr/ports/ftp/wget) # #動作毎に、ipアドレスファイルと自回線IPを比較し、 #ipアドレス変化時のみ、DDNSを更新します。 # #cron と組み合わせると良いでしょう。 V(^0^) # # /etc/crontab の例 #*/30 * * * * root /usr/local/bin/ddnsc # #このスクリプトのパス、実行 # /usr/local/bin/ddnsc # # ※一時的に、DDNS 更新したい場合は、ip_addrの「内容」を削除してみて下さい。 # # ※mocha の練習用に作成した物なので、自己責任でお使い下さいね。(^_^;) #==================================================================== # 設定項目 #ipアドレスファイル $ip_addr = "/etc/ddnsc/ip_addr"; # "/" からのフルパスで設定 #ログファイル $log_file = "/var/log/ddnsc.log"; # "/" からのフルパスで設定 #自回線IP確認 URL $wan_ip_url = "http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip"; #VALUE-DOMAIN DDNS更新ページURL $ddns_update = "http://dyn.value-domain.com/cgi-bin/dyn.fcg"; #アカウント情報 $domain = "example.com"; # ドメイン名設定 $password = "123456"; # パスワード設定 $hostname = "*"; # ホスト名設定(例: *(全ホスト)、www、指定なしはホスト名なし) #複数ホスト名の同時更新 # # $subhost を変更する場合は、必ず ip_addrの「内容」を削除して下さい。 $subhost = "0"; # 同時に、二つのホスト名を更新する場合は、$subhost = "1"; と指定します(1以外は無視) $hostname2 = ""; # $subhost = "1"; にしてから、ホスト名設定します(書式は、$hostnameと同様) # # ※これ以下は、VALUE-DOMAIN のDDNSでは、設定不要です。 #-------------------------------------------------------------------- #インターバル更新をするか(VALUE-DOMAIN のDDNSでは、不要です。) $int_pgm = "0"; # 指定日ごとの、更新をする場合は、$int_pgm = "1"; と指定します(1以外は無視) #何日ごとに更新するか(VALUE-DOMAIN のDDNSでは、不要です。) # 1. 6日 2. 13日 3. 27日 4. 58日 から選択して下さい。 $for_pgm = "0"; # 1から4の数値で指定します。(1から4の数値以外は、全て58日に設定されます) #起動開始時間ファイル(VALUE-DOMAIN のDDNSでは、不要です。) $sta_time = "/etc/ddnsc/st_time"; # "/" からのフルパスで設定 #-------------------------------------------------------------------- #設定完了 #==================================================================== #インターバル更新をするか if ($int_pgm eq "1") { #起動開始時間ファイルの読込み $sta_time1_1 = `cat $sta_time`; $sta_time1_2 = $sta_time1_1; #現在の時間を定義 $cnt_time = time; #起動開始時間ファイルデータが有るか if ($sta_time1_2 eq "0") { #時間数値が無いので、起動開始時間の記録 open (FILE2 ,">$sta_time"); print FILE2 $cnt_time; close FILE2; } #set1 else{ #設定時間の変換 $for_pgm1_1 = $for_pgm; #インターバル更新設定日数判定 if ($for_pgm1_1 == 1) { #86400*6= 518400 $for_pgm1_2 = 518400; } elsif ($for_pgm1_1 == 2) { #86400*13= 1123200 $for_pgm1_2 = 1123200; } elsif ($for_pgm1_1 == 3) { #86400*27= 2332800 $for_pgm1_2 = 2332800; } elsif ($for_pgm1_1 == 4) { #86400*58= 5011200 $for_pgm1_2 = 5011200; } else{ #86400*58 ※設定値以外の場合 $for_pgm1_2 = 5011200; } #現在時間と設定時間の和 $sta_time1_3 = $for_pgm1_2 + $sta_time1_2; #更新時間の判定 if ($sta_time1_3 <= $cnt_time) { #インターバル更新する #空IPを、ipアドレスファイルに記録 $du_ip = ""; open (FILE ,">$ip_addr"); print FILE "$du_ip"; close FILE; #起動開始時間の初期化 $du_cnt_time = 0; open (FILE3 ,">$sta_time"); print FILE3 "$du_cnt_time"; close FILE3; #次回インターバル更新のお知らせ (ログ記録) #ログ書込み $time = localtime; $mes_log = "DDNS Update Info 次回以降、インターバル更新実施"; open (FILE4 ,">>$log_file"); print FILE4 "$time $mes_log\n"; close FILE4; } else{ } #set1 } } else{ } # DDNS 更新部分 ======================================================= #二つのホスト名を更新するかの判断 if ($subhost eq "1") { #-------------------------------------------------------------------- #サブ始まり #自IPの取得 $new_ip = `/usr/local/bin/wget -q -t 5 -T 30 -O - $wan_ip_url`; #自IPが取得出来たか確認 if ($new_ip ne "") { #応答文字列の取り出し (1) $new_ip1 = $new_ip; $new_ip1_1 = substr($new_ip1, 0, 15); #自IPが取得出来たので、更新しているか判断 #ipアドレスファイルの読込み $old_ip = `cat $ip_addr`; if ($new_ip1_1 ne $old_ip) { $status = `/usr/local/bin/wget -q -t 5 -T 30 -O - '$ddns_update?d=$domain&p=$password&h=$hostname2'`; if ($status eq "") { $nnew_ip = $new_ip1_1; $sstatus = "500 Error"; } else{ #応答文字列の取り出し (2) $status1 = $status; $status1_1 = substr($status1, 0, 8); $nnew_ip = $new_ip1_1; $sstatus = $status1_1; #IPアドレス更新判定変数 $ipsub_ch = "1"; } } else{ $nnew_ip = $new_ip1_1; $sstatus = "Next Time"; exit; # (1/2)このexitをコメントアウトすると、毎起動時にログを追加します ((((((^_^;) } } #自IPが取得出来なかった場合 else { $nnew_ip = "IP failed"; $sstatus = "DDNS failed"; } #$hostname2の@変換(ログ表示上のみ) if ($hostname2 eq "") { $hostname2_1 = "@"; } else { $hostname2_1 = $hostname2; } # } else { #IPアドレス更新判定変数 $ipsub_ch = "0"; #自IPの取得(単独ホスト名更新時のみ使用) $new_ip = `/usr/local/bin/wget -q -t 5 -T 30 -O - $wan_ip_url`; } #サブ終わり #-------------------------------------------------------------------- #メイン始まり #自IPが取得出来たか確認 if ($new_ip ne "") { #応答文字列の取り出し (1) $mnew_ip1 = $new_ip; $mnew_ip1_1 = substr($mnew_ip1, 0, 15); #自IPが取得出来たので、更新しているか判断 #ipアドレスファイルの読込み $mold_ip = `cat $ip_addr`; if ($mnew_ip1_1 ne $mold_ip) { $mstatus = `/usr/local/bin/wget -q -t 5 -T 30 -O - '$ddns_update?d=$domain&p=$password&h=$hostname'`; if ($mstatus eq "") { $mnnew_ip = $mnew_ip1_1; $msstatus = "500 Error"; } else{ #応答文字列の取り出し (2) $mstatus1 = $mstatus; $mstatus1_1 = substr($mstatus1, 0, 8); $mnnew_ip = $mnew_ip1_1; $msstatus = $mstatus1_1; #二つのホスト名を更新する場合は、両方更新時のみ書込み if ($subhost eq "1") { #IPアドレス更新判定変数が1ならば、ファイルに記録 if ($ipsub_ch eq "1") { #新IPを、ipアドレスファイルに記録 open (FILE ,">$ip_addr"); print FILE $mnew_ip1_1; close FILE; } } #単独のホスト名更新なので、更新書込み else{ #新IPを、ipアドレスファイルに記録 open (FILE ,">$ip_addr"); print FILE $mnew_ip1_1; close FILE; } } } else{ $mnnew_ip = $mnew_ip1_1; $msstatus = "Next Time"; exit; # (2/2)このexitをコメントアウトすると、毎起動時にログを追加します ((((((^_^;) } } #自IPが取得出来なかった場合 else { $mnnew_ip = "IP failed"; $msstatus = "DDNS failed"; } #以下、共通処理項目 #$hostnameの@変換(ログ表示上のみ) if ($hostname eq "") { $hostname1_1 = "@"; } else { $hostname1_1 = $hostname; } #ログの書き分け if ($subhost eq "1") { #ログ書込み(メインとサブ) $time = localtime; open (FILE ,">>$log_file"); print FILE "$time $domain Update $hostname1_1 $mnnew_ip $msstatus\n"; print FILE "$time $domain Update $hostname2_1 $nnew_ip $sstatus\n"; close FILE; } else{ #ログ書込み(メインのみ) $time = localtime; open (FILE ,">>$log_file"); print FILE "$time $domain Update $hostname1_1 $mnnew_ip $msstatus\n"; close FILE; } #メイン終わり exit; |