fix(plugins_initializer): 优化插件恢复的容错处理

- 添加单个插件恢复失败的异常处理,使用 continue 跳过
- 确保单个插件恢复失败不影响其他插件继续恢复
This commit is contained in:
Attente
2025-06-12 07:56:44 +08:00
parent 8ed87294e2
commit eac4d703c7
+33 -34
View File
@@ -94,24 +94,24 @@ def backup_plugins():
# 使用绝对路径确保准确性 # 使用绝对路径确保准确性
plugins_dir = settings.ROOT_PATH / "app" / "plugins" plugins_dir = settings.ROOT_PATH / "app" / "plugins"
backup_dir = settings.CONFIG_PATH / "plugins_backup" backup_dir = settings.CONFIG_PATH / "plugins_backup"
if not plugins_dir.exists(): if not plugins_dir.exists():
logger.info("插件目录不存在,跳过备份") logger.info("插件目录不存在,跳过备份")
return return
# 确保备份目录存在 # 确保备份目录存在
backup_dir.mkdir(parents=True, exist_ok=True) backup_dir.mkdir(parents=True, exist_ok=True)
# 需要排除的文件和目录 # 需要排除的文件和目录
exclude_items = {"__init__.py", "__pycache__", ".DS_Store"} exclude_items = {"__init__.py", "__pycache__", ".DS_Store"}
# 遍历插件目录,备份除排除项外的所有内容 # 遍历插件目录,备份除排除项外的所有内容
for item in plugins_dir.iterdir(): for item in plugins_dir.iterdir():
if item.name in exclude_items: if item.name in exclude_items:
continue continue
target_path = backup_dir / item.name target_path = backup_dir / item.name
# 如果是目录 # 如果是目录
if item.is_dir(): if item.is_dir():
if target_path.exists(): if target_path.exists():
@@ -122,9 +122,9 @@ def backup_plugins():
elif item.is_file(): elif item.is_file():
shutil.copy2(item, target_path) shutil.copy2(item, target_path)
logger.info(f"已备份插件文件: {item.name}") logger.info(f"已备份插件文件: {item.name}")
logger.info(f"插件备份完成,备份位置: {backup_dir}") logger.info(f"插件备份完成,备份位置: {backup_dir}")
except Exception as e: except Exception as e:
logger.error(f"插件备份失败: {str(e)}") logger.error(f"插件备份失败: {str(e)}")
@@ -138,26 +138,25 @@ def restore_plugins():
if not SystemUtils.is_docker(): if not SystemUtils.is_docker():
return return
try: # 使用绝对路径确保准确性
# 使用绝对路径确保准确性 plugins_dir = settings.ROOT_PATH / "app" / "plugins"
plugins_dir = settings.ROOT_PATH / "app" / "plugins" backup_dir = settings.CONFIG_PATH / "plugins_backup"
backup_dir = settings.CONFIG_PATH / "plugins_backup"
if not backup_dir.exists():
logger.info("插件备份目录不存在,跳过恢复")
return
# 系统被重置才恢复插件 if not backup_dir.exists():
if SystemHelper().is_system_reset(): logger.info("插件备份目录不存在,跳过恢复")
return
# 确保插件目录存在 # 系统被重置才恢复插件
plugins_dir.mkdir(parents=True, exist_ok=True) if SystemHelper().is_system_reset():
# 遍历备份目录,恢复所有内容 # 确保插件目录存在
restored_count = 0 plugins_dir.mkdir(parents=True, exist_ok=True)
for item in backup_dir.iterdir():
target_path = plugins_dir / item.name
# 遍历备份目录,恢复所有内容
restored_count = 0
for item in backup_dir.iterdir():
target_path = plugins_dir / item.name
try:
# 如果是目录,且目录内有内容 # 如果是目录,且目录内有内容
if item.is_dir() and any(item.iterdir()): if item.is_dir() and any(item.iterdir()):
if target_path.exists(): if target_path.exists():
@@ -170,15 +169,15 @@ def restore_plugins():
shutil.copy2(item, target_path) shutil.copy2(item, target_path)
logger.info(f"已恢复插件文件: {item.name}") logger.info(f"已恢复插件文件: {item.name}")
restored_count += 1 restored_count += 1
except Exception as e:
logger.error(f"恢复插件 {item.name} 时发生错误: {str(e)}")
continue
logger.info(f"插件恢复完成,共恢复 {restored_count} 个项目") logger.info(f"插件恢复完成,共恢复 {restored_count} 个项目")
# 删除备份目录 # 删除备份目录
try: try:
shutil.rmtree(backup_dir) shutil.rmtree(backup_dir)
logger.info(f"已删除插件备份目录: {backup_dir}") logger.info(f"已删除插件备份目录: {backup_dir}")
except Exception as e:
logger.warning(f"删除备份目录失败: {str(e)}")
except Exception as e: except Exception as e:
logger.error(f"插件恢复失败: {str(e)}") logger.warning(f"删除备份目录失败: {str(e)}")