186 lines
6.5 KiB
Python
186 lines
6.5 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
Cursor自动化服务 - 修复脚本
|
|||
|
|
添加虚拟环境支持并修复MySQL连接问题
|
|||
|
|
"""
|
|||
|
|
import os
|
|||
|
|
import sys
|
|||
|
|
import subprocess
|
|||
|
|
import shutil
|
|||
|
|
import time
|
|||
|
|
|
|||
|
|
# 彩色输出函数
|
|||
|
|
class Colors:
|
|||
|
|
GREEN = '\033[92m'
|
|||
|
|
YELLOW = '\033[93m'
|
|||
|
|
RED = '\033[91m'
|
|||
|
|
BLUE = '\033[94m'
|
|||
|
|
ENDC = '\033[0m'
|
|||
|
|
BOLD = '\033[1m'
|
|||
|
|
|
|||
|
|
def print_success(msg):
|
|||
|
|
print(f"{Colors.GREEN}✓ {msg}{Colors.ENDC}")
|
|||
|
|
|
|||
|
|
def print_warning(msg):
|
|||
|
|
print(f"{Colors.YELLOW}⚠ {msg}{Colors.ENDC}")
|
|||
|
|
|
|||
|
|
def print_error(msg):
|
|||
|
|
print(f"{Colors.RED}✗ {msg}{Colors.ENDC}")
|
|||
|
|
|
|||
|
|
def print_title(title):
|
|||
|
|
print("\n" + "=" * 60)
|
|||
|
|
print(f"{Colors.BOLD}{Colors.BLUE}{title.center(60)}{Colors.ENDC}")
|
|||
|
|
print("=" * 60 + "\n")
|
|||
|
|
|
|||
|
|
def check_virtual_env():
|
|||
|
|
"""检查是否在虚拟环境中运行"""
|
|||
|
|
return hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix)
|
|||
|
|
|
|||
|
|
def setup_virtual_env():
|
|||
|
|
"""设置Python虚拟环境"""
|
|||
|
|
print_title("虚拟环境设置")
|
|||
|
|
|
|||
|
|
if check_virtual_env():
|
|||
|
|
print_success("当前已在虚拟环境中运行")
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
print_warning("当前未在虚拟环境中运行")
|
|||
|
|
create_venv = input("是否创建虚拟环境? (推荐) (y/n, 默认: y): ").strip().lower()
|
|||
|
|
if create_venv == 'n':
|
|||
|
|
print_warning("跳过虚拟环境创建")
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
venv_path = input("请输入虚拟环境路径 (默认: ./venv): ").strip() or "./venv"
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# 创建虚拟环境
|
|||
|
|
print(f"创建虚拟环境: {venv_path}")
|
|||
|
|
subprocess.check_call([sys.executable, "-m", "venv", venv_path])
|
|||
|
|
|
|||
|
|
# 获取激活脚本路径
|
|||
|
|
if sys.platform.startswith('win'):
|
|||
|
|
activate_script = os.path.join(venv_path, "Scripts", "activate.bat")
|
|||
|
|
python_exe = os.path.join(venv_path, "Scripts", "python.exe")
|
|||
|
|
else:
|
|||
|
|
activate_script = os.path.join(venv_path, "bin", "activate")
|
|||
|
|
python_exe = os.path.join(venv_path, "bin", "python")
|
|||
|
|
|
|||
|
|
# 创建安装脚本
|
|||
|
|
print("创建安装脚本...")
|
|||
|
|
setup_script = "setup_venv.sh"
|
|||
|
|
with open(setup_script, "w") as f:
|
|||
|
|
if sys.platform.startswith('win'):
|
|||
|
|
f.write(f"@echo off\n")
|
|||
|
|
f.write(f"call {activate_script}\n")
|
|||
|
|
f.write(f"pip install -r requirements.txt\n")
|
|||
|
|
f.write(f"pip install cryptography\n")
|
|||
|
|
f.write(f"python setup_environment.py\n")
|
|||
|
|
f.write(f"pause\n")
|
|||
|
|
else:
|
|||
|
|
f.write(f"#!/bin/bash\n")
|
|||
|
|
f.write(f"source {activate_script}\n")
|
|||
|
|
f.write(f"pip install -r requirements.txt\n")
|
|||
|
|
f.write(f"pip install cryptography\n")
|
|||
|
|
f.write(f"python setup_environment.py\n")
|
|||
|
|
|
|||
|
|
if not sys.platform.startswith('win'):
|
|||
|
|
os.chmod(setup_script, 0o755)
|
|||
|
|
|
|||
|
|
print_success(f"虚拟环境创建成功: {venv_path}")
|
|||
|
|
print_success(f"安装脚本已创建: {setup_script}")
|
|||
|
|
|
|||
|
|
print("\n请运行以下命令完成安装:")
|
|||
|
|
if sys.platform.startswith('win'):
|
|||
|
|
print(f" {setup_script}")
|
|||
|
|
else:
|
|||
|
|
print(f" ./{setup_script}")
|
|||
|
|
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
print_error(f"创建虚拟环境失败: {str(e)}")
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
def fix_mysql_format_issue():
|
|||
|
|
"""修复MySQL格式化问题"""
|
|||
|
|
print_title("修复MySQL连接问题")
|
|||
|
|
|
|||
|
|
if not os.path.exists("setup_environment.py"):
|
|||
|
|
print_error("未找到setup_environment.py文件")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
backup_file = f"setup_environment.py.bak.{int(time.time())}"
|
|||
|
|
try:
|
|||
|
|
# 创建备份
|
|||
|
|
shutil.copy2("setup_environment.py", backup_file)
|
|||
|
|
print_success(f"已创建备份: {backup_file}")
|
|||
|
|
|
|||
|
|
# 读取文件内容
|
|||
|
|
with open("setup_environment.py", "r", encoding="utf-8") as f:
|
|||
|
|
content = f.read()
|
|||
|
|
|
|||
|
|
# 修复格式化问题
|
|||
|
|
fixed_content = content
|
|||
|
|
|
|||
|
|
# 1. 添加cryptography到required_packages
|
|||
|
|
if "cryptography" not in content:
|
|||
|
|
fixed_content = fixed_content.replace(
|
|||
|
|
'required_packages = [\n "loguru",\n "pymysql",\n "aiomysql",\n "redis",\n "pyyaml"',
|
|||
|
|
'required_packages = [\n "loguru",\n "pymysql",\n "aiomysql",\n "redis",\n "pyyaml",\n "cryptography"'
|
|||
|
|
)
|
|||
|
|
print_success("已添加cryptography到依赖包列表")
|
|||
|
|
|
|||
|
|
# 2. 修复CREATE USER语句的格式化问题
|
|||
|
|
if "cursor.execute(f\"CREATE USER '{db_user}'@'%'" in content:
|
|||
|
|
fixed_content = fixed_content.replace(
|
|||
|
|
"cursor.execute(f\"CREATE USER '{db_user}'@'%' IDENTIFIED BY %s\", (db_password,))",
|
|||
|
|
"cursor.execute(\"CREATE USER %s@'%%' IDENTIFIED BY %s\", (db_user, db_password))"
|
|||
|
|
)
|
|||
|
|
print_success("已修复CREATE USER语句")
|
|||
|
|
|
|||
|
|
# 3. 修复ALTER USER语句的格式化问题
|
|||
|
|
if "cursor.execute(f\"ALTER USER '{db_user}'@'%'" in content:
|
|||
|
|
fixed_content = fixed_content.replace(
|
|||
|
|
"cursor.execute(f\"ALTER USER '{db_user}'@'%' IDENTIFIED BY %s\", (db_password,))",
|
|||
|
|
"cursor.execute(\"ALTER USER %s@'%%' IDENTIFIED BY %s\", (db_user, db_password))"
|
|||
|
|
)
|
|||
|
|
print_success("已修复ALTER USER语句")
|
|||
|
|
|
|||
|
|
# 写入修复后的内容
|
|||
|
|
with open("setup_environment.py", "w", encoding="utf-8") as f:
|
|||
|
|
f.write(fixed_content)
|
|||
|
|
|
|||
|
|
print_success("MySQL连接问题修复完成")
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
print_error(f"修复过程出错: {str(e)}")
|
|||
|
|
try:
|
|||
|
|
if os.path.exists(backup_file):
|
|||
|
|
shutil.copy2(backup_file, "setup_environment.py")
|
|||
|
|
print_warning("已恢复原始文件")
|
|||
|
|
except:
|
|||
|
|
pass
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
print_title("Cursor自动化服务 - 修复工具")
|
|||
|
|
|
|||
|
|
# 设置虚拟环境
|
|||
|
|
if not setup_virtual_env():
|
|||
|
|
# 如果创建了虚拟环境并生成了安装脚本,直接退出
|
|||
|
|
sys.exit(0)
|
|||
|
|
|
|||
|
|
# 修复MySQL格式化问题
|
|||
|
|
if not fix_mysql_format_issue():
|
|||
|
|
print_error("修复失败,请手动检查setup_environment.py文件")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
print_title("修复完成")
|
|||
|
|
print("现在可以安全地运行设置向导:")
|
|||
|
|
print(" python setup_environment.py")
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
try:
|
|||
|
|
main()
|
|||
|
|
except KeyboardInterrupt:
|
|||
|
|
print("\n\n操作已取消")
|
|||
|
|
sys.exit(1)
|