はじめに
初めて自宅サーバーを運営する際にお世話になったDiCEが使えるということで、昔からValueDomainを愛用しているのですが、Linux向けはx86向けバイナリでの配布の為、Raspberry Pi (aarch64)では動作しませんでした。
ValueDomainのDDNS設定方法を調べていると、別な方法で設定できることが今回わかりましたので、シェルスクリプトでレコードを更新するプログラムを作成してみました。
リレーノードでcronにより定期的に実行する想定で作っています。
使用方法
- 以下のスクリプトを好きな名前のshファイル名で保存します。
- ユーザー設定にある
DOMAIN_NAME、PASSWORD、TARGET_HOST
を適切な値に変更します。 - 引数無しで実行してください。
なお同じディレクトリに IP_ADDRESSというファイルが作成されます。
スクリプト
#!/bin/bash
#############################################################################
# 本スクリプトはValueDomainで管理されているドメインのIPを更新するものです
# スクリプトが原因で発生した一切の損害等に対し作成者は責任を負いません
# その為、使用は自己責任でお願いいたします。
# Author: bamboo[BAMBO] bamboo.pool.jp@gmail.com
#############################################################################
# ユーザー設定
#=============================
# 更新対象のドメイン名を設定します 例) bammboo-pool.com
DOMAIN_NAME=""
# ValueDomain上でDDNS用に設定したパスワードを記載します(※ValueDomainのログインパスワードではありません)
PASSWORD=""
# 更新対象のホスト名を設定します 例) a test xxx.xxx.xxx.xxx を更新する場合は test
TARGET_HOST=""
#=============================
# ! 警告 ! 以降の行は書き換えないでください
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# ValueDomain CGI URL
URL=https://dyn.value-domain.com/cgi-bin/dyn.fcg
# ValueDomain IP確認CGI URL
URL_IP_GET=${URL}?ip
# 現在のIPアドレスを取得
IP_ADR_NOW=`wget -qO- ${URL_IP_GET}`
if [[ "${IP_ADR_NOW}" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] ; then
echo "現在のIPアドレスは ${IP_ADR_NOW} です"
else
echo "取得したIPアドレス「${IP_ADR_NOW}」が不正です。"
exit
fi
# 前回のIPアドレスを格納するファイル名
IP_ADR_FILE="IP_ADDRESS"
# 前回のIPアドレスを格納したファイルへのパス
IP_ADR_FILE_PATH=./${IP_ADR_FILE}
# 前回のIPアドレスを格納したファイルが存在するかチェック
if [ ! -e ${IP_ADR_FILE_PATH} ]; then
# 存在しない場合はdummy IPアドレスで作成する
echo "0.0.0.0" > ${IP_ADR_FILE_PATH}
fi
# 前回のIPアドレスを取得
IP_ADR_BEFORE=`cat ${IP_ADR_FILE_PATH}`
echo "前回のIPアドレスは ${IP_ADR_BEFORE} です"
if [ ${IP_ADR_NOW} != ${IP_ADR_BEFORE} ]; then
echo "IPアドレスの更新を試みます"
URL_IP_PUT="${URL}?d=${DOMAIN_NAME}&p=${PASSWORD}&h=${TARGET_HOST}&i=${IP_ADR_NOW}"
RESULT=`wget -qO- ${URL_IP_PUT} | sed -n '1p' | sed 's/status=//g'`
# ステータスコードは https://www.value-domain.com/ddns.php?action=howto を参照しています
case "${RESULT}" in
# 更新に成功
"0")
echo "OK DNSの更新が正常に完了しました。"
echo ${IP_ADR_NOW} > ${IP_ADR_FILE_PATH}
;;
# 不正なリクエスト
"1")
echo "ERROR 不正なリクエスト"
;;
# 不正なドメインとパスワード
"2")
echo "ERROR ドメイン名かパスワードが間違っています"
;;
# 不正なIPアドレス
"3")
echo "ERROR 設定しようとしたIPアドレス「${IP_ADR_NOW}」が不正です"
;;
# パスワードが一致しない
"4")
echo "ERROR パスワードが間違っています"
;;
# データベースサーバーが混雑している
"5")
echo "ERROR 現在ValueDomainが混雑しています。"
;;
# 更新対象のレコードがない
"8")
echo "ERROR 更新対象のレコード「${TARGET_HOST}」が見つかりませんでした。"
;;
# その他のエラー
"9")
echo "ERROR 原因不明のエラーが発生しました。ValueDomainでDDNSが有効に設定されているかを確認してください。"
;;
# 連続アクセス等の過負荷エラー
"503")
echo "ERROR 只今ValueDomainのサーバーが混雑しています。"
;;
# 既定されていないステータス
*)
echo "ERROR 既定されていないステータスコード「${RESULT}」を検出しました。"
;;
esac
else
echo "前回とIPアドレスは変わっていません。"
fi
※その内GitHubで管理予定