#!/bin/bash

configure_grub_password() {
    local grub_cfg="/boot/grub2/grub.cfg"
    local grub_default="/etc/default/grub"
    local custom_file="/etc/grub.d/40_custom"
    
    # 检查系统
    if [ ! -f "$grub_cfg" ]; then
        echo "错误：找不到GRUB配置文件"
        return 1
    fi
    
    # 备份重要文件
    echo "备份GRUB配置文件..."
    sudo cp "$grub_cfg" "${grub_cfg}.backup.$(date +%Y%m%d_%H%M%S)"
    [ -f "$grub_default" ] && sudo cp "$grub_default" "${grub_default}.backup.$(date +%Y%m%d_%H%M%S)"
    
    # 生成加密密码
    echo "请为GRUB设置启动密码："
    local pwd_hash=$(grub2-mkpasswd-pbkdf2 | grep "grub.pbkdf2" | awk '{print $7}')
    
    if [ -z "$pwd_hash" ]; then
        echo "错误：密码生成失败"
        return 1
    fi
    
    # 配置/etc/default/grub
    echo "配置GRUB默认设置..."
    sudo tee -a "$grub_default" > /dev/null <<EOF

# GRUB启动密码设置（安全基线）
GRUB_PASSWORD=$pwd_hash
EOF
    
    # 创建自定义配置
    echo "创建自定义GRUB配置..."
    sudo tee "$custom_file" > /dev/null <<'EOF'
#!/bin/sh
exec tail -n +3 $0

# 设置GRUB超级用户和密码
set superusers="root"
password_pbkdf2 root {{PASSWORD_HASH}}

# 对编辑和命令行模式要求认证
set superusers="root"
export superusers

EOF
    
    # 替换密码哈希
    sudo sed -i "s/{{PASSWORD_HASH}}/$pwd_hash/" "$custom_file"
    
    # 设置文件权限
    sudo chmod 755 "$custom_file"
    sudo chmod 600 "$grub_default"
    
    # 重新生成GRUB配置
    echo "重新生成GRUB配置..."
    if command -v grub2-mkconfig >/dev/null 2>&1; then
        sudo grub2-mkconfig -o "$grub_cfg"
    elif command -v update-grub >/dev/null 2>&1; then
        sudo update-grub
    else
        echo "警告：无法找到grub配置生成命令"
        echo "请手动执行: grub2-mkconfig -o /boot/grub2/grub.cfg"
    fi
    
    # 验证配置
    if sudo grep -q "password_pbkdf2" "$grub_cfg" 2>/dev/null; then
        echo "✓ GRUB启动密码配置成功"
        echo "✓ 重启系统后生效"
        echo ""
        echo "重要提示："
        echo "1. 请确保记住设置的密码"
        echo "2. 重启后编辑启动项需要输入密码"
        echo "3. 备份文件位于: ${grub_cfg}.backup.*"
    else
        echo "✗ GRUB密码配置可能失败，请检查"
        return 1
    fi
}

# 安全确认
read -p "此操作将设置GRUB启动密码，是否继续？(y/N): " confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
    configure_grub_password
else
    echo "操作已取消"
fi
