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は使ってみると面白かったので、
もうちょっと遊んでみようとは思いますが、
そろそろ本筋に話を戻していこうと思います。

ではでは、、、、

コメントを残す

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