782 lines
23 KiB
Bash
782 lines
23 KiB
Bash
#!/bin/bash
|
||
# ddns-go 自动安装脚本
|
||
# 使用方法: chmod +x ddns-go.sh && ./ddns-go.sh
|
||
|
||
# 彩色输出
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[0;33m'
|
||
BLUE='\033[0;34m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 全局变量
|
||
DDNS_VERSION="" # 当前指定的 ddns-go 版本
|
||
DDNS_PATH="/root/ddns"
|
||
SCRIPT_VERSION="1.0.0"
|
||
|
||
# 日志函数
|
||
log_info() {
|
||
echo -e "${GREEN}[信息]${NC} $1"
|
||
}
|
||
|
||
log_warn() {
|
||
echo -e "${YELLOW}[警告]${NC} $1"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}[错误]${NC} $1"
|
||
}
|
||
|
||
# 获取最新版本号
|
||
get_latest_version() {
|
||
local version=""
|
||
|
||
# 方法1:利用GitHub重定向特性获取最新版本
|
||
local redirect_url=$(curl -s -L -o /dev/null -w '%{url_effective}' https://github.com/jeessy2/ddns-go/releases/latest 2>/dev/null)
|
||
version=$(echo "$redirect_url" | grep -o 'tag/v[0-9.]*' | cut -d/ -f2 2>/dev/null)
|
||
|
||
# 如果获取失败,尝试备用方法
|
||
if [[ -z "$version" ]]; then
|
||
# 方法2: 通过API获取
|
||
version=$(curl -s https://api.github.com/repos/jeessy2/ddns-go/releases/latest | grep -o '"tag_name": "v[0-9.]*"' | cut -d'"' -f4 2>/dev/null)
|
||
fi
|
||
|
||
# 如果还是失败,返回默认版本
|
||
if [[ -z "$version" ]]; then
|
||
version="v6.9.1" # 默认版本
|
||
fi
|
||
|
||
# 直接返回版本号,不打印任何日志
|
||
echo "$version"
|
||
}
|
||
|
||
# 检测系统架构
|
||
detect_arch() {
|
||
# 获取架构
|
||
local arch=$(uname -m)
|
||
local arch_type=""
|
||
|
||
# 转换架构名称为ddns-go使用的格式
|
||
case "$arch" in
|
||
x86_64)
|
||
arch_type="linux_x86_64"
|
||
;;
|
||
i386|i686)
|
||
arch_type="linux_x86"
|
||
;;
|
||
aarch64|arm64)
|
||
arch_type="linux_arm64"
|
||
;;
|
||
armv7*|armv6*)
|
||
arch_type="linux_armv7"
|
||
;;
|
||
armv8*)
|
||
arch_type="linux_arm64"
|
||
;;
|
||
*)
|
||
log_warn "未知架构: $arch,将尝试使用x86_64版本"
|
||
arch_type="linux_x86_64"
|
||
;;
|
||
esac
|
||
|
||
# 直接返回结果而不是写入临时文件
|
||
echo "$arch_type"
|
||
}
|
||
|
||
# 获取IP地址信息
|
||
get_ip_info() {
|
||
local ipv4=$(curl -s ipv4.ip.sb)
|
||
local ipv6=$(curl -s ipv6.ip.sb 2>/dev/null || echo "无")
|
||
|
||
echo "$ipv4|$ipv6"
|
||
}
|
||
|
||
# 配置防火墙 - 仅处理 UFW
|
||
configure_firewall() {
|
||
local port=$1
|
||
log_info "配置防火墙"
|
||
|
||
# 检查是否安装了 ufw
|
||
if command -v ufw &>/dev/null; then
|
||
# 检查ufw是否启用
|
||
local ufw_status=$(ufw status | grep -o "Status: active" 2>/dev/null)
|
||
|
||
if [[ -z "$ufw_status" ]]; then
|
||
log_warn "UFW 防火墙未启用,可能需要手动配置防火墙规则"
|
||
log_info "您可以运行 'sudo ufw enable' 启用 UFW 防火墙"
|
||
return 0
|
||
fi
|
||
|
||
# 检查端口是否已经开放
|
||
if ufw status | grep -q "$port/tcp"; then
|
||
log_info "端口 $port 已经开放,跳过"
|
||
return 0
|
||
fi
|
||
|
||
# 开放端口
|
||
echo -n "配置 UFW 防火墙,开放端口 $port... "
|
||
if ufw allow "$port/tcp" &>/dev/null; then
|
||
echo -e "${GREEN}完成${NC}"
|
||
log_info "已在 UFW 防火墙开放端口: $port"
|
||
else
|
||
echo -e "${RED}失败${NC}"
|
||
log_warn "无法开放端口 $port"
|
||
fi
|
||
else
|
||
log_warn "未检测到 UFW 防火墙,跳过防火墙配置"
|
||
log_info "如需管理防火墙规则,请安装 UFW: sudo apt install ufw"
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
# 关闭防火墙端口 - 仅处理 UFW
|
||
close_firewall_port() {
|
||
local port=$1
|
||
log_info "关闭防火墙端口"
|
||
|
||
# 检查是否安装了 ufw
|
||
if command -v ufw &>/dev/null; then
|
||
# 检查ufw是否启用
|
||
local ufw_status=$(ufw status | grep -o "Status: active" 2>/dev/null)
|
||
|
||
if [[ -z "$ufw_status" ]]; then
|
||
log_warn "UFW 防火墙未启用,跳过防火墙配置"
|
||
return 0
|
||
fi
|
||
|
||
# 检查端口是否已开放在UFW中
|
||
if ! ufw status | grep -q "$port/tcp"; then
|
||
log_info "端口 $port 未在 UFW 中开放,跳过"
|
||
return 0
|
||
fi
|
||
|
||
# 关闭端口
|
||
echo -n "关闭 UFW 防火墙端口 $port... "
|
||
if ufw delete allow "$port/tcp" &>/dev/null; then
|
||
echo -e "${GREEN}完成${NC}"
|
||
log_info "已关闭 UFW 防火墙端口: $port"
|
||
else
|
||
echo -e "${RED}失败${NC}"
|
||
log_warn "无法关闭端口 $port"
|
||
fi
|
||
else
|
||
log_warn "未检测到 UFW 防火墙,跳过防火墙配置"
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
# 安装 ddns-go
|
||
install_ddns_go() {
|
||
clear
|
||
echo "=================================================="
|
||
echo -e "${GREEN}开始安装 ddns-go${NC}"
|
||
echo "=================================================="
|
||
|
||
log_info "开始安装 ddns-go..."
|
||
|
||
# 询问用户是否自定义端口
|
||
local web_port="9876" # 默认端口
|
||
read -rp "是否自定义web访问端口? [y/N] " custom_port
|
||
if [[ "$custom_port" =~ ^[yY]$ ]]; then
|
||
while true; do
|
||
read -rp "请输入端口号 (1-65535): " web_port
|
||
if [[ "$web_port" =~ ^[0-9]+$ ]] && [ "$web_port" -ge 1 ] && [ "$web_port" -le 65535 ]; then
|
||
log_info "将使用端口: $web_port"
|
||
break
|
||
else
|
||
log_error "无效的端口号,请输入1-65535之间的数字"
|
||
fi
|
||
done
|
||
else
|
||
log_info "将使用默认端口: $web_port"
|
||
fi
|
||
|
||
# 更新软件包
|
||
log_info "更新软件包..."
|
||
apt update -y && apt upgrade -y
|
||
|
||
# 安装必要工具
|
||
log_info "安装必要工具..."
|
||
apt install -y wget curl sudo vim git
|
||
|
||
# 创建安装目录
|
||
mkdir -p $DDNS_PATH
|
||
|
||
# 1. 获取版本 - 先获取所有必要变量,不输出日志
|
||
local version=""
|
||
if [[ -n "$DDNS_VERSION" ]]; then
|
||
version="$DDNS_VERSION"
|
||
else
|
||
version=$(get_latest_version)
|
||
fi
|
||
|
||
# 2. 移除版本号前的 'v'
|
||
local version_num=${version#v}
|
||
|
||
# 3. 检测系统架构 - 使用改进后的函数,直接返回结果
|
||
local arch_suffix=$(detect_arch)
|
||
|
||
# 4. 构建下载URL - 使用纯文本变量
|
||
local download_file="ddns-go_${version_num}_${arch_suffix}.tar.gz"
|
||
local download_path="${DDNS_PATH}/${download_file}"
|
||
local download_url="https://github.com/jeessy2/ddns-go/releases/download/${version}/${download_file}"
|
||
|
||
# 5. 现在安全地输出日志
|
||
log_info "获取到最新版本:$version"
|
||
log_info "检测到系统架构: $(uname -m) (使用: $arch_suffix)"
|
||
log_info "下载链接: $download_url"
|
||
|
||
# 6. 下载文件 - 统一使用curl下载
|
||
log_info "正在下载 ddns-go..."
|
||
|
||
if curl -s -L -o "$download_path" "$download_url"; then
|
||
log_info "下载成功"
|
||
else
|
||
log_error "下载失败,请检查网络连接"
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 1
|
||
fi
|
||
|
||
# 7. 解压文件
|
||
log_info "正在解压文件..."
|
||
if tar -zxf "$download_path" -C $DDNS_PATH; then
|
||
log_info "解压成功"
|
||
else
|
||
log_error "解压失败"
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 1
|
||
fi
|
||
|
||
# 8. 设置权限
|
||
chmod +x $DDNS_PATH/ddns-go
|
||
|
||
# 9. 验证可执行文件
|
||
log_info "验证 ddns-go 二进制文件..."
|
||
if [ ! -f $DDNS_PATH/ddns-go ]; then
|
||
log_error "未找到 ddns-go 可执行文件"
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 1
|
||
fi
|
||
|
||
# 10. 测试运行
|
||
if ! $DDNS_PATH/ddns-go -h > /dev/null 2>&1; then
|
||
log_error "ddns-go 可执行文件无法运行,可能是架构不匹配"
|
||
log_info "尝试检查更多架构版本..."
|
||
|
||
# 清理之前的文件
|
||
rm -rf $DDNS_PATH/*
|
||
|
||
# 尝试其他架构版本
|
||
local try_arch_list=("linux_arm64" "linux_armv7" "linux_x86" "linux_x86_64")
|
||
local success=false
|
||
|
||
for try_arch in "${try_arch_list[@]}"; do
|
||
if [ "$try_arch" != "$arch_suffix" ]; then
|
||
log_info "尝试 $try_arch 架构版本..."
|
||
|
||
# 构建下载信息
|
||
local try_file="ddns-go_${version_num}_${try_arch}.tar.gz"
|
||
local try_path="${DDNS_PATH}/${try_file}"
|
||
local try_url="https://github.com/jeessy2/ddns-go/releases/download/${version}/${try_file}"
|
||
|
||
# 下载并解压 - 统一使用curl
|
||
if curl -s -L -o "$try_path" "$try_url" &&
|
||
tar -zxf "$try_path" -C $DDNS_PATH &&
|
||
chmod +x $DDNS_PATH/ddns-go; then
|
||
|
||
# 测试是否可运行
|
||
if $DDNS_PATH/ddns-go -h > /dev/null 2>&1; then
|
||
log_info "$try_arch 架构版本可以运行"
|
||
success=true
|
||
break
|
||
else
|
||
log_warn "$try_arch 架构版本不兼容"
|
||
fi
|
||
else
|
||
log_warn "$try_arch 架构版本下载或解压失败"
|
||
fi
|
||
fi
|
||
done
|
||
|
||
# 如果所有架构都尝试失败
|
||
if [ "$success" = false ]; then
|
||
log_error "无法找到合适的版本,安装失败"
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 1
|
||
fi
|
||
fi
|
||
|
||
# 11. 安装服务
|
||
log_info "安装系统服务..."
|
||
cd $DDNS_PATH
|
||
./ddns-go -s install -l 0.0.0.0:$web_port
|
||
|
||
# 12. 验证服务
|
||
if systemctl status ddns-go > /dev/null 2>&1; then
|
||
log_info "ddns-go 服务已成功安装并运行"
|
||
else
|
||
log_warn "ddns-go 服务可能未正确启动,请手动检查: systemctl status ddns-go"
|
||
fi
|
||
|
||
# 13. 获取IP信息
|
||
local ip_info=$(get_ip_info)
|
||
local ipv4=$(echo "$ip_info" | cut -d'|' -f1)
|
||
|
||
# 14. 配置防火墙
|
||
configure_firewall $web_port
|
||
|
||
log_info "ddns-go 安装完成!"
|
||
echo "=================================================="
|
||
echo -e "${GREEN}安装成功!${NC}"
|
||
echo -e "${CYAN}Web管理界面访问地址: http://$ipv4:$web_port${NC}"
|
||
echo -e "请在浏览器中打开上述地址进行配置"
|
||
echo "=================================================="
|
||
|
||
# 清理下载文件
|
||
rm -f "$download_path"
|
||
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
}
|
||
|
||
# 卸载服务
|
||
uninstall_ddns_go() {
|
||
clear
|
||
echo "=================================================="
|
||
echo -e "${RED}开始卸载 ddns-go${NC}"
|
||
echo "=================================================="
|
||
|
||
# 确认卸载
|
||
echo -e "${YELLOW}警告: 这将卸载 ddns-go 并删除相关文件${NC}"
|
||
read -rp "是否继续? [Y/n] " confirm
|
||
if [[ "$confirm" =~ ^[nN]$ ]]; then
|
||
log_info "卸载已取消"
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 0
|
||
fi
|
||
|
||
log_info "正在卸载 ddns-go 服务..."
|
||
|
||
# 获取端口信息用于关闭防火墙
|
||
local port=""
|
||
if [ -d "$DDNS_PATH" ] && [ -f "$DDNS_PATH/config.yaml" ]; then
|
||
port=$(grep -o 'listen: 0.0.0.0:[0-9]*' "$DDNS_PATH/config.yaml" 2>/dev/null | grep -o '[0-9]*$' | head -n 1)
|
||
fi
|
||
|
||
if [[ -z "$port" ]]; then
|
||
port=$(systemctl status ddns-go 2>/dev/null | grep -o '\-l 0.0.0.0:[0-9]*' | grep -o '[0-9]*$' | head -n 1)
|
||
fi
|
||
|
||
if [ -d "$DDNS_PATH" ]; then
|
||
cd $DDNS_PATH
|
||
if [ -f "./ddns-go" ]; then
|
||
./ddns-go -s uninstall
|
||
log_info "服务已卸载"
|
||
else
|
||
log_error "找不到 ddns-go 可执行文件"
|
||
fi
|
||
|
||
# 询问是否删除文件
|
||
read -rp "是否删除所有 ddns-go 文件? [Y/n] " delete_confirm
|
||
if [[ ! "$delete_confirm" =~ ^[nN]$ ]]; then
|
||
rm -rf $DDNS_PATH
|
||
log_info "所有文件已删除"
|
||
else
|
||
log_info "文件已保留"
|
||
fi
|
||
else
|
||
log_error "找不到 ddns-go 安装目录"
|
||
fi
|
||
|
||
# 关闭防火墙端口
|
||
if [[ -n "$port" ]]; then
|
||
close_firewall_port $port
|
||
fi
|
||
|
||
log_info "ddns-go 卸载完成!"
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
}
|
||
|
||
# 更新 ddns-go
|
||
update_ddns_go() {
|
||
clear
|
||
echo "=================================================="
|
||
echo -e "${YELLOW}更新 ddns-go${NC}"
|
||
echo "=================================================="
|
||
|
||
# 检查是否已安装
|
||
if [ ! -d "$DDNS_PATH" ] || [ ! -f "$DDNS_PATH/ddns-go" ]; then
|
||
log_error "ddns-go 未安装,请先安装"
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 0
|
||
fi
|
||
|
||
# 获取当前版本
|
||
local current_version=""
|
||
current_version=$($DDNS_PATH/ddns-go -v 2>&1 | grep -o 'v[0-9.]*' | head -n 1)
|
||
|
||
if [[ -z "$current_version" ]]; then
|
||
log_warn "无法获取当前版本信息"
|
||
current_version="未知"
|
||
fi
|
||
|
||
log_info "当前版本: $current_version"
|
||
|
||
# 获取最新版本
|
||
local latest_version=$(get_latest_version)
|
||
log_info "最新版本: $latest_version"
|
||
|
||
# 比较版本
|
||
if [[ "$current_version" == "$latest_version" ]]; then
|
||
log_info "已经是最新版本"
|
||
read -rp "是否强制更新? [y/N] " force_update
|
||
if [[ ! "$force_update" =~ ^[yY]$ ]]; then
|
||
log_info "更新已取消"
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 0
|
||
fi
|
||
fi
|
||
|
||
# 备份配置
|
||
local config_backup="$DDNS_PATH/config.yaml.bak"
|
||
if [ -f "$DDNS_PATH/config.yaml" ]; then
|
||
log_info "备份配置文件..."
|
||
cp "$DDNS_PATH/config.yaml" "$config_backup"
|
||
fi
|
||
|
||
# 停止服务
|
||
log_info "停止 ddns-go 服务..."
|
||
cd $DDNS_PATH
|
||
./ddns-go -s uninstall
|
||
|
||
# 下载新版本
|
||
log_info "下载新版本..."
|
||
|
||
# 检测系统架构 - 使用改进后的函数,直接返回结果
|
||
local arch_suffix=$(detect_arch)
|
||
local version_num=${latest_version#v}
|
||
|
||
# 构建下载URL
|
||
local download_file="ddns-go_${version_num}_${arch_suffix}.tar.gz"
|
||
local download_path="${DDNS_PATH}/${download_file}"
|
||
local download_url="https://github.com/jeessy2/ddns-go/releases/download/${latest_version}/${download_file}"
|
||
|
||
log_info "下载链接: $download_url"
|
||
|
||
# 删除原来的二进制文件
|
||
rm -f $DDNS_PATH/ddns-go
|
||
|
||
# 下载文件 - 统一使用curl下载
|
||
if curl -s -L -o "$download_path" "$download_url"; then
|
||
log_info "下载成功"
|
||
else
|
||
log_error "下载失败,请检查网络连接"
|
||
log_warn "将恢复服务"
|
||
if [ -f "$config_backup" ]; then
|
||
cp "$config_backup" "$DDNS_PATH/config.yaml"
|
||
fi
|
||
cd $DDNS_PATH
|
||
./ddns-go -s install -l 0.0.0.0:9876
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 1
|
||
fi
|
||
|
||
# 解压文件
|
||
log_info "解压新版本..."
|
||
if tar -zxf "$download_path" -C $DDNS_PATH; then
|
||
log_info "解压成功"
|
||
else
|
||
log_error "解压失败"
|
||
log_warn "将恢复服务"
|
||
if [ -f "$config_backup" ]; then
|
||
cp "$config_backup" "$DDNS_PATH/config.yaml"
|
||
fi
|
||
cd $DDNS_PATH
|
||
./ddns-go -s install -l 0.0.0.0:9876
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 1
|
||
fi
|
||
|
||
# 设置权限
|
||
chmod +x $DDNS_PATH/ddns-go
|
||
|
||
# 恢复配置
|
||
if [ -f "$config_backup" ]; then
|
||
log_info "恢复配置文件..."
|
||
cp "$config_backup" "$DDNS_PATH/config.yaml"
|
||
fi
|
||
|
||
# 获取当前配置的端口
|
||
local port="9876"
|
||
if [ -f "$DDNS_PATH/config.yaml" ]; then
|
||
local config_port=$(grep -o 'listen: 0.0.0.0:[0-9]*' "$DDNS_PATH/config.yaml" 2>/dev/null | grep -o '[0-9]*$' | head -n 1)
|
||
if [[ -n "$config_port" ]]; then
|
||
port="$config_port"
|
||
fi
|
||
fi
|
||
|
||
# 安装服务
|
||
log_info "重新安装服务..."
|
||
cd $DDNS_PATH
|
||
./ddns-go -s install -l 0.0.0.0:$port
|
||
|
||
# 验证更新
|
||
local new_version=$($DDNS_PATH/ddns-go -v 2>&1 | grep -o 'v[0-9.]*' | head -n 1)
|
||
if [[ -z "$new_version" ]]; then
|
||
new_version="未知"
|
||
fi
|
||
log_info "更新完成,当前版本: $new_version"
|
||
|
||
# 清理下载文件
|
||
rm -f "$download_path"
|
||
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
}
|
||
|
||
# 查看状态
|
||
check_status() {
|
||
clear
|
||
echo "=================================================="
|
||
echo -e "${BLUE}ddns-go 状态检查${NC}"
|
||
echo "=================================================="
|
||
|
||
# 检查是否安装
|
||
if [ ! -d "$DDNS_PATH" ] || [ ! -f "$DDNS_PATH/ddns-go" ]; then
|
||
echo -e "${RED}ddns-go 未安装${NC}"
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 0
|
||
fi
|
||
|
||
# 检查版本
|
||
local version=$($DDNS_PATH/ddns-go -v 2>&1 | grep -o 'v[0-9.]*' | head -n 1)
|
||
if [[ -z "$version" ]]; then
|
||
version="未知"
|
||
fi
|
||
echo -e "ddns-go 版本: ${GREEN}$version${NC}"
|
||
|
||
# 检查服务状态
|
||
echo -n "服务状态: "
|
||
if systemctl is-active ddns-go &>/dev/null; then
|
||
echo -e "${GREEN}运行中${NC}"
|
||
else
|
||
echo -e "${RED}未运行${NC}"
|
||
fi
|
||
|
||
echo -n "自启动状态: "
|
||
if systemctl is-enabled ddns-go &>/dev/null; then
|
||
echo -e "${GREEN}已启用${NC}"
|
||
else
|
||
echo -e "${RED}未启用${NC}"
|
||
fi
|
||
|
||
# 检查配置文件
|
||
echo -n "配置文件: "
|
||
if [ -f "$DDNS_PATH/config.yaml" ]; then
|
||
echo -e "${GREEN}存在${NC}"
|
||
else
|
||
echo -e "${RED}不存在${NC}"
|
||
fi
|
||
|
||
# 获取内存和 CPU 使用情况
|
||
echo "资源使用情况:"
|
||
ps -aux | grep ddns-go | grep -v grep | awk '{print "内存使用: " $4 "%, CPU使用: " $3 "%"}'
|
||
|
||
# 获取端口信息
|
||
echo -n "端口状态: "
|
||
local port=$(grep -o 'listen: 0.0.0.0:[0-9]*' "$DDNS_PATH/config.yaml" 2>/dev/null | grep -o '[0-9]*$' | head -n 1)
|
||
if [[ -z "$port" ]]; then
|
||
port=$(systemctl status ddns-go 2>/dev/null | grep -o '\-l 0.0.0.0:[0-9]*' | grep -o '[0-9]*$' | head -n 1)
|
||
fi
|
||
|
||
if [[ -n "$port" ]]; then
|
||
if command -v ss &>/dev/null; then
|
||
if ss -tuln | grep -q ":$port "; then
|
||
echo -e "${GREEN}端口 $port 已开放${NC}"
|
||
else
|
||
echo -e "${RED}端口 $port 未开放${NC}"
|
||
fi
|
||
elif command -v netstat &>/dev/null; then
|
||
if netstat -tuln | grep -q ":$port "; then
|
||
echo -e "${GREEN}端口 $port 已开放${NC}"
|
||
else
|
||
echo -e "${RED}端口 $port 未开放${NC}"
|
||
fi
|
||
else
|
||
echo -e "${YELLOW}无法检查端口状态${NC}"
|
||
fi
|
||
else
|
||
echo -e "${YELLOW}未找到端口信息${NC}"
|
||
fi
|
||
|
||
# 检查DNS解析记录
|
||
echo -e "\n上次DNS更新信息:"
|
||
if [ -f "$DDNS_PATH/config.yaml" ]; then
|
||
grep -A 10 'ipv4' "$DDNS_PATH/config.yaml" | head -n 10
|
||
else
|
||
echo "未找到配置文件,无法获取DNS更新信息"
|
||
fi
|
||
|
||
# 显示日志
|
||
echo -e "\n最近日志:"
|
||
if command -v journalctl &>/dev/null; then
|
||
journalctl -u ddns-go --no-pager -n 10
|
||
else
|
||
echo "找不到日志信息"
|
||
fi
|
||
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
}
|
||
|
||
# 重启服务
|
||
restart_service() {
|
||
clear
|
||
echo "=================================================="
|
||
echo -e "${GREEN}重启 ddns-go 服务${NC}"
|
||
echo "=================================================="
|
||
|
||
# 检查是否已安装
|
||
if [ ! -d "$DDNS_PATH" ] || [ ! -f "$DDNS_PATH/ddns-go" ]; then
|
||
log_error "ddns-go 未安装,请先安装"
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
return 0
|
||
fi
|
||
|
||
log_info "正在重启 ddns-go 服务..."
|
||
|
||
# 尝试使用systemctl重启
|
||
if systemctl restart ddns-go; then
|
||
log_info "服务已重启"
|
||
else
|
||
log_warn "systemctl重启失败,尝试手动重启..."
|
||
cd $DDNS_PATH
|
||
./ddns-go -s uninstall
|
||
sleep 1
|
||
|
||
# 获取当前配置的端口
|
||
local web_port="9876"
|
||
if [ -f "$DDNS_PATH/config.yaml" ]; then
|
||
local config_port=$(grep -o 'listen: 0.0.0.0:[0-9]*' "$DDNS_PATH/config.yaml" 2>/dev/null | grep -o '[0-9]*$' | head -n 1)
|
||
if [[ -n "$config_port" ]]; then
|
||
web_port="$config_port"
|
||
fi
|
||
fi
|
||
|
||
./ddns-go -s install -l 0.0.0.0:$web_port
|
||
log_info "服务已手动重启"
|
||
fi
|
||
|
||
# 获取IP信息
|
||
local ip_info=$(get_ip_info)
|
||
local ipv4=$(echo "$ip_info" | cut -d'|' -f1)
|
||
|
||
log_info "服务已重启,Web管理界面: http://$ipv4:$web_port"
|
||
|
||
read -rp "按回车键返回主菜单..." temp
|
||
show_menu
|
||
}
|
||
|
||
# 显示帮助
|
||
show_help() {
|
||
echo "ddns-go 管理脚本 v${SCRIPT_VERSION}"
|
||
echo "用法: $0 [选项]"
|
||
echo ""
|
||
echo "选项:"
|
||
echo " install 直接安装 ddns-go"
|
||
echo " uninstall 直接卸载 ddns-go"
|
||
echo " restart 重启 ddns-go 服务"
|
||
echo " status 查看 ddns-go 状态"
|
||
echo " update 更新 ddns-go"
|
||
echo " ip 显示当前公网IP地址"
|
||
echo " help 显示此帮助信息"
|
||
echo ""
|
||
echo "无参数运行脚本将显示交互式菜单"
|
||
}
|
||
|
||
# 菜单函数
|
||
show_menu() {
|
||
clear
|
||
echo "=================================================="
|
||
echo -e "${CYAN}ddns-go 管理脚本 v${SCRIPT_VERSION}${NC}"
|
||
echo "=================================================="
|
||
echo -e "1) ${GREEN}安装 ddns-go${NC}"
|
||
echo -e "2) ${RED}卸载 ddns-go${NC}"
|
||
echo -e "3) ${YELLOW}更新 ddns-go${NC}"
|
||
echo -e "4) ${BLUE}查看 ddns-go 状态${NC}"
|
||
echo -e "5) ${GREEN}重启 ddns-go 服务${NC}"
|
||
echo -e "0) ${RED}退出${NC}"
|
||
echo "=================================================="
|
||
echo ""
|
||
read -rp "请输入选项 [0-5]: " choice
|
||
|
||
case $choice in
|
||
1) install_ddns_go ;;
|
||
2) uninstall_ddns_go ;;
|
||
3) update_ddns_go ;;
|
||
4) check_status ;;
|
||
5) restart_service ;;
|
||
0) exit 0 ;;
|
||
*) log_error "无效选项" && sleep 2 && show_menu ;;
|
||
esac
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
# 处理命令行参数
|
||
if [[ $# -gt 0 ]]; then
|
||
case "$1" in
|
||
-h|--help|help)
|
||
show_help
|
||
exit 0
|
||
;;
|
||
install)
|
||
install_ddns_go
|
||
exit 0
|
||
;;
|
||
uninstall)
|
||
uninstall_ddns_go
|
||
exit 0
|
||
;;
|
||
restart)
|
||
restart_service
|
||
exit 0
|
||
;;
|
||
status)
|
||
check_status
|
||
exit 0
|
||
;;
|
||
update)
|
||
update_ddns_go
|
||
exit 0
|
||
;;
|
||
*)
|
||
log_error "未知参数: $1"
|
||
show_help
|
||
exit 1
|
||
;;
|
||
esac
|
||
fi
|
||
|
||
# 无参数则显示菜单
|
||
show_menu
|
||
}
|
||
|
||
# 执行主函数
|
||
main "$@"
|