Merge pull request #1151 from sofia-riese/patch-1

refactor(ddns.sh): replace recursion with while loop
This commit is contained in:
juewuy
2026-01-18 10:49:59 +08:00
committed by GitHub

View File

@@ -1,14 +1,14 @@
#! /bin/bash #! /bin/bash
# Copyright (C) Juewuy # Copyright (C) Juewuy
ddns_menu() {
ddns_menu(){ echo "-----------------------------------------------"
echo ----------------------------------------------- echo -e "\033[30;46m欢迎使用DDNS\033[0m"
echo -e "\033[30;46m欢迎使用DDNS\033[0m" load_ddns
load_ddns
} }
add_ddns() { add_ddns() {
cat >>"$ddns_dir" <<EOF cat >>"$ddns_dir" <<EOF
config service '$service' config service '$service'
option enabled '1' option enabled '1'
@@ -27,113 +27,151 @@ config service '$service'
option interface 'wan' option interface 'wan'
option bind_network 'wan' option bind_network 'wan'
EOF EOF
/usr/lib/ddns/dynamic_dns_updater.sh -S "$service" start >/dev/null 2>&1 & /usr/lib/ddns/dynamic_dns_updater.sh -S "$service" start >/dev/null 2>&1 &
sleep 3 sleep 3
echo 服务已经添加! echo "服务已经添加!"
} }
set_ddns() { set_ddns() {
echo ----------------------------------------------- echo "-----------------------------------------------"
read -p "请输入你的域名 > " str read -r -p "请输入你的域名 > " str
[ -z "$str" ] && domain="$domain" || domain="$str" [ -z "$str" ] && domain="$domain" || domain="$str"
echo ----------------------------------------------- echo "-----------------------------------------------"
read -p "请输入用户名或邮箱 > " str read -r -p "请输入用户名或邮箱 > " str
[ -z "$str" ] && username="$username" || username="$str" [ -z "$str" ] && username="$username" || username="$str"
echo ----------------------------------------------- echo "-----------------------------------------------"
read -p "请输入密码或令牌秘钥 > " str read -r -p "请输入密码或令牌秘钥 > " str
[ -z "$str" ] && password="$password" || password="$str" [ -z "$str" ] && password="$password" || password="$str"
echo ----------------------------------------------- echo "-----------------------------------------------"
read -p "请输入检测更新间隔(单位:分钟;默认为10) > " check_interval read -r -p "请输入检测更新间隔(单位:分钟;默认为10) > " check_interval
[ -z "$check_interval" ] || [ "$check_interval" -lt 1 -o "$check_interval" -gt 1440 ] && check_interval=10 [ -z "$check_interval" ] || [ "$check_interval" -lt 1 -o "$check_interval" -gt 1440 ] && check_interval=10
echo ----------------------------------------------- echo "-----------------------------------------------"
read -p "请输入强制更新间隔(单位:小时;默认为24) > " force_interval read -r -p "请输入强制更新间隔(单位:小时;默认为24) > " force_interval
[ -z "$force_interval" ] || [ "$force_interval" -lt 1 -o "$force_interval" -gt 240 ] && force_interval=24 [ -z "$force_interval" ] || [ "$force_interval" -lt 1 -o "$force_interval" -gt 240 ] && force_interval=24
echo ----------------------------------------------- echo "-----------------------------------------------"
echo -e "请核对如下信息:" echo -e "请核对如下信息:"
echo -e "服务商: \033[32m$service\033[0m" echo -e "服务商: \033[32m$service\033[0m"
echo -e "域名: \033[32m$domain\033[0m" echo -e "域名: \033[32m$domain\033[0m"
echo -e "用户名: \033[32m$username\033[0m" echo -e "用户名: \033[32m$username\033[0m"
echo -e "检测间隔: \033[32m$check_interval\033[0m" echo -e "检测间隔: \033[32m$check_interval\033[0m"
echo ----------------------------------------------- echo "-----------------------------------------------"
read -p "确认添加?(1/0) > " res read -r -p "确认添加?(1/0) > " res
[ "$res" = 1 ] && add_ddns || set_ddns if [ "$res" = 1 ]; then
add_ddns
else
set_ddns
fi
} }
set_ddns_service() { set_ddns_service() {
services_dir=/etc/ddns/"$serv" while true; do
[ -s "$services_dir" ] || services_dir=/usr/share/ddns/list services_dir=/etc/ddns/"$serv"
echo ----------------------------------------------- [ -s "$services_dir" ] || services_dir=/usr/share/ddns/list
echo -e "\033[32m请选择服务提供商\033[0m" echo "-----------------------------------------------"
cat "$services_dir" | grep -v '^#' | awk '{print " "NR" " $1}' echo -e "\033[32m请选择服务提供商\033[0m"
nr=$(cat "$services_dir" | grep -v '^#' | wc -l) cat "$services_dir" | grep -v '^#' | awk '{print " "NR" " $1}'
read -p "请输入对应数字 > " num nr=$(cat "$services_dir" | grep -v '^#' | wc -l)
if [ -z "$num" ]; then read -r -p "请输入对应数字 > " num
i= if [ -z "$num" ]; then
elif [ "$num" -gt 0 -a "$num" -lt $nr ]; then i=
service_name=$(cat "$services_dir" | grep -v '^#' | awk '{print $1}' | sed -n "$num"p | sed 's/"//g') break
service=$(echo $service_name | sed 's/\./_/g') elif [ "$num" -gt 0 ] && [ "$num" -lt "$nr" ]; then
set_ddns service_name=$(cat "$services_dir" | grep -v '^#' | awk '{print $1}' | sed -n "$num"p | sed 's/"//g')
else service=$(echo "$service_name" | sed 's/\./_/g')
echo "输入错误,请重新输入!" set_ddns
sleep 1 break
set_ddns_service else
fi echo "输入错误,请重新输入!"
sleep 1
fi
done
} }
set_ddns_type() { set_ddns_type() {
echo ----------------------------------------------- while true; do
echo -e "\033[32m请选择网络模式\033[0m" echo "-----------------------------------------------"
echo -e " 1 \033[36mIPV4\033[0m" echo -e "\033[32m请选择网络模式\033[0m"
echo -e " 2 \033[36mIPV6\033[0m" echo -e " 1 \033[36mIPV4\033[0m"
read -p "请输入对应数字 > " num echo -e " 2 \033[36mIPV6\033[0m"
if [ -z "$num" ]; then echo -e " 0 返回上级菜单"
i= read -r -p "请输入对应数字 > " num
elif [ "$num" = 1 ]; then case "$num" in
use_ipv6=0 "" | 0)
serv=services break
set_ddns_service ;;
elif [ "$num" = 2 ]; then 1)
use_ipv6=1 use_ipv6=0
serv=services_ipv6 serv=services
set_ddns_service set_ddns_service
else break
echo "输入错误,请重新输入!" ;;
sleep 1 2)
set_ddns_type use_ipv6=1
fi serv=services_ipv6
set_ddns_service
break
;;
*)
echo "输入错误,请重新输入!"
sleep 1
;;
esac
done
} }
rev_ddns_service() { rev_ddns_service() {
enabled=$(uci get ddns."$service".enabled) while true; do
[ "$enabled" = 1 ] && enabled_b="停用" || enabled_b="启用" enabled=$(uci get ddns."$service".enabled)
echo ----------------------------------------------- [ "$enabled" = 1 ] && enabled_b="停用" || enabled_b="启用"
echo -e " 1 \033[32m立即更新\033[0m" echo "-----------------------------------------------"
echo -e " 2 编辑当前服务\033[0m" echo -e " 1 \033[32m立即更新\033[0m"
echo -e " 3 $enabled_b当前服务" echo -e " 2 编辑当前服务\033[0m"
echo -e " 4 移除当前服务" echo -e " 3 $enabled_b当前服务"
echo -e " 5 查看运行日志" echo -e " 4 移除当前服务"
echo -e " 0 返回上级菜单" echo -e " 5 查看运行日志"
echo ----------------------------------------------- echo -e " 0 返回上级菜单"
read -p "请输入对应数字 > " num echo "-----------------------------------------------"
if [ -z "$num" -o "$num" = 0 ]; then read -r -p "请输入对应数字 > " num
i= case "$num" in
elif [ "$num" = 1 ]; then "" | 0)
/usr/lib/ddns/dynamic_dns_updater.sh -S $service start >/dev/null 2>&1 & break
sleep 3 ;;
elif [ "$num" = 2 ]; then 1)
domain=$(uci get ddns."$service".domain 2>/dev/null) /usr/lib/ddns/dynamic_dns_updater.sh -S "$service" start >/dev/null 2>&1 &
username=$(uci get ddns."$service".username 2>/dev/null) sleep 3
password=$(uci get ddns."$service".password 2>/dev/null) break
service_name=$(uci get ddns."$service".service_name 2>/dev/null) ;;
uci delete ddns."$service" 2)
set_ddns domain=$(uci get ddns."$service".domain 2>/dev/null)
elif [ "$num" = 3 ]; then username=$(uci get ddns."$service".username 2>/dev/null)
[ "$enabled" = 1 ] && uci set ddns."$service".enabled='0' || uci set ddns."$service".enabled='1' && sleep 3 password=$(uci get ddns."$service".password 2>/dev/null)
uci commit ddns."$service" service_name=$(uci get ddns."$service".service_name 2>/dev/null)
elif [ "$num" = 4 ]; then uci delete ddns."$service"
uci delete ddns."$service" set_ddns
uci commit ddns."$service" break
elif [ "$num" = 5 ]; then ;;
echo ----------------------------------------------- 3)
cat /var/log/ddns/"$service".log 2>/dev/null [ "$enabled" = 1 ] && uci set ddns."$service".enabled='0' || uci set ddns."$service".enabled='1' && sleep 3
sleep 1 uci commit ddns."$service"
fi break
;;
4)
uci delete ddns."$service"
uci commit ddns."$service"
break
;;
5)
echo "-----------------------------------------------"
cat /var/log/ddns/"$service".log 2>/dev/null
sleep 1
break
;;
*)
echo "输入错误,请重新输入!"
sleep 1
;;
esac
done
} }
load_ddns() { load_ddns() {