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;
|