#!/bin/bash
#=====================================================
# 网络诊断脚本 - 一键排查网络问题
# 来源: 整合自社区运维最佳实践
# 用法: ./network-check.sh [目标域名/IP]
#=====================================================

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

TARGET=${1:-"baidu.com"}

check() {
    local desc=$1
    shift
    if "$@" &>/dev/null; then
        echo -e "  ${GREEN}[✓]${NC} $desc"
        return 0
    else
        echo -e "  ${RED}[✗]${NC} $desc"
        return 1
    fi
}

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}    网络诊断工具 - 目标: ${TARGET}${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""

# 1. 网卡状态
echo -e "${YELLOW}[1] 网卡状态${NC}"
ip link show 2>/dev/null | grep -E '^[0-9]+:' | while read line; do
    if echo "$line" | grep -q 'UP'; then
        echo -e "  ${GREEN}$line${NC}"
    else
        echo -e "  ${RED}$line${NC}"
    fi
done
echo ""

# 2. 默认网关
echo -e "${YELLOW}[2] 默认路由${NC}"
ip route show default 2>/dev/null || echo "  无默认路由"
echo ""

# 3. DNS解析
echo -e "${YELLOW}[3] DNS 解析测试${NC}"
check "DNS服务器可达" ping -c1 -W2 114.114.114.114
check "DNS解析 $TARGET" nslookup "$TARGET" 2>/dev/null
echo ""

# 4. 连通性测试
echo -e "${YELLOW}[4] 连通性测试${NC}"
check "网关可达" ping -c2 -W2 "$(ip route show default 2>/dev/null | awk '{print $3}' | head -1)"
check "外网连通 ($TARGET)" ping -c2 -W2 "$TARGET"
echo ""

# 5. HTTP 测试
echo -e "${YELLOW}[5] HTTP 服务测试${NC}"
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "http://$TARGET" 2>/dev/null)
if [ -n "$HTTP_CODE" ]; then
    echo -e "  ${GREEN}[✓]${NC} HTTP 状态码: $HTTP_CODE"
else
    echo -e "  ${RED}[✗]${NC} HTTP 连接失败"
fi

HTTPS_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 -k "https://$TARGET" 2>/dev/null)
if [ -n "$HTTPS_CODE" ]; then
    echo -e "  ${GREEN}[✓]${NC} HTTPS 状态码: $HTTPS_CODE"
else
    echo -e "  ${RED}[✗]${NC} HTTPS 连接失败"
fi
echo ""

# 6. 端口扫描（本地常用端口）
echo -e "${YELLOW}[6] 本地监听端口${NC}"
ss -tlnp 2>/dev/null | grep LISTEN | awk '{printf "  %-22s %s\n", $4, $6}' | sed 's/users:(("//;s/".*//'
echo ""

# 7. 网络统计
echo -e "${YELLOW}[7] 网络连接统计${NC}"
echo "  ESTABLISHED: $(ss -tn state established 2>/dev/null | wc -l)"
echo "  TIME_WAIT:   $(ss -tn state time-wait 2>/dev/null | wc -l)"
echo "  CLOSE_WAIT:  $(ss -tn state close-wait 2>/dev/null | wc -l)"
echo ""

# 8. 丢包率
echo -e "${YELLOW}[8] 丢包率测试 (10个包)${NC}"
PING_RESULT=$(ping -c10 -W2 "$TARGET" 2>/dev/null | tail -1)
if [ -n "$PING_RESULT" ]; then
    echo "  $PING_RESULT"
else
    echo -e "  ${RED}  无法到达 $TARGET${NC}"
fi
echo ""

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}  诊断完成${NC}"
echo -e "${GREEN}========================================${NC}"