Skip to content

Commit 42721d2

Browse files
committed
Update he_ddns_enable.service
1 parent 4bf7e6a commit 42721d2

File tree

1 file changed

+90
-58
lines changed

1 file changed

+90
-58
lines changed

he_ddns/bin/he_ddns_enable.service

Lines changed: 90 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,10 @@ PRIVATE_VAR="${PRIVATE_ROOT}/var"
3737
# 设置自定义变量LOGFILE为日志文件
3838
LOGFILE="${PRIVATE_VAR}/log.txt"
3939
#
40-
# WAN0_GW_IFNAME: The interface name of gateway
41-
# 设置自定义变量WAN0_GW_IFNAME为网关设备名
40+
# WAN0_GW_IFNAME: The interface name of WAN0 gateway
41+
# 设置自定义变量WAN0_GW_IFNAME为WAN0网关设备名
4242
WAN0_GW_IFNAME="$(nvram get wan0_gw_ifname)"
4343
#
44-
# SOURCE_OF_PUBLIC_IP_ADDRESS: The source of public IP address
45-
# 设置自定义变量SOURCE_OF_PUBLIC_IP_ADDRESS为公网IP地址来源
46-
SOURCE_OF_PUBLIC_IP_ADDRESS="whatismyip.akamai.com"
47-
#SOURCE_OF_PUBLIC_IP_ADDRESS="ident.me"
48-
#
4944
# FQDN: The FQDN of the target server
5045
# 设置自定义变量FQDN为目标服务器FQDN
5146
FQDN="$(/opt/bin/sed -E -n -e 's#^FQDN=\"(.+)\"#\1#p' "${PRIVATE_ETC}/he_ddns.config")"
@@ -73,28 +68,87 @@ MAIL_TO="$(/opt/bin/sed -E -n -e 's#^MAIL_TO=\"(.+)\"#\1#p' "${PRIVATE_ETC}/he_d
7368
########## END ##########
7469
#
7570
#
76-
########## TEST IP ADDRESS AND UPDATE DNS RECORD ##########
71+
########## LOAD FUNCTIONS ##########
72+
#
73+
getIPAddress()
74+
{
75+
# SOURCE_OF_EXTERNAL_IP_ADDRESS: The source of external IP address
76+
# 设置自定义变量SOURCE_OF_EXTERNAL_IP_ADDRESS为外部IP地址来源
77+
for SOURCE_OF_EXTERNAL_IP_ADDRESS in "icanhazip.com" "whatismyip.akamai.com" "ident.me" "ifconfig.me"
78+
do
79+
# EXTERNAL_IPV4_ADDRESS: The external IPv4 address
80+
# 设置自定义变量EXTERNAL_IPV4_ADDRESS为外部IPv4地址
81+
EXTERNAL_IPV4_ADDRESS="$(/opt/bin/curl -s -4 "${SOURCE_OF_EXTERNAL_IP_ADDRESS}")"
82+
#
83+
# EXTERNAL_IPV6_ADDRESS: The external IPv6 address
84+
# 设置自定义变量EXTERNAL_IPV6_ADDRESS为外部IPv6地址
85+
#EXTERNAL_IPV6_ADDRESS="$(/opt/bin/curl -s -6 "${SOURCE_OF_EXTERNAL_IP_ADDRESS}")"
86+
#
87+
if [ -n "${EXTERNAL_IPV4_ADDRESS}" ]
88+
then
89+
break
90+
fi
91+
#
92+
done
93+
#
94+
# WAN0_GW_IPV4_ADDRESS: The IPv4 address of the router's WAN0 gateway
95+
# 设置自定义变量WAN0_GW_IPV4_ADDRESS为路由器WAN0网关IPv4地址
96+
WAN0_GW_IPV4_ADDRESS="$(ip address show dev "${WAN0_GW_IFNAME}" | /opt/bin/sed -E -n -e 's/^[[:space:]]*inet[[:space:]]*([[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*).*/\1/p')"
97+
#
98+
# WAN0_GW_IPV6_ADDRESS: The IPv6 address of the router's WAN0 gateway
99+
# 设置自定义变量WAN0_GW_IPV6_ADDRESS为路由器WAN0网关IPv6地址
100+
#WAN0_GW_IPV6_ADDRESS="$()"
101+
}
102+
#
103+
########## END ##########
104+
#
105+
#
106+
########## TEST CONNECTION AND UPDATE DNS RECORD ##########
77107
#
78-
# FAIL_DATE: The date on which the 1st fail test of IP address happens
79-
# 设置自定义变量FAIL_DATE为首次IP地址测试失败的发生日期
108+
# FAIL_DATE: The date of the first failure
109+
# 设置自定义变量FAIL_DATE为首次失败的时间
80110
FAIL_DATE=""
81111
#
82-
# FAIL_COUNT: The count of fail tests of IP address
83-
# 设置自定义变量FAIL_COUNT为IP地址测试失败计数
112+
# FAIL_COUNT: The count of failure
113+
# 设置自定义变量FAIL_COUNT为失败计数
84114
FAIL_COUNT=0
85115
#
86116
# Test WAN connection
87117
# 测试WAN连接
88118
while [ ${FAIL_COUNT} -lt 3 ]
89119
do
90-
ping -q -c 1 -s 32 -W 5 "${SOURCE_OF_PUBLIC_IP_ADDRESS}" > /dev/null 2>&1
120+
RESULT_1_OF_CONNECTION_TEST="$(ping -q -c 1 -s 32 -W 5 "www.bing.com" 2> /dev/null | grep "100%")"
121+
RESULT_2_OF_CONNECTION_TEST="$(ping -q -c 1 -s 32 -W 5 "www.alibaba.com" 2> /dev/null | grep "100%")"
122+
RESULT_3_OF_CONNECTION_TEST="$(ping -q -c 1 -s 32 -W 5 "www.baidu.com" 2> /dev/null | grep "100%")"
91123
#
92-
if [ ${?} -eq 0 ]
124+
if [ -z "${RESULT_1_OF_CONNECTION_TEST}"] || [ -z "${RESULT_2_OF_CONNECTION_TEST}"] || [ -z "${RESULT_3_OF_CONNECTION_TEST}"]
93125
then
94-
FAIL_DATE=""
95-
FAIL_COUNT=0
126+
getIPAddress
96127
#
97-
break
128+
if [ -n "${EXTERNAL_IPV4_ADDRESS}" ] && [ -n "${WAN0_GW_IPV4_ADDRESS}" ]
129+
then
130+
FAIL_DATE=""
131+
FAIL_COUNT=0
132+
#
133+
break
134+
#
135+
else
136+
if [ -z "${FAIL_DATE}" ]
137+
then
138+
FAIL_DATE="$(/opt/bin/date "+%F %T")"
139+
fi
140+
#
141+
FAIL_COUNT=$((${FAIL_COUNT}+1))
142+
#
143+
if [ ${FAIL_COUNT} -ge 3 ]
144+
then
145+
/opt/bin/echo -e "FAILURE: [${FAIL_DATE}] CAN NOT GET IP ADDRESS" | /opt/bin/tee -a "${LOGFILE}"
146+
#
147+
exit 2
148+
fi
149+
#
150+
/opt/bin/sleep 5
151+
fi
98152
#
99153
else
100154
if [ -z "${FAIL_DATE}" ]
@@ -115,56 +169,40 @@ do
115169
fi
116170
done
117171
#
118-
# Check if the IP address of the router's WAN port is equal to the public IP address. If the answer is yes, update DNS record and exit. And if the answer is no, repeat the test up to 3 times. If all the answers are no, send an email as notification and exit.
119-
# 检查路由器WAN口IP地址是否为公网IP地址。如果是,则更新DNS记录,退出程序;如果不是,则重复测试三次。如三次全都不是,则发送通知邮件,退出程序
172+
# Check if the IP address of the router's WAN0 gateway is equal to the external IP address. If the answer is yes, update DNS record and exit. And if the answer is no, repeat the test up to 3 times. If all the answers are no, send an email as notification and exit.
173+
# 检查路由器WAN0网关IP地址是否为外部IP地址。如果是,则更新DNS记录,退出程序;如果不是,则重复测试三次。如三次全都不是,则发送通知邮件,退出程序
120174
#
121175
while [ ${FAIL_COUNT} -lt 3 ]
122176
do
123-
# PUBLIC_IPV4_ADDRESS: The public IPv4 address
124-
# 设置自定义变量PUBLIC_IPV4_ADDRESS为公网IPv4地址
125-
PUBLIC_IPV4_ADDRESS="$(/opt/bin/curl -s -4 "${SOURCE_OF_PUBLIC_IP_ADDRESS}")"
126-
#
127-
# PUBLIC_IPV6_ADDRESS: The public IPv6 address
128-
# 设置自定义变量PUBLIC_IPV6_ADDRESS为公网IPv6地址
129-
#PUBLIC_IPV6_ADDRESS="$(/opt/bin/curl -s -6 "${SOURCE_OF_PUBLIC_IP_ADDRESS}")"
130-
#
131-
# WAN_IPV4_ADDRESS: The IPv4 address of the router's WAN port
132-
# 设置自定义变量WAN_IPV4_ADDRESS为路由器WAN口IPv4地址
133-
WAN_IPV4_ADDRESS="$(ip address show dev "${WAN0_GW_IFNAME}" | /opt/bin/sed -E -n -e 's/^[[:space:]]*inet[[:space:]]*([[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*).*/\1/p')"
134-
#
135-
# WAN_IPV6_ADDRESS: The IPv6 address of the router's WAN port
136-
# 设置自定义变量WAN_IPV6_ADDRESS为路由器WAN口IPv6地址
137-
#WAN_IPV6_ADDRESS="$()"
138-
#
139-
# Check if ${WAN_IPV4_ADDRESS} is equal to ${PUBLIC_IPV4_ADDRESS}
140-
# 检查${WAN_IPV4_ADDRESS}与${PUBLIC_IPV4_ADDRESS}是否相等
141-
if [ "${WAN_IPV4_ADDRESS}" == "${PUBLIC_IPV4_ADDRESS}" ]
177+
# Check if ${WAN0_GW_IPV4_ADDRESS} is equal to ${EXTERNAL_IPV4_ADDRESS}
178+
# 检查${WAN0_GW_IPV4_ADDRESS}与${EXTERNAL_IPV4_ADDRESS}是否相等
179+
if [ "${WAN0_GW_IPV4_ADDRESS}" == "${EXTERNAL_IPV4_ADDRESS}" ]
142180
then
143181
# Choose one of the following metheds to update DNS record
144-
# 如果${WAN_IPV4_ADDRESS}与${PUBLIC_IPV4_ADDRESS}相等,则执行
182+
# 如果${WAN0_GW_IPV4_ADDRESS}与${EXTERNAL_IPV4_ADDRESS}相等,则执行
145183
#
146184
# GET IPv4
147185
# GET方法更新IPv4
148-
RESULT="$(/opt/bin/curl -s -k "https://dyn.dns.he.net/nic/update?hostname=${FQDN}&password=${DDNS_PASSWORD}&myip=${PUBLIC_IPV4_ADDRESS}" | /opt/bin/sed -E -n -e 's/([[:alpha:]]+)[[:space:]]+.*/\1/p')"
186+
RESULT_OF_DDNS_UPDATE="$(/opt/bin/curl -s -k "https://dyn.dns.he.net/nic/update?hostname=${FQDN}&password=${DDNS_PASSWORD}&myip=${EXTERNAL_IPV4_ADDRESS}" | /opt/bin/sed -E -n -e 's/([[:alpha:]]+)[[:space:]]+.*/\1/p')"
149187
#
150188
# GET IPv6
151189
# GET方法更新IPv6
152-
#/opt/bin/curl -s -k "https://dyn.dns.he.net/nic/update?hostname=${FQDN}&password=${DDNS_PASSWORD}&myip=${PUBLIC_IPV6_ADDRESS}" > /dev/null 2>&1
190+
#RESULT_OF_DDNS_UPDATE="$(/opt/bin/curl -s -k "https://dyn.dns.he.net/nic/update?hostname=${FQDN}&password=${DDNS_PASSWORD}&myip=${EXTERNAL_IPV6_ADDRESS}" | /opt/bin/sed -E -n -e 's/([[:alpha:]]+)[[:space:]]+.*/\1/p')"
153191
#
154192
# POST IPv4
155193
# POST方法更新IPv4
156-
#/opt/bin/curl -s -k "https://dyn.dns.he.net/nic/update" -d "hostname=${FQDN}" -d "password=${DDNS_PASSWORD}" -d "myip=${PUBLIC_IPV4_ADDRESS}" > /dev/null 2>&1
194+
#RESULT_OF_DDNS_UPDATE="$(/opt/bin/curl -s -k "https://dyn.dns.he.net/nic/update" -d "hostname=${FQDN}" -d "password=${DDNS_PASSWORD}" -d "myip=${EXTERNAL_IPV4_ADDRESS}" | /opt/bin/sed -E -n -e 's/([[:alpha:]]+)[[:space:]]+.*/\1/p')"
157195
#
158196
# POST IPv6
159197
# POST方法更新IPv6
160-
#/opt/bin/curl -s -k "https://dyn.dns.he.net/nic/update" -d "hostname=${FQDN}" -d "password=${DDNS_PASSWORD}" -d "myip=${PUBLIC_IPV6_ADDRESS}" > /dev/null 2>&1
198+
#RESULT_OF_DDNS_UPDATE="$(/opt/bin/curl -s -k "https://dyn.dns.he.net/nic/update" -d "hostname=${FQDN}" -d "password=${DDNS_PASSWORD}" -d "myip=${EXTERNAL_IPV6_ADDRESS}" | /opt/bin/sed -E -n -e 's/([[:alpha:]]+)[[:space:]]+.*/\1/p')"
161199
#
162-
case "${RESULT}" in
200+
case "${RESULT_OF_DDNS_UPDATE}" in
163201
"good")
164-
/opt/bin/echo -e "SUCCESS: [$(/opt/bin/date "+%F %T")] ${FQDN} 👉 ${PUBLIC_IPV4_ADDRESS}" | /opt/bin/tee -a "${LOGFILE}"
202+
/opt/bin/echo -e "SUCCESS: [$(/opt/bin/date "+%F %T")] ${FQDN} 👉 ${EXTERNAL_IPV4_ADDRESS}" | /opt/bin/tee -a "${LOGFILE}"
165203
;;
166204
"nochg")
167-
/opt/bin/echo -e "NO-CHANGES: ${FQDN} 👉 ${PUBLIC_IPV4_ADDRESS}"
205+
/opt/bin/echo -e "NO-CHANGES: ${FQDN} 👉 ${EXTERNAL_IPV4_ADDRESS}"
168206
;;
169207
esac
170208
#
@@ -174,41 +212,35 @@ do
174212
exit 0
175213
#
176214
else
177-
# Check if ${FAIL_DATE} exists
178-
# 检查${FAIL_DATE}是否存在
179215
if [ -z "${FAIL_DATE}" ]
180216
then
181217
FAIL_DATE="$(/opt/bin/date "+%F %T")"
182218
fi
183219
#
184-
# Add 1 to ${FAIL_COUNT}
185-
# ${FAIL_COUNT}加1
186220
FAIL_COUNT=$((${FAIL_COUNT}+1))
187221
#
188-
# Check if ${FAIL_COUNT} is not less than 3
189-
# 检查${FAIL_COUNT}是否不小于3
190222
if [ ${FAIL_COUNT} -ge 3 ]
191223
then
192224
# Send an email as notification
193-
# 如果${WAN_IPV4_ADDRESS}与${PUBLIC_IPV4_ADDRESS}不等,则执行
194-
/opt/bin/echo -e "FAILURE: [${FAIL_DATE}] PUBLIC_IP(${PUBLIC_IPV4_ADDRESS}) WAN_IP(${WAN_IPV4_ADDRESS})" | /opt/bin/tee -a "${LOGFILE}"
225+
# 如果${WAN0_GW_IPV4_ADDRESS}与${EXTERNAL_IPV4_ADDRESS}不等,则执行
226+
/opt/bin/echo -e "FAILURE: [${FAIL_DATE}] EXTERNAL_IP(${EXTERNAL_IPV4_ADDRESS}) WAN0_GW_IP(${WAN0_GW_IPV4_ADDRESS})" | /opt/bin/tee -a "${LOGFILE}"
195227
#
196228
# Prepare mail contents
197229
# 准备邮件内容
198230
MAIL_SUBJECT="DDNS ERROR: NO PUBLIC IP ADDRESS"
199231
MAIL_CONTENTS="${PRIVATE_USR}/NO_PUBLIC_IP_ADDRESS"
200-
/opt/bin/sed -e '1i\From:'"${MAIL_FROM}"'\nTo:'"${MAIL_TO}"'\nSubject:'"${MAIL_SUBJECT}"'\n\nDATE: '"${FAIL_DATE}"'\nFQDN: '"${FQDN}"'\nWAN_IPV4_ADDRESS: '"${WAN_IPV4_ADDRESS}"'\nPUBLIC_IPV4_ADDRESS: '"${PUBLIC_IPV4_ADDRESS}"'' "${MAIL_CONTENTS}" > "${PRIVATE_TMP}/mail.tmp"
232+
/opt/bin/sed -e '1i\From:'"${MAIL_FROM}"'\nTo:'"${MAIL_TO}"'\nSubject:'"${MAIL_SUBJECT}"'\n\nDATE: '"${FAIL_DATE}"'\nFQDN: '"${FQDN}"'\nWAN0_GW_IPV4_ADDRESS: '"${WAN0_GW_IPV4_ADDRESS}"'\nEXTERNAL_IPV4_ADDRESS: '"${EXTERNAL_IPV4_ADDRESS}"'' "${MAIL_CONTENTS}" > "${PRIVATE_TMP}/mail.tmp"
201233
#
202234
# Send
203235
# 发送
204236
/opt/bin/curl -s --url "${MAIL_SMTP_SERVER}" --mail-from "${MAIL_FROM}" --mail-rcpt "${MAIL_TO}" --upload-file "${PRIVATE_TMP}/mail.tmp" --user "${MAIL_FROM}:${MAIL_PASSWORD}" > /dev/null 2>&1
205237
#
206-
exit 2
238+
exit 3
207239
fi
208240
#
209-
# Wait for 5 seconds
210-
# 等待5秒
211241
/opt/bin/sleep 5
242+
#
243+
getIPAddress
212244
fi
213245
done
214246
#

0 commit comments

Comments
 (0)