手当たり次第に書くんだ

飽きっぽいのは本能

VALUE-DOMAIN のダイナミック DNS 更新を PHP スクリプトで自動化

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 スクリプトで自動化

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る