#!/bin/bash

MailTo="hitmickeyq@qq.com"
SERVICE_NAME="ddns-go.service"
KEYWORD="查询域名信息发生异常"

# 检测时间窗口
TIME_WINDOW="1 minutes ago"
THRESHOLD=1

# 循环检查间隔 (秒)
CHECK_INTERVAL=55

# 重启后的冷却时间 (秒)
RESTART_WAIT=65
# =========================================

echo "DDNS-Go 监控脚本已启动..."

while true; do
    ERROR_LOGS=$(sudo journalctl -u "$SERVICE_NAME" --since "$TIME_WINDOW" --no-pager | grep "$KEYWORD")
    if [ -z "$ERROR_LOGS" ]; then
        ERROR_COUNT=0
    else
        ERROR_COUNT=$(echo "$ERROR_LOGS" | wc -l)
    fi
    
    echo "正在检查... 错误数: $ERROR_COUNT"

    if [ "$ERROR_COUNT" -ge "$THRESHOLD" ]; then
        echo "⚠️ 触发异常，正在诊断网络..."
        
        # --- 核心修改：精准获取访问 Cloudflare 的 IP ---
        # IP_V4=$(curl -s4 --connect-timeout 5 https://api.cloudflare.com/cdn-cgi/trace | awk -F= '/ip/ {print $2}')
        # # 尝试获取 IPv6
        # IP_V6=$(curl -s6 --connect-timeout 5 https://api.cloudflare.com/cdn-cgi/trace | awk -F= '/ip/ {print $2}')
        IP=$(curl -s6 --connect-timeout 5 https://api.cloudflare.com/cdn-cgi/trace | awk -F= '/ip/ {print $2}')
        
        # 组合显示
        # NETWORK_INFO="访问cloudflareIPv4: ${IP_V4:-获取失败}\nIPv6: ${IP_V6:-获取失败}"
        NETWORK_INFO="访问cloudflareIP: ${IP:-获取失败}"
        echo $NETWORK_INFO
        # --------------------------------------------

        sudo systemctl restart "$SERVICE_NAME"
        RESTART_STATUS=$?
        MY_HOSTNAME=$(hostname)
        CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
        
        if [ $RESTART_STATUS -eq 0 ]; then
            Subject="[✅自动恢复] DDNS-Go 网络异常"
            msg="服务器: ${MY_HOSTNAME}\n时间: ${CURRENT_TIME}\n\n【当前网络诊断】\n${NETWORK_INFO}\n\n【异常详情】\n检测到 $ERROR_COUNT 次超时报错，服务已成功重启。\n\n=== 错误日志片段 ===\n${ERROR_LOGS}\n\n=================="
        else
            Subject="[❌严重报警] DDNS-Go 重启失败"
            msg="服务器: ${MY_HOSTNAME}\n时间: ${CURRENT_TIME}\n\n【当前网络诊断】\n${NETWORK_INFO}\n\n【报警详情】\nDDNS-Go 频繁超时且自动重启失败，请检查网络链路！"
        fi

        {
            echo "To: $MailTo"
            echo "Subject: $Subject"
            echo "Date: $(date -R)"
            echo "Content-Type: text/plain; charset=UTF-8"
            echo
            echo -e "$msg"
        } | msmtp -a default "$MailTo"

        echo "邮件已发送。"
        sleep "$RESTART_WAIT"
        continue
    fi

    sleep "$CHECK_INTERVAL"
done