#!/bin/bash

# 脚本名称: create_ext2_image_fixed.sh
# 功能: 将指定文件夹内容复制到ext2镜像文件
# 使用方法: sudo ./create_ext2_image_fixed.sh
# 输出: 在当前目录生成 ex2_image.img

# ==================== 配置部分 ====================
SOURCE_DIR="/home/huawei/to_ex2"      # 源目录路径
OUTPUT_IMAGE="ex2_image.img"          # 输出的镜像文件名
MOUNT_POINT="/tmp/ext2_mount_$$"      # 临时挂载点(使用PID保证唯一)

# ==================== 颜色定义 ====================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色

# ==================== 修改后的日志函数 ====================
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1" >&2
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1" >&2
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1" >&2
}

log_debug() {
    echo -e "${BLUE}[DEBUG]${NC} $1" >&2
}

# ==================== 清理函数 ====================
cleanup() {
    if mountpoint -q "$MOUNT_POINT" 2>/dev/null; then
        log_info "清理: 卸载挂载点..."
        umount "$MOUNT_POINT" 2>/dev/null
    fi
    if [ -d "$MOUNT_POINT" ]; then
        rmdir "$MOUNT_POINT" 2>/dev/null
    fi
}
trap cleanup EXIT

# ==================== 检查函数 ====================
check_requirements() {
    log_info "检查环境和依赖..."
    
    if [ "$EUID" -ne 0 ]; then
        log_error "需要root权限运行此脚本(用于挂载文件系统)"
        log_info "请使用: sudo $0"
        exit 1
    fi
    
    for tool in dd mkfs.ext2 mount cp umount; do
        if ! command -v $tool &> /dev/null; then
            log_error "缺少必要工具: $tool"
            log_info "请安装: apt-get install e2fsprogs mount coreutils"
            exit 1
        fi
    done
    
    if [ ! -d "$SOURCE_DIR" ]; then
        log_error "源目录不存在: $SOURCE_DIR"
        exit 1
    fi
    
    if [ -z "$(ls -A "$SOURCE_DIR" 2>/dev/null)" ]; then
        log_warn "源目录为空: $SOURCE_DIR"
    fi
}

# ==================== 计算镜像大小 ====================
calculate_size() {
    log_info "计算所需镜像大小..."
    
    local dir_size=$(du -sb "$SOURCE_DIR" 2>/dev/null | cut -f1)
    local dir_size_mb=$((dir_size / 1024 / 1024))
    
    local image_size_mb=$((dir_size_mb * 14 / 10 + 16))
    
    if [ $image_size_mb -lt 32 ]; then
        image_size_mb=32
    fi
    
    log_debug "目录大小: ${dir_size_mb} MB"
    log_info "将创建镜像: ${image_size_mb} MB"
    
    echo $image_size_mb
}

# ==================== 创建镜像 ====================
create_image() {
    local size_mb=$1
    
    log_info "创建镜像文件: $OUTPUT_IMAGE (${size_mb} MB)..."
    
    if ! dd if=/dev/zero of="$OUTPUT_IMAGE" bs=1M count="$size_mb" status=progress 2>&1; then
        log_error "创建镜像文件失败"
        return 1
    fi
    
    log_info "格式化为ext2文件系统..."
    if ! mkfs.ext2 -F "$OUTPUT_IMAGE" &>/dev/null; then
        log_error "格式化ext2失败"
        return 1
    fi
    
    return 0
}

# ==================== 复制文件 ====================
copy_files() {
    log_info "创建挂载点: $MOUNT_POINT"
    mkdir -p "$MOUNT_POINT" || {
        log_error "创建挂载点失败"
        return 1
    }
    
    log_info "挂载镜像..."
    if ! mount -o loop "$OUTPUT_IMAGE" "$MOUNT_POINT"; then
        log_error "挂载镜像失败"
        return 1
    fi
    
    log_info "复制文件到镜像..."
    if ! cp -a "$SOURCE_DIR"/* "$MOUNT_POINT/"; then
        log_error "复制文件失败"
        return 1
    fi
    
    log_info "同步数据到磁盘..."
    sync
    
    log_info "卸载镜像..."
    if ! umount "$MOUNT_POINT"; then
        log_warn "卸载镜像可能失败,请手动检查"
    fi
    
    return 0
}

# ==================== 验证镜像 ====================
verify_image() {
    log_info "验证生成的镜像..."
    
    if [ ! -f "$OUTPUT_IMAGE" ]; then
        log_error "镜像文件未生成"
        return 1
    fi
    
    local final_size=$(ls -lh "$OUTPUT_IMAGE" | awk '{print $5}')
    log_info "✓ 镜像创建成功: $OUTPUT_IMAGE (大小: $final_size)"
    
    log_info "文件系统详细信息:"
    dumpe2fs -h "$OUTPUT_IMAGE" 2>/dev/null | grep -E "Inode count|Block count|Free blocks|Block size" | head -4
    
    return 0
}

# ==================== 主函数 ====================
main() {
    echo "========================================"
    echo "  ext2 镜像创建工具"
    echo "========================================"
    echo "源目录: $SOURCE_DIR"
    echo "输出文件: $OUTPUT_IMAGE"
    echo "========================================"
    echo ""
    
    check_requirements
    
    local image_size=$(calculate_size)
    
    if create_image "$image_size"; then
        if copy_files; then
            verify_image
            log_info "操作完成!"
            echo ""
            echo "镜像文件已生成: $(pwd)/$OUTPUT_IMAGE"
        else
            log_error "文件复制失败"
            exit 1
        fi
    else
        log_error "镜像创建失败"
        exit 1
    fi
}

main "$@"