#!/bin/bash

# 1. 自动安装依赖
echo "正在检查并安装必要依赖 (fio, jq)..."
apt update && apt install -y fio jq

echo "============================================"
echo "          磁盘性能自动化测试工具            "
echo "============================================"

# 2. 智能识别并排除系统盘
# 自动定位根目录 (/) 所在的物理磁盘名称
ROOT_DISK=$(lsblk -no PKNAME $(findmnt -n -o SOURCE /) | head -n 1)

# 获取磁盘列表：类型为 disk，且不是系统盘，也不是只读设备(rom)
mapfile -t DISK_LIST < <(lsblk -dno NAME,SIZE,TYPE | grep "disk" | grep -v "$ROOT_DISK")

if [ ${#DISK_LIST[@]} -eq 0 ]; then
    echo "未发现可供测试的额外数据盘（已自动识别并跳过系统盘 $ROOT_DISK）。"
    echo "提示：如果您想测试系统盘，请使用‘目录模式’针对 /root 运行测试。"
    exit 1
fi

echo "系统盘已识别为: /dev/$ROOT_DISK (已自动隐藏以防误删)"
echo "发现以下可选数据盘："
for i in "${!DISK_LIST[@]}"; do
    echo "[$i] /dev/$(echo "${DISK_LIST[$i]}" | awk '{print $1}') - 大小: $(echo "${DISK_LIST[$i]}" | awk '{print $2}')"
done

# 3. 让用户选择
read -p "请选择要测试的磁盘编号 [0-$((${#DISK_LIST[@]} - 1))]: " CHOICE

# 校验输入是否为数字以及是否在范围内
if ! [[ "$CHOICE" =~ ^[0-9]+$ ]] || [ "$CHOICE" -ge "${#DISK_LIST[@]}" ]; then
    echo "输入错误，请输入有效的编号。"
    exit 1
fi

# 获取选定的磁盘名
SELECTED_RAW=$(echo "${DISK_LIST[$CHOICE]}" | awk '{print $1}')
TARGET_DEV="/dev/$SELECTED_RAW"

# 4. 二次安全确认
echo -e "\n警告：测试将直接对 $TARGET_DEV 进行深度读写测试！"
echo "这会清除磁盘上的所有数据和分区表。"
read -p "确定要继续吗？(输入 y 确认): " CONFIRM
if [ "$CONFIRM" != "y" ]; then
    echo "操作已取消。"
    exit 0
fi

# 5. 运行 fio 测试
JSON_OUT="disk_res.json"
HTML_OUT="disk_report.html"
SIZE="2G"

echo "--------------------------------------------"
echo "正在测试 $TARGET_DEV，请稍候 (约 2 分钟)..."
# 注意：直接对块设备测试，不经过文件系统，结果最精准
fio --ioengine=libaio --direct=1 --group_reporting \
    --filename=$TARGET_DEV --size=$SIZE --runtime=60 \
    --name=Sequential_Write --rw=write --bs=1M \
    --name=Sequential_Read --rw=read --bs=1M \
    --name=Random_RW_4k --rw=randrw --rwmixread=50 --bs=4k \
    --output-format=json > $JSON_OUT

# 6. 解析数据并生成可视化 HTML 报告
WRITE_BW=$(jq '.jobs[] | select(.jobname=="Sequential_Write") | .write.bw_mean' $JSON_OUT)
READ_BW=$(jq '.jobs[] | select(.jobname=="Sequential_Read") | .read.bw_mean' $JSON_OUT)
RAND_IOPS_R=$(jq '.jobs[] | select(.jobname=="Random_RW_4k") | .read.iops' $JSON_OUT)
RAND_IOPS_W=$(jq '.jobs[] | select(.jobname=="Random_RW_4k") | .write.iops' $JSON_OUT)

# 计算 MB/s (保留一位小数)
W_MB=$(awk "BEGIN {printf \"%.1f\", $WRITE_BW/1024}")
R_MB=$(awk "BEGIN {printf \"%.1f\", $READ_BW/1024}")

cat <<EOF > $HTML_OUT
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>磁盘性能报告 - $TARGET_DEV</title>
    <style>
        body { font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; margin: 40px; background: #f4f7f6; }
        .container { max-width: 800px; margin: auto; background: white; padding: 40px; border-radius: 15px; box-shadow: 0 10px 30px rgba(0,0,0,0.1); }
        h1 { color: #2c3e50; text-align: center; border-bottom: 2px solid #eee; padding-bottom: 20px; }
        .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 30px; }
        .stat-card { padding: 25px; border-radius: 12px; color: white; text-align: center; }
        .write { background: #e74c3c; box-shadow: 0 4px 15px rgba(231, 76, 60, 0.3); } 
        .read { background: #3498db; box-shadow: 0 4px 15px rgba(52, 152, 219, 0.3); } 
        .iops { background: #2ecc71; box-shadow: 0 4px 15px rgba(46, 204, 113, 0.3); }
        .label { font-size: 14px; opacity: 0.9; display: block; margin-bottom: 10px; text-transform: uppercase; letter-spacing: 1px; }
        .num { font-size: 36px; font-weight: bold; }
        .unit { font-size: 18px; margin-left: 5px; }
        .footer { margin-top: 40px; font-size: 13px; color: #95a5a6; text-align: center; border-top: 1px solid #eee; padding-top: 20px; }
    </style>
</head>
<body>
    <div class="container">
        <h1>磁盘性能报告 ($TARGET_DEV)</h1>
        <div class="grid">
            <div class="stat-card write">
                <span class="label">顺序写入速度</span>
                <span class="num">$W_MB</span><span class="unit">MB/s</span>
            </div>
            <div class="stat-card read">
                <span class="label">顺序读取速度</span>
                <span class="num">$R_MB</span><span class="unit">MB/s</span>
            </div>
            <div class="stat-card iops">
                <span class="label">随机读取 (4K IOPS)</span>
                <span class="num">$RAND_IOPS_R</span>
            </div>
            <div class="stat-card iops" style="background: #27ae60;">
                <span class="label">随机写入 (4K IOPS)</span>
                <span class="num">$RAND_IOPS_W</span>
            </div>
        </div>
        <div class="footer">
            设备路径: $TARGET_DEV | 样本大小: $SIZE | 测试引擎: libaio<br>
            报告生成时间: $(date)
        </div>
    </div>
</body>
</html>
EOF

echo "============================================"
echo "测试完成！可视化报告已生成: $HTML_OUT"
echo "您可以执行 'python3 -m http.server 8000' 并在浏览器访问 'IP:8000/$HTML_OUT'。"
echo "============================================"