このページは、mocha(モカ)の覚え書きです・・・。

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 バリュードメイン では、本来必要無いんですが。(笑) )



★Tips というか、私が忘れない為に・・・。

1.ログの見方について。(説明の為、架空のIP等を使用しています。)

形式は、
(日付)(更新するドメイン名)Update(指定したサブホスト名)(自IP確認状況)(DDNS 更新状況)
となります。

1host のみ更新時は、当然ログは一行づつになります。 (^^;;


Tue Aug 8 13:27:52 2006 moca-cocoa.net Update * 123.456.789.123 500 Error
指定したサブホスト名について、(*)
自IPは確認出来たが(123.456.789.123)、
DDNS 更新はサーバーエラーだった。(500 Error)
この場合、次回以降でDDNS 更新します。

Tue Aug 8 15:29:52 2006 moca-cocoa.net Update @ IP failed DDNS failed
指定したサブホスト名について、(@)
  ※ホスト名を指定しない「空白」場合、ログの(指定したサブホスト名)には、@ が入ります。
自IPは検出出来なかった。(IP failed)、
自IPの確認出来ない時は、DDNS 更新しません。(DDNS failed)
この場合、次回以降でDDNS 更新します。

Tue Aug 8 18:20:39 2006 moca-cocoa.net Update * 123.456.789.123 status=0
指定したサブホスト名について、(*)
自IPは確認出来た。(123.456.789.123)
DDNS 更新は成功した。(status=0)
この後は、IP更新時、又はインターバル更新設定日中にDDNS 更新します。

Fri Aug 11 18:13:53 2006 DDNS Update Info 次回以降、インターバル更新実施
ログの通りです・・・。 (;^_^A


※このページを読んでうまくいかない場合は、あきらめて下さい。(爆)
※私の、練習用に作成した物なので、自己責任でお使い下さいね。 m(._.)m

※ブラウザ上からドラッグ and コピーし、テキスト形式(euc-jp、改行はLFのみ)で保存してお使い下さい。
※ファイル名はddnscです。(拡張子無し)

#!/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;

更新履歴

2009/04/17 FreeBSD 6.1、6.3、7.0、7.1 にて動作確認済 (報告遅いっ。w)
2006/08/17 コメント一部 追加
2006/08/14 インターバル更新機能 追加
2006/08/10 初版 公開

mocha.moca-cocoa.net

Copyright (C) 2006-2009 mocha All Rights Reserved