www.si1230.com は、非固定 IP アドレスであるため、VALUE-DOMAIN のダイナミック DNS を使用してこの WordPress を公開しています。ダイナミック DNS は、インターネット上の DNS サーバーに自宅の IP アドレスを通知することで、非固定 IP アドレス環境においても、FQDN を使用して外部からアクセス可能になる仕組みです。
ダイナミック DNS の性質上、スクリプト等を作成し、定期更新することで、安定した外部アクセスが可能となりますが、今回は自動更新用の PHP スクリプトを作成してみました。
この PHP スクリプトは、定数の domain, passwd, logfile と、変数の $host を環境に合わせて設定します。これを cron に登録することで、定期的に DNS の自動更新が可能となります。VALUE-DOMAIN に登録したすべての A レコード を登録する必要があるので注意が必要です。これでしばらく格闘しました。
<?php
# 変更の必要なし
define('url', 'http://dyn.value-domain.com/cgi-bin/dyn.fcg');
# value-domainに登録しているドメインを設定
define('domain', '******.***');
# value-domainに登録しているパスワードを設定
define('passwd', '************');
# 更新ログを書き込むファイルを設定、事前に作成する必要があります
define('logfile', '****.***');
# value-domainに登録しているAレコードを全て設定
$host = array('*', 'www', 'mx');
class update {
private $status;
public function __construct($host) {
$lines = file(url.'?d='.domain.'&p='.passwd.'&h='.$host);
foreach ($lines as $key => $line) {
if ($key === 0) {
$this->status = substr($line,7);
}
}
}
public function get_status() {
return $this->status;
}
}
class clog {
private $handle;
public function __construct() {
if (is_writable(logfile)) {
$this->handle = fopen(logfile, "a") or die("ログファイル[".logfile."]が開けませんn");
flock($this->handle, LOCK_EX);
} else {
print "ログファイル[".logfile."]が存在しませんn";
exit;
}
}
private function close() {
flock($this->handle, LOCK_UN);
fclose($this->handle);
}
public function write($status, $host) {
$now = date("Y/m/d H:i:s");
$fqdn = $host.".".domain;
switch ($status) {
case 0:
fputs($this->handle, $now." [$fqdn] 更新に成功n");
$this->close();
break;
case 1:
fputs($this->handle, $now." [$fqdn] 不正なリクエストn");
$this->close();
break;
case 2:
fputs($this->handle, $now." [$fqdn] 不正なドメイン名とパスワードn");
$this->close();
break;
case 3:
fputs($this->handle, $now." [$fqdn] 不正なIPアドレスn");
$this->close();
break;
case 4:
fputs($this->handle, $now." [$fqdn] パスワードが一致しないn");
$this->close();
break;
case 5:
fputs($this->handle, $now." [$fqdn] データベースサーバーが混雑しているn");
$this->close();
break;
case 9:
fputs($this->handle, $now." [$fqdn] その他のエラーn");
$this->close();
break;
default:
fputs($this->handle, $now." [$fqdn] 不明なエラーn");
$this->close();
}
}
}
foreach ($host as $h) {
$objupdate = new update($h);
$status = $objupdate->get_status();
$objclog = new clog();
$objclog->write($status, $h);
}
VALUE-DOMAIN のダイナミック DNS 更新を PHP スクリプトで自動化