mydns-ip-update_v1.13
今度こそ安定版!のはず。。。
Release mydns-ip-update_v1.13 · smileygames/mydns-ip-update (github.com)
▼使い方はこちら
smileygames/mydns-ip-update at v1.13 (github.com)
▼変更履歴(現在)
Issues · smileygames/mydns-ip-update (github.com)
結構フォルダ構造を変えてしまったので、使い方の説明が面倒になったので、
説明文はGitHubの方に統一します。
以下、ソースコード
コンフィグファイル
#!/bin/bash
#
# update ddns Config file
#
# MyDNS
# マルチドメインの場合、例のように [ ] の数字をそろえて追加登録してください
# 例はコメントアウトされているので、先頭の # を外してID等を変更して使用してください
MYDNS_ID[0]="mydnsxxxxxx"
MYDNS_PASS[0]="Password1"
MY_DOMAIN[0]="example.com"
#MYDNS_ID[1]="mydnsxxxxx1"
#MYDNS_PASS[1]="Password1"
#MY_DOMAIN[1]="example1.com"
#MYDNS_ID[2]="mydnsxxxxx2"
#MYDNS_PASS[2]="Password2"
#MY_DOMAIN[2]="example2.com"
# IPV4 アドレス default = on
# IPV4_DDNS 動的IPアドレス mydns-ip-change.serviceが無効の場合は動作しない
# (default) IPV4_DDNS = on
IPV4=on
IPV4_DDNS=on
# IPV6 アドレス default = off
# IPV6_DDNS 動的IPアドレス mydns-ip-change.serviceが無効の場合は動作しない
# default = on
IPV6=off
IPV6_DDNS=on
# s: 秒(seconds)
# m: 分(minutes)
# h: 時間(hours)
# d: 日(days)
# UPDate Timer 6h (default)
UPDATE_TIME=6h
# DDNS UPDate Timer 3m (default)
DDNS_TIME=3m
MyDNSへの定期アドレス通知処理
#!/bin/bash
#
# update IP address
#
# MyDNS
# Include File
FILE_DIR="/usr/local/mydns-ip-update/"
source "${FILE_DIR}mydns-ip.conf"
source "${FILE_DIR}bin/mydns-ip-common.sh"
mydns_update() {
if [ "$IPV4" = on ]; then
multi_domain_update "https://ipv4.mydns.jp/login.html"
fi
if [ "$IPV6" = on ]; then
multi_domain_update "https://ipv6.mydns.jp/login.html"
fi
}
multi_domain_update() {
LOGIN_URL=$1
for i in ${!MYDNS_ID[@]}; do
if [[ ${MYDNS_ID[$i]} = "" ]] || [[ ${MYDNS_PASS[$i]} = "" ]]; then
no_value_err_message "MYDNS_ID[$ARRAY_NUM] or MYDNS_PASS[$ARRAY_NUM]"
continue
fi
dns_accsse $i $LOGIN_URL
done
}
# 実行スクリプト(タイマー処理)
sleep 5m;mydns_update
while true;do
sleep $UPDATE_TIME;mydns_update
done
IPアドレス変更時だけMyDNSへ通知する処理
#!/bin/bash
#
# update dynamic IP address
#
# MyDNS
# Include File
FILE_DIR="/usr/local/mydns-ip-update/"
source "${FILE_DIR}mydns-ip.conf"
source "${FILE_DIR}bin/mydns-ip-common.sh"
mydns_change() {
if [ "$IPV4" = on ] && [ "$IPV4_DDNS" = on ]; then
SERVER_IPV4=$(curl -s ifconfig.io -4)
if [[ $SERVER_IPV4 != "" ]]; then
multi_domain_change $SERVER_IPV4 "A" "https://ipv4.mydns.jp/login.html"
fi
fi
if [ "$IPV6" = on ] && [ "$IPV6_DDNS" = on ]; then
SERVER_IPV6=$(curl -s ifconfig.io -6)
if [[ $SERVER_IPV6 != "" ]]; then
multi_domain_change $SERVER_IPV6 "AAAA" "https://ipv6.mydns.jp/login.html"
fi
fi
}
multi_domain_change() {
IP_NEW=$1
DNS_RECORD=$2
LOGIN_URL=$3
for i in ${!MYDNS_ID[@]}; do
if [[ ${MY_DOMAIN[$i]} = "" ]] || [[ ${MYDNS_ID[$i]} = "" ]] || [[ ${MYDNS_PASS[$i]} = "" ]]; then
no_value_err_message "MY_DOMAIN[$ARRAY_NUM] or MYDNS_ID[$ARRAY_NUM] or MYDNS_PASS[$ARRAY_NUM]"
continue
fi
IP_OLD=$(dig "${MY_DOMAIN[i]}" $DNS_RECORD +short)
if [[ $IP_NEW != $IP_OLD ]]; then
dns_accsse $i $LOGIN_URL
fi
done
}
# 実行スクリプト(タイマー処理)
while true;do
sleep $DDNS_TIME;mydns_change
done
共通関数
現在はIPアドレスを通知するコマンドとエラー処理
#!/bin/bash
#
# 共通関数置き場
#
# MyDNS
# FUNCNAME[1] = この関数のコール元名
dns_accsse() {
ARRAY_NUM=$1
ACCESS_URL=$2
DNS_ACCESS="${MYDNS_ID[$ARRAY_NUM]}:${MYDNS_PASS[$ARRAY_NUM]} $ACCESS_URL"
timeout 20 curl --max-time 15 -sSu $DNS_ACCESS
if [ $? != 0 ]; then
ERROR_MESSAGE="${FUNCNAME[1]}: Failed Timeout 20sec: curl -u MYDNS_ID[$ARRAY_NUM]:MYDNS_PASS[$ARRAY_NUM] $ACCESS_URL"
echo "$ERROR_MESSAGE"
logger -ip authpriv.err -t "${FUNCNAME[1]}" "$ERROR_MESSAGE"
fi
}
# FUNCNAME[1] = この関数のコール元名
no_value_err_message() {
MESSAGE=$1
ERROR_MESSAGE="${FUNCNAME[1]}: no value: $MESSAGE"
echo "$ERROR_MESSAGE"
logger -ip authpriv.err -t "${FUNCNAME[1]}" "$ERROR_MESSAGE"
}
systemdサービスファイル
[Unit]
Description=mydns-ip-update
[Service]
Type=simple
ExecStart=/usr/local/mydns-ip-update/bin/mydns-ip-update.sh
[Install]
WantedBy=network-online.target
[Unit]
Description=mydns-ip-change
[Service]
Type=simple
ExecStart=/usr/local/mydns-ip-update/bin/mydns-ip-change.sh
[Install]
WantedBy=network-online.target
雑記
かなり複雑化してきましたねぇ。。。
やはり、不特定多数の人に使ってもらおうと思うと、
処理が複雑化してしまいます。
想定してる人がLinux初心者なので余計にねぇ…
まぁ色々想定しなきゃいけないので、
シェルスクリプトの勉強にはいいんだけれども。
とりあえずは、やりたいことは実装できた。
そもそもWEBサーバーの立て方を説明していたはずなのに、
ガッツリ脱線してしまった。(´;ω;`)
ただGitHubは使ってみると面白かったので、
もうちょっと遊んでみようとは思いますが、
そろそろ本筋に話を戻していこうと思います。
ではでは、、、、