#!/bin/bash

# 硬件健康检测脚本
# 支持：直通硬盘(SATA/SAS/NVMe) + RAID卡下物理盘(MegaRAID)

echo "开始系统硬件健康检测..."
echo "----------------------------------------"

HDD_LOG="/tmp/hdd_health_$(date +%s).log"
MEM_LOG="/tmp/mem_health_$(date +%s).log"
bad_disks=()

# 检查smartctl
if ! command -v smartctl &> /dev/null; then
    echo "错误：smartctl工具未安装"
    echo "安装命令: apt-get install smartmontools -y"
    exit 1
fi

# 检查nvme-cli
if ! command -v nvme &> /dev/null; then
    echo "警告: nvme-cli未安装，NVMe设备检测将不完整"
    echo "安装命令: apt-get install nvme-cli -y"
fi

# ============================================
# 全局状态变量
# ============================================
OVERALL_HDD_HEALTH=0

# ============================================
# 1. 检测NVMe直通硬盘
# ============================================
check_nvme_disks() {
    local disks_found=0
    
    echo "----------------------------------------" | tee -a "$HDD_LOG"
    echo ">>> 扫描NVMe直通硬盘" | tee -a "$HDD_LOG"
    
    for nvme in /dev/nvme[0-9]n[0-9]; do
        [ ! -e "$nvme" ] && continue
        
        echo "" | tee -a "$HDD_LOG"
        echo "设备: $nvme" | tee -a "$HDD_LOG"
        
        local info=$(nvme id-ctrl $nvme 2>/dev/null)
        local model=$(echo "$info" | grep -i "mn" | awk -F: '{print $2}' | xargs | sed 's/^"//' | sed 's/"$//')
        local serial=$(echo "$info" | grep -i "sn" | awk -F: '{print $2}' | xargs | sed 's/^"//' | sed 's/"$//')
        
        local smart=$(nvme smart-log $nvme 2>/dev/null)
        if [ -z "$smart" ]; then
            echo "  ⚠️  无法获取NVMe SMART数据" | tee -a "$HDD_LOG"
            continue
        fi
        
        local temp=$(echo "$smart" | grep -i "temperature" | awk '{print $3}' | head -1 | tr -d '[:space:]')
        local percentage_used=$(echo "$smart" | grep -i "percentage_used" | awk '{print $3}' | head -1 | tr -d '%' | tr -d '[:space:]')
        local available_spare=$(echo "$smart" | grep -i "available_spare" | awk '{print $3}' | head -1 | tr -d '%' | tr -d '[:space:]')
        local critical_warning=$(echo "$smart" | grep -i "critical_warning" | awk '{print $3}' | head -1 | tr -d '[:space:]')
        local media_errors=$(echo "$smart" | grep -i "media_errors" | awk '{print $3}' | head -1 | tr -d '[:space:]')
        local error_log_entries=$(echo "$smart" | grep -i "error_log_entries" | awk '{print $3}' | head -1 | tr -d '[:space:]')
        
        local write_units_raw=$(echo "$smart" | grep -i "data_units_written" | head -1)
        local write_units=$(echo "$write_units_raw" | awk '{for(i=1;i<=NF;i++) if($i ~ /^[0-9]+$/) print $i}' | head -1)
        
        echo "  接口: NVMe PCIe" | tee -a "$HDD_LOG"
        echo "  型号: $model" | tee -a "$HDD_LOG"
        echo "  序列号: $serial" | tee -a "$HDD_LOG"
        echo "  类型: NVMe SSD" | tee -a "$HDD_LOG"
        
        local has_error=0
        local warnings=()
        
        if [ -n "$temp" ]; then
            echo "  温度: ${temp}°C" | tee -a "$HDD_LOG"
            if [ "$temp" -gt 70 ] 2>/dev/null; then
                echo "  ❌ 温度过高: ${temp}°C (建议更换)" | tee -a "$HDD_LOG"
                bad_disks+=("$nvme ($model) - 高温${temp}°C")
                OVERALL_HDD_HEALTH=1
                has_error=1
            elif [ "$temp" -gt 60 ] 2>/dev/null; then
                warnings+=("温度偏高: ${temp}°C")
            fi
        fi
        
        if [ -n "$critical_warning" ] && [ "$critical_warning" != "0" ] 2>/dev/null; then
            echo "  ❌ 临界警告: $critical_warning (建议立即更换)" | tee -a "$HDD_LOG"
            bad_disks+=("$nvme ($model) - 临界警告:$critical_warning")
            OVERALL_HDD_HEALTH=1
            has_error=1
        fi
        
        if [ -n "$percentage_used" ]; then
            echo "  已使用寿命: ${percentage_used}%" | tee -a "$HDD_LOG"
            if [ "$percentage_used" -gt 90 ] 2>/dev/null; then
                echo "  ❌ SSD寿命即将耗尽: ${percentage_used}% (建议立即更换)" | tee -a "$HDD_LOG"
                bad_disks+=("$nvme ($model) - 寿命耗尽${percentage_used}%")
                OVERALL_HDD_HEALTH=1
                has_error=1
            elif [ "$percentage_used" -gt 70 ] 2>/dev/null; then
                warnings+=("SSD寿命警告: ${percentage_used}%")
            fi
        fi
        
        if [ -n "$available_spare" ]; then
            echo "  可用备用空间: ${available_spare}%" | tee -a "$HDD_LOG"
            if [ "$available_spare" -lt 50 ] 2>/dev/null; then
                echo "  ❌ 备用空间不足: ${available_spare}% (建议更换)" | tee -a "$HDD_LOG"
                bad_disks+=("$nvme ($model) - 备用空间不足")
                OVERALL_HDD_HEALTH=1
                has_error=1
            elif [ "$available_spare" -lt 80 ] 2>/dev/null; then
                warnings+=("备用空间偏低: ${available_spare}%")
            fi
        fi
        
        if [ -n "$media_errors" ] && [ "$media_errors" != "0" ] 2>/dev/null; then
            echo "  ❌ 介质错误数: $media_errors (建议更换)" | tee -a "$HDD_LOG"
            bad_disks+=("$nvme ($model) - 介质错误:$media_errors")
            OVERALL_HDD_HEALTH=1
            has_error=1
        fi
        
        if [ -n "$error_log_entries" ] && [ "$error_log_entries" != "0" ] 2>/dev/null; then
            echo "  ⚠️  错误日志条目: $error_log_entries" | tee -a "$HDD_LOG"
            if [ "$error_log_entries" -gt 100 ] 2>/dev/null; then
                echo "  ❌ 错误日志过多 (建议检查)" | tee -a "$HDD_LOG"
                bad_disks+=("$nvme ($model) - 错误日志过多")
                OVERALL_HDD_HEALTH=1
                has_error=1
            else
                warnings+=("存在错误日志条目")
            fi
        fi
        
        if [ -n "$write_units" ] && [ "$write_units" -gt 0 ] 2>/dev/null; then
            local write_gb=$((write_units * 512 / 1024 / 1024))
            local write_tb=$((write_gb / 1024))
            if [ "$write_tb" -gt 0 ]; then
                echo "  总写入量: ${write_tb} TB" | tee -a "$HDD_LOG"
            else
                echo "  总写入量: ${write_gb} GB" | tee -a "$HDD_LOG"
            fi
        fi
        
        if [ ${#warnings[@]} -gt 0 ]; then
            echo "  ⚠️  警告: ${warnings[*]}" | tee -a "$HDD_LOG"
        fi
        
        if [ $has_error -eq 0 ]; then
            echo "  ✅ 状态: 正常" | tee -a "$HDD_LOG"
        fi
        
        ((disks_found++))
    done
    
    return $disks_found
}

# ============================================
# 2. 检测SAS硬盘（使用SCSI模式）
# ============================================
check_sas_disk() {
    local dev=$1
    local has_error=0
    local warnings=()
    
    # 使用SCSI模式获取详细信息
    local scsi_info=$(smartctl -i -d scsi "$dev" 2>/dev/null)
    local scsi_smart=$(smartctl -a -d scsi "$dev" 2>/dev/null)
    
    # 获取型号
    local model=$(echo "$scsi_info" | grep -i "Vendor\|Product" | head -2 | awk -F: '{print $2}' | xargs | tr '\n' ' ' | xargs)
    if [ -z "$model" ]; then
        model=$(echo "$scsi_info" | grep -i "Device Model" | awk -F: '{print $2}' | xargs)
    fi
    
    local serial=$(echo "$scsi_info" | grep -i "Serial Number" | awk -F: '{print $2}' | xargs)
    local capacity=$(echo "$scsi_info" | grep -i "User Capacity" | awk -F: '{print $2}' | awk '{print $1,$2}' | xargs)
    if [ -z "$capacity" ]; then
        capacity=$(echo "$scsi_info" | grep -i "Product Revision" | awk -F: '{print $2}' | xargs)
    fi
    
    # 获取转速
    local rpm=$(echo "$scsi_info" | grep -i "Rotation Rate" | awk -F: '{print $2}' | xargs)
    local disk_type="HDD"
    if echo "$scsi_info" | grep -qi "Solid State"; then
        disk_type="SSD"
    fi
    
    echo "" | tee -a "$HDD_LOG"
    echo "设备: $dev" | tee -a "$HDD_LOG"
    echo "  接口: SAS" | tee -a "$HDD_LOG"
    echo "  型号: ${model:-未知}" | tee -a "$HDD_LOG"
    echo "  序列号: ${serial:-未知}" | tee -a "$HDD_LOG"
    echo "  容量: ${capacity:-未知}" | tee -a "$HDD_LOG"
    echo "  类型: $disk_type ${rpm:+($rpm)}" | tee -a "$HDD_LOG"
    
    # 温度检测
    local temp=$(echo "$scsi_smart" | grep -i "Temperature" | grep -v "Min" | grep -v "Max" | head -1 | grep -oE '[0-9]+' | head -1)
    if [ -n "$temp" ]; then
        echo "  温度: ${temp}°C" | tee -a "$HDD_LOG"
        if [ "$temp" -gt 60 ] 2>/dev/null; then
            echo "  ❌ 温度过高: ${temp}°C (建议更换)" | tee -a "$HDD_LOG"
            bad_disks+=("$dev ($model) - 高温${temp}°C")
            OVERALL_HDD_HEALTH=1
            has_error=1
        elif [ "$temp" -gt 50 ] 2>/dev/null; then
            warnings+=("温度偏高: ${temp}°C")
        fi
    fi
    
    echo "  --- SAS错误计数器 ---" | tee -a "$HDD_LOG"
    
    # 读取各种错误计数
    local read_errors=$(echo "$scsi_smart" | grep -i "read errors" | head -1 | awk -F: '{print $2}' | xargs | grep -oE '[0-9]+' | head -1)
    local write_errors=$(echo "$scsi_smart" | grep -i "write errors" | head -1 | awk -F: '{print $2}' | xargs | grep -oE '[0-9]+' | head -1)
    local verify_errors=$(echo "$scsi_smart" | grep -i "verify errors" | head -1 | awk -F: '{print $2}' | xargs | grep -oE '[0-9]+' | head -1)
    local non_medium_errors=$(echo "$scsi_smart" | grep -i "non-medium error" | head -1 | awk -F: '{print $2}' | xargs | grep -oE '[0-9]+' | head -1)
    local medium_errors=$(echo "$scsi_smart" | grep -i "medium error" | head -1 | awk -F: '{print $2}' | xargs | grep -oE '[0-9]+' | head -1)
    
    # ECC错误计数 - SAS硬盘的重要指标
    local ecc_errors=$(echo "$scsi_smart" | grep -iE "ECC error|Corrected error" | head -1 | awk -F: '{print $2}' | xargs | grep -oE '[0-9]+' | head -1)
    if [ -z "$ecc_errors" ]; then
        # 尝试其他格式
        ecc_errors=$(echo "$scsi_smart" | grep -i "Corrected ECC" | head -1 | awk -F: '{print $2}' | xargs | grep -oE '[0-9]+' | head -1)
    fi
    
    # 显示错误计数
    echo "  读取错误: ${read_errors:-0}" | tee -a "$HDD_LOG"
    echo "  写入错误: ${write_errors:-0}" | tee -a "$HDD_LOG"
    echo "  校验错误: ${verify_errors:-0}" | tee -a "$HDD_LOG"
    echo "  非介质错误: ${non_medium_errors:-0}" | tee -a "$HDD_LOG"
    echo "  介质错误(坏道): ${medium_errors:-0}" | tee -a "$HDD_LOG"
    echo "  ECC错误: ${ecc_errors:-0}" | tee -a "$HDD_LOG"
    
    # ============================================
    # SAS硬盘更换阈值判断
    # ============================================
    
    # 1. 介质错误（坏道）- 任何大于0都需要关注
    if [ -n "$medium_errors" ] && [ "$medium_errors" != "0" ] 2>/dev/null; then
        echo "  ❌ 发现介质错误(坏道): $medium_errors" | tee -a "$HDD_LOG"
        if [ "$medium_errors" -ge 10 ] 2>/dev/null; then
            echo "  ❌❌ 坏道数量过多 (≥10)，建议立即更换硬盘！" | tee -a "$HDD_LOG"
            bad_disks+=("$dev ($model) - 坏道过多:$medium_errors")
            OVERALL_HDD_HEALTH=1
            has_error=1
        else
            echo "  ❌ 发现坏道，建议尽快更换硬盘！" | tee -a "$HDD_LOG"
            bad_disks+=("$dev ($model) - 发现坏道:$medium_errors")
            OVERALL_HDD_HEALTH=1
            has_error=1
        fi
    fi
    
    # 2. ECC错误阈值（关键指标）
    if [ -n "$ecc_errors" ] && [ "$ecc_errors" != "0" ] 2>/dev/null; then
        if [ "$ecc_errors" -ge 1000 ] 2>/dev/null; then
            echo "  ❌❌ ECC错误过多 (≥1000)，硬盘即将故障，建议立即更换！" | tee -a "$HDD_LOG"
            bad_disks+=("$dev ($model) - ECC错误过多:$ecc_errors")
            OVERALL_HDD_HEALTH=1
            has_error=1
        elif [ "$ecc_errors" -ge 100 ] 2>/dev/null; then
            echo "  ❌ ECC错误较多 (≥100)，建议尽快更换硬盘！" | tee -a "$HDD_LOG"
            bad_disks+=("$dev ($model) - ECC错误较多:$ecc_errors")
            OVERALL_HDD_HEALTH=1
            has_error=1
        elif [ "$ecc_errors" -ge 10 ] 2>/dev/null; then
            echo "  ⚠️  ECC错误持续增加 (≥10)，需要密切关注！" | tee -a "$HDD_LOG"
            warnings+=("ECC错误: $ecc_errors")
        else
            echo "  ⚠️  存在ECC错误 (${ecc_errors})，建议监控" | tee -a "$HDD_LOG"
            warnings+=("ECC错误: $ecc_errors")
        fi
    fi
    
    # 3. 读取/写入错误
    if [ -n "$read_errors" ] && [ "$read_errors" != "0" ] 2>/dev/null; then
        if [ "$read_errors" -ge 10 ] 2>/dev/null; then
            echo "  ❌ 读取错误过多 (≥10)，建议更换硬盘！" | tee -a "$HDD_LOG"
            bad_disks+=("$dev ($model) - 读取错误:$read_errors")
            OVERALL_HDD_HEALTH=1
            has_error=1
        else
            echo "  ⚠️  存在读取错误: $read_errors" | tee -a "$HDD_LOG"
            warnings+=("读取错误: $read_errors")
        fi
    fi
    
    if [ -n "$write_errors" ] && [ "$write_errors" != "0" ] 2>/dev/null; then
        if [ "$write_errors" -ge 10 ] 2>/dev/null; then
            echo "  ❌ 写入错误过多 (≥10)，建议更换硬盘！" | tee -a "$HDD_LOG"
            bad_disks+=("$dev ($model) - 写入错误:$write_errors")
            OVERALL_HDD_HEALTH=1
            has_error=1
        else
            echo "  ⚠️  存在写入错误: $write_errors" | tee -a "$HDD_LOG"
            warnings+=("写入错误: $write_errors")
        fi
    fi
    
    # 4. 非介质错误（通常是接口或控制器问题）
    if [ -n "$non_medium_errors" ] && [ "$non_medium_errors" != "0" ] 2>/dev/null; then
        if [ "$non_medium_errors" -ge 100 ] 2>/dev/null; then
            echo "  ❌ 非介质错误过多 (≥100)，可能是接口或控制器问题" | tee -a "$HDD_LOG"
            bad_disks+=("$dev ($model) - 非介质错误:$non_medium_errors")
            OVERALL_HDD_HEALTH=1
            has_error=1
        else
            echo "  ⚠️  存在非介质错误: $non_medium_errors" | tee -a "$HDD_LOG"
        fi
    fi
    
    # 5. 预失败标志
    local prefail=$(echo "$scsi_smart" | grep -i "Pre-fail" | head -1)
    if [ -n "$prefail" ] && echo "$prefail" | grep -qi "FAILING_NOW"; then
        echo "  ❌❌ 预失败标志触发，硬盘即将故障，建议立即更换！" | tee -a "$HDD_LOG"
        bad_disks+=("$dev ($model) - 预失败")
        OVERALL_HDD_HEALTH=1
        has_error=1
    fi
    
    # 通电时间
    local hours=$(echo "$scsi_smart" | grep -i "Power on hours" | head -1 | awk -F: '{print $2}' | xargs | grep -oE '[0-9]+' | head -1)
    if [ -n "$hours" ]; then
        local days=$((hours / 24))
        local years=$((days / 365))
        echo "  通电时间: ${hours}小时 (${days}天 / ${years}年)" | tee -a "$HDD_LOG"
        
        # SAS硬盘通常设计寿命5年
        if [ "$years" -ge 5 ] 2>/dev/null; then
            echo "  ⚠️  已超过设计寿命 (5年)，建议考虑更换" | tee -a "$HDD_LOG"
            warnings+=("超过设计寿命")
        fi
    fi
    
    # 显示警告汇总
    if [ ${#warnings[@]} -gt 0 ]; then
        echo "  ⚠️  警告: ${warnings[*]}" | tee -a "$HDD_LOG"
    fi
    
    if [ $has_error -eq 0 ]; then
        echo "  ✅ 状态: 正常" | tee -a "$HDD_LOG"
    fi
    
    return $has_error
}

# ============================================
# 3. 检测SATA硬盘
# ============================================
check_sata_disk() {
    local dev=$1
    local has_error=0
    local warnings=()
    
    local info=$(smartctl -i "$dev" 2>/dev/null)
    local model=$(echo "$info" | grep -i "Device Model" | awk -F: '{print $2}' | xargs)
    local serial=$(echo "$info" | grep -i "Serial Number" | awk -F: '{print $2}' | xargs)
    local capacity=$(echo "$info" | grep -i "User Capacity" | awk -F: '{print $2}' | awk '{print $1,$2}' | xargs)
    
    local disk_type="HDD"
    if echo "$info" | grep -qi "Solid State Device"; then
        disk_type="SSD"
    fi
    
    local rpm=$(echo "$info" | grep -i "Rotation Rate" | awk -F: '{print $2}' | xargs)
    
    echo "" | tee -a "$HDD_LOG"
    echo "设备: $dev" | tee -a "$HDD_LOG"
    echo "  接口: SATA" | tee -a "$HDD_LOG"
    echo "  型号: $model" | tee -a "$HDD_LOG"
    echo "  序列号: $serial" | tee -a "$HDD_LOG"
    echo "  容量: $capacity" | tee -a "$HDD_LOG"
    echo "  类型: $disk_type ${rpm:+($rpm)}" | tee -a "$HDD_LOG"
    
    local smart=$(smartctl -a "$dev" 2>/dev/null)
    
    local health=$(echo "$smart" | grep -i "SMART overall-health" | head -1)
    if [ -n "$health" ]; then
        local health_status=$(echo "$health" | awk -F: '{print $2}' | xargs)
        echo "  SMART状态: $health_status" | tee -a "$HDD_LOG"
        if echo "$health" | grep -qi "FAILED"; then
            echo "  ❌ SMART状态FAILED (建议立即更换)" | tee -a "$HDD_LOG"
            bad_disks+=("$dev ($model) - SMART FAILED")
            OVERALL_HDD_HEALTH=1
            has_error=1
        fi
    fi
    
    local temp=$(echo "$smart" | grep "Temperature_Celsius" | head -1 | awk '{print $10}')
    if [ -n "$temp" ]; then
        echo "  温度: ${temp}°C" | tee -a "$HDD_LOG"
        if [ "$temp" -gt 60 ] 2>/dev/null; then
            echo "  ❌ 温度过高: ${temp}°C (建议更换)" | tee -a "$HDD_LOG"
            bad_disks+=("$dev ($model) - 高温${temp}°C")
            OVERALL_HDD_HEALTH=1
            has_error=1
        elif [ "$temp" -gt 50 ] 2>/dev/null; then
            warnings+=("温度偏高: ${temp}°C")
        fi
    fi
    
    if [ "$disk_type" = "SSD" ]; then
        local wear_line=$(echo "$smart" | grep -iE "Media_Wearout_Indicator|Percentage Used" | head -1)
        if [ -n "$wear_line" ]; then
            local wear_val=$(echo "$wear_line" | awk '{print $4}' | grep -oE '[0-9]+' | head -1)
            if [ -z "$wear_val" ]; then
                wear_val=$(echo "$wear_line" | awk '{print $NF}' | grep -oE '[0-9]+' | head -1)
            fi
            if [ -n "$wear_val" ]; then
                if [ "$wear_val" -lt 10 ] 2>/dev/null; then
                    echo "  ❌ SSD磨损严重: 剩余寿命 ${wear_val}% (建议立即更换)" | tee -a "$HDD_LOG"
                    bad_disks+=("$dev ($model) - SSD磨损严重")
                    OVERALL_HDD_HEALTH=1
                    has_error=1
                elif [ "$wear_val" -lt 30 ] 2>/dev/null; then
                    echo "  ⚠️  SSD磨损警告: 剩余寿命 ${wear_val}%" | tee -a "$HDD_LOG"
                    warnings+=("SSD磨损: 剩余${wear_val}%")
                else
                    echo "  SSD剩余寿命: ${wear_val}%" | tee -a "$HDD_LOG"
                fi
            fi
        fi
    else
        local realloc=$(echo "$smart" | grep "Reallocated_Sector" | head -1)
        if [ -n "$realloc" ]; then
            local realloc_val=$(echo "$realloc" | awk '{print $10}')
            echo "  重分配扇区: $realloc_val" | tee -a "$HDD_LOG"
            if [ -n "$realloc_val" ] && [ "$realloc_val" -gt 0 ] 2>/dev/null; then
                if [ "$realloc_val" -ge 100 ] 2>/dev/null; then
                    echo "  ❌❌ 坏道过多 (≥100)，建议立即更换硬盘！" | tee -a "$HDD_LOG"
                    bad_disks+=("$dev ($model) - 坏道过多:$realloc_val")
                    OVERALL_HDD_HEALTH=1
                    has_error=1
                elif [ "$realloc_val" -ge 10 ] 2>/dev/null; then
                    echo "  ❌ 坏道较多 (≥10)，建议尽快更换硬盘！" | tee -a "$HDD_LOG"
                    bad_disks+=("$dev ($model) - 坏道:$realloc_val")
                    OVERALL_HDD_HEALTH=1
                    has_error=1
                else
                    echo "  ❌ 发现坏道: $realloc_val，建议监控" | tee -a "$HDD_LOG"
                    bad_disks+=("$dev ($model) - 坏道:$realloc_val")
                    OVERALL_HDD_HEALTH=1
                    has_error=1
                fi
            fi
        fi
        
        local pending=$(echo "$smart" | grep "Current_Pending_Sector" | head -1)
        if [ -n "$pending" ]; then
            local pending_val=$(echo "$pending" | awk '{print $10}')
            echo "  待处理扇区: $pending_val" | tee -a "$HDD_LOG"
            if [ -n "$pending_val" ] && [ "$pending_val" -gt 0 ] 2>/dev/null; then
                echo "  ⚠️  存在不稳定扇区: $pending_val" | tee -a "$HDD_LOG"
                warnings+=("不稳定扇区: $pending_val")
            fi
        fi
    fi
    
    local hours=$(echo "$smart" | grep "Power_On_Hours" | head -1 | awk '{print $10}')
    if [ -n "$hours" ]; then
        local days=$((hours / 24))
        local years=$((days / 365))
        echo "  通电时间: ${hours}小时 (${days}天 / ${years}年)" | tee -a "$HDD_LOG"
        
        if [ "$years" -ge 5 ] 2>/dev/null && [ "$disk_type" = "HDD" ]; then
            echo "  ⚠️  已超过设计寿命 (5年)，建议考虑更换" | tee -a "$HDD_LOG"
            warnings+=("超过设计寿命")
        fi
    fi
    
    if [ ${#warnings[@]} -gt 0 ]; then
        echo "  ⚠️  警告: ${warnings[*]}" | tee -a "$HDD_LOG"
    fi
    
    if [ $has_error -eq 0 ]; then
        echo "  ✅ 状态: 正常" | tee -a "$HDD_LOG"
    fi
    
    return $has_error
}

# ============================================
# 4. 检测SATA/SAS直通硬盘（主入口）
# ============================================
check_sata_sas_disks() {
    local disks_found=0
    
    echo "----------------------------------------" | tee -a "$HDD_LOG"
    echo ">>> 扫描SATA/SAS直通硬盘" | tee -a "$HDD_LOG"
    
    for dev in /dev/sd[a-z]; do
        [ ! -e "$dev" ] && continue
        
        if ! smartctl -i "$dev" &>/dev/null 2>&1; then
            continue
        fi
        
        local info=$(smartctl -i "$dev" 2>/dev/null)
        if echo "$info" | grep -qi "Product:.*RAID"; then
            continue
        fi
        
        local dev_name=$(basename "$dev")
        if [ -e "/sys/block/$dev_name/device" ]; then
            local device_path=$(readlink -f "/sys/block/$dev_name/device" 2>/dev/null)
            if echo "$device_path" | grep -qi "megaraid"; then
                continue
            fi
        fi
        
        # 判断接口类型
        local is_sas=0
        if echo "$info" | grep -qi "Transport Protocol.*SAS" || \
           echo "$info" | grep -qi "SAS address" || \
           echo "$info" | grep -qi "SCSI.*SAS"; then
            is_sas=1
        fi
        
        if [ $is_sas -eq 1 ]; then
            check_sas_disk "$dev"
        else
            check_sata_disk "$dev"
        fi
        
        ((disks_found++))
    done
    
    return $disks_found
}

# ============================================
# 5. 检测RAID卡下的物理盘（MegaRAID）
# ============================================
check_megaraid_disks() {
    local disks_found=0
    
    local base_dev=""
    for dev in /dev/sda /dev/sdb /dev/sdc /dev/sdd; do
        if [ -e "$dev" ]; then
            if smartctl -i -d megaraid,0 "$dev" &>/dev/null 2>&1; then
                base_dev="$dev"
                break
            fi
        fi
    done
    
    if [ -z "$base_dev" ]; then
        base_dev=$(smartctl --scan 2>/dev/null | grep megaraid | head -1 | awk '{print $1}')
    fi
    
    if [ -z "$base_dev" ]; then
        echo "未检测到MegaRAID控制器" | tee -a "$HDD_LOG"
        return 0
    fi
    
    echo "----------------------------------------" | tee -a "$HDD_LOG"
    echo ">>> 扫描MegaRAID物理盘 (基础设备: $base_dev)" | tee -a "$HDD_LOG"
    
    for pd in {0..127}; do
        local info=$(smartctl -i -d megaraid,$pd "$base_dev" 2>/dev/null)
        if ! echo "$info" | grep -q "Device Model"; then
            continue
        fi
        
        local model=$(echo "$info" | grep "Device Model" | awk -F: '{print $2}' | xargs)
        local serial=$(echo "$info" | grep "Serial Number" | awk -F: '{print $2}' | xargs)
        local capacity=$(echo "$info" | grep "User Capacity" | awk -F: '{print $2}' | awk '{print $1,$2}' | xargs)
        
        local interface="Unknown"
        if echo "$info" | grep -qi "SATA"; then
            interface="SATA"
        elif echo "$info" | grep -qi "SAS"; then
            interface="SAS"
        fi
        
        local disk_type="Unknown"
        if echo "$info" | grep -q "Solid State Device"; then
            disk_type="SSD"
        elif echo "$info" | grep -q "Rotation Rate"; then
            local rpm=$(echo "$info" | grep "Rotation Rate" | awk -F: '{print $2}' | xargs)
            if [ "$rpm" = "Solid State Device" ]; then
                disk_type="SSD"
            elif [ -n "$rpm" ] && [ "$rpm" != "0" ]; then
                disk_type="HDD ($rpm RPM)"
            else
                disk_type="HDD"
            fi
        fi
        
        echo "" | tee -a "$HDD_LOG"
        echo "设备: MegaRAID PD=$pd (控制器: $base_dev)" | tee -a "$HDD_LOG"
        echo "  接口: $interface" | tee -a "$HDD_LOG"
        echo "  型号: $model" | tee -a "$HDD_LOG"
        echo "  序列号: $serial" | tee -a "$HDD_LOG"
        echo "  容量: $capacity" | tee -a "$HDD_LOG"
        echo "  类型: $disk_type" | tee -a "$HDD_LOG"
        
        local smart=$(smartctl -a -d megaraid,$pd "$base_dev" 2>/dev/null)
        local has_error=0
        
        local health=$(echo "$smart" | grep -i "SMART overall-health" | head -1)
        if [ -n "$health" ]; then
            local health_status=$(echo "$health" | awk -F: '{print $2}' | xargs)
            echo "  SMART状态: $health_status" | tee -a "$HDD_LOG"
            if echo "$health" | grep -qi "FAILED"; then
                echo "  ❌ SMART状态FAILED (建议立即更换)" | tee -a "$HDD_LOG"
                bad_disks+=("PD=$pd ($model) - SMART FAILED")
                OVERALL_HDD_HEALTH=1
                has_error=1
            fi
        fi
        
        local temp=$(echo "$smart" | grep "Temperature_Celsius" | head -1 | awk '{print $10}')
        if [ -n "$temp" ]; then
            echo "  温度: ${temp}°C" | tee -a "$HDD_LOG"
            if [ "$temp" -gt 60 ] 2>/dev/null; then
                echo "  ❌ 温度过高: ${temp}°C (建议更换)" | tee -a "$HDD_LOG"
                bad_disks+=("PD=$pd ($model) - 高温${temp}°C")
                OVERALL_HDD_HEALTH=1
                has_error=1
            fi
        fi
        
        local hours=$(echo "$smart" | grep "Power_On_Hours" | head -1 | awk '{print $10}')
        if [ -n "$hours" ]; then
            local days=$((hours / 24))
            echo "  通电时间: ${hours}小时 (${days}天)" | tee -a "$HDD_LOG"
        fi
        
        if [ $has_error -eq 0 ]; then
            echo "  ✅ 状态: 正常" | tee -a "$HDD_LOG"
        fi
        
        ((disks_found++))
    done
    
    return $disks_found
}

# ============================================
# 6. 内存检查
# ============================================
check_memory() {
    echo "----------------------------------------" | tee -a "$MEM_LOG"
    echo ">>> 内存错误检查" | tee -a "$MEM_LOG"
    
    local errors=$(dmesg 2>/dev/null | grep -iE "memory (read )?error|EDAC|CE error|UE error|MCE:" | tail -20)
    
    if [ -n "$errors" ]; then
        echo "发现内存错误:" | tee -a "$MEM_LOG"
        echo "$errors" | tee -a "$MEM_LOG"
        
        if echo "$errors" | grep -qi "UE error\|uncorrected"; then
            echo "!!! 严重: 发现未修复内存错误 (UE) !!!" | tee -a "$MEM_LOG"
            return 2
        elif echo "$errors" | grep -qi "CE error\|corrected"; then
            echo "!!! 警告: 发现已修复内存错误 (CE) !!!" | tee -a "$MEM_LOG"
            return 1
        fi
        return 1
    else
        echo "未发现内存错误" | tee -a "$MEM_LOG"
        return 0
    fi
}

# ============================================
# 主程序
# ============================================

echo "========== 硬盘健康检查 ==========" | tee -a "$HDD_LOG"

nvme_count=0
sata_sas_count=0
raid_count=0

if command -v nvme &> /dev/null; then
    check_nvme_disks
    nvme_count=$?
else
    echo "----------------------------------------" | tee -a "$HDD_LOG"
    echo ">>> NVMe检测跳过 (nvme-cli未安装)" | tee -a "$HDD_LOG"
fi

check_sata_sas_disks
sata_sas_count=$?

check_megaraid_disks
raid_count=$?

total_disks=$((nvme_count + sata_sas_count + raid_count))

if [ $total_disks -eq 0 ]; then
    echo "" | tee -a "$HDD_LOG"
    echo "⚠️  未检测到任何硬盘!" | tee -a "$HDD_LOG"
    hdd_status="未检测到硬盘"
else
    echo "" | tee -a "$HDD_LOG"
    echo "========== 扫描统计 ==========" | tee -a "$HDD_LOG"
    echo "NVMe硬盘: $nvme_count 个" | tee -a "$HDD_LOG"
    echo "SATA/SAS直通硬盘: $sata_sas_count 个" | tee -a "$HDD_LOG"
    echo "RAID物理盘: $raid_count 个" | tee -a "$HDD_LOG"
    echo "总计: $total_disks 个硬盘" | tee -a "$HDD_LOG"
    
    if [ ${#bad_disks[@]} -gt 0 ] || [ $OVERALL_HDD_HEALTH -eq 1 ]; then
        echo "" | tee -a "$HDD_LOG"
        echo "❌ 检测到硬盘存在问题!" | tee -a "$HDD_LOG"
        hdd_status="存在问题"
    else
        echo "" | tee -a "$HDD_LOG"
        echo "✅ 所有硬盘状态正常" | tee -a "$HDD_LOG"
        hdd_status="状态良好"
    fi
fi

echo ""
echo "========== 内存健康检查 =========="
check_memory
mem_status=$?

case $mem_status in
    0) mem_result="状态良好" ;;
    1) mem_result="存在可修复错误(CE)" ;;
    2) mem_result="存在不可修复错误(UE)" ;;
esac

echo ""
echo "========== 检测总结 =========="
if [ ${#bad_disks[@]} -gt 0 ] || [ $OVERALL_HDD_HEALTH -eq 1 ]; then
    echo "❌ 硬盘状态: $hdd_status"
else
    echo "✅ 硬盘状态: $hdd_status"
fi

if [ ${#bad_disks[@]} -gt 0 ]; then
    echo ""
    echo "⚠️  问题磁盘列表:"
    for disk in "${bad_disks[@]}"; do
        echo "  ❌ $disk"
    done
fi

if [ $mem_status -eq 2 ]; then
    echo "❌ 内存状态: $mem_result"
elif [ $mem_status -eq 1 ]; then
    echo "⚠️  内存状态: $mem_result"
else
    echo "✅ 内存状态: $mem_result"
fi

echo ""
echo "详细日志: $HDD_LOG"
echo "内存日志: $MEM_LOG"

if [ ${#bad_disks[@]} -gt 0 ] || [ $OVERALL_HDD_HEALTH -eq 1 ] || [ $mem_status -ge 1 ]; then
    exit 1
else
    exit 0
fi