优化应用安装,使用jingrow标准方式上传应用包
This commit is contained in:
parent
c2056e7042
commit
15ec6a54b0
@ -644,11 +644,9 @@ async def get_app_meta():
|
||||
@router.post("/jingrow/install-extension")
|
||||
async def install_extension_package_api(request: Request, file: UploadFile = File(...)):
|
||||
"""安装扩展包到数据库"""
|
||||
temp_file_path = None
|
||||
try:
|
||||
log_info(f"开始处理上传的扩展包: {file.filename}")
|
||||
|
||||
# 验证文件类型
|
||||
if not file.filename:
|
||||
raise HTTPException(status_code=400, detail="文件名不能为空")
|
||||
|
||||
@ -656,87 +654,57 @@ async def install_extension_package_api(request: Request, file: UploadFile = Fil
|
||||
if not filename_lower.endswith(('.tar.gz', '.tgz', '.gz')):
|
||||
raise HTTPException(status_code=400, detail=f"只支持TAR.GZ格式的扩展包,当前文件: {filename_lower}")
|
||||
|
||||
# 保存上传文件到临时目录
|
||||
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.tar.gz')
|
||||
temp_file_path = temp_file.name
|
||||
try:
|
||||
content = await file.read()
|
||||
if not content:
|
||||
raise HTTPException(status_code=400, detail="文件内容为空")
|
||||
|
||||
temp_file.write(content)
|
||||
temp_file.close()
|
||||
|
||||
log_info(f"文件已保存到临时位置: {temp_file_path}, 大小: {len(content)} 字节")
|
||||
|
||||
# 保存文件到 jingrow-bench/sites/test001/public/files/
|
||||
target_dir = Path('/home/jingrow/jingrow-bench/sites/test001/public/files')
|
||||
target_dir.mkdir(parents=True, exist_ok=True)
|
||||
target_path = target_dir / file.filename
|
||||
|
||||
# 复制文件
|
||||
shutil.copy2(temp_file_path, target_path)
|
||||
|
||||
# 修复文件权限和所有者
|
||||
import pwd
|
||||
try:
|
||||
jingrow_user = pwd.getpwnam('jingrow')
|
||||
os.chown(target_path, jingrow_user.pw_uid, jingrow_user.pw_gid)
|
||||
os.chmod(target_path, 0o644)
|
||||
log_info(f"文件权限已修复: owner=jingrow, permissions=644")
|
||||
except Exception as perm_error:
|
||||
log_error(f"修复文件权限失败: {perm_error}")
|
||||
|
||||
log_info(f"文件已保存到: {target_path}")
|
||||
|
||||
# 调用 install_package API 安装
|
||||
from jingrow.utils.jingrow_api import get_jingrow_api_headers
|
||||
import requests
|
||||
|
||||
api_url = f"{Config.jingrow_server_url}/api/action/jingrow.ai.utils.jlocal.install_package"
|
||||
headers = get_jingrow_api_headers()
|
||||
|
||||
file_url = f"/files/{file.filename}"
|
||||
response = requests.post(
|
||||
api_url,
|
||||
json={'package_file_url': file_url},
|
||||
headers=headers,
|
||||
timeout=60
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
result_data = response.json()
|
||||
if result_data.get('message', {}).get('success'):
|
||||
log_info(f"扩展包安装成功: {result_data['message'].get('package_name')}")
|
||||
return {
|
||||
'success': True,
|
||||
'package_name': result_data['message']['package_name'],
|
||||
'file_url': file_url,
|
||||
'file_count': result_data['message'].get('file_count', 0)
|
||||
}
|
||||
else:
|
||||
error_msg = result_data.get('message', {}).get('error', '未知错误')
|
||||
log_error(f"安装失败: {error_msg}")
|
||||
raise HTTPException(status_code=400, detail=error_msg)
|
||||
content = await file.read()
|
||||
if not content:
|
||||
raise HTTPException(status_code=400, detail="文件内容为空")
|
||||
|
||||
log_info(f"读取文件完成,大小: {len(content)} 字节")
|
||||
|
||||
# 使用标准文件上传接口
|
||||
from jingrow.utils.jingrow_api import upload_file_to_jingrow, get_jingrow_api_headers
|
||||
import requests
|
||||
|
||||
upload_result = upload_file_to_jingrow(content, file.filename)
|
||||
|
||||
if not upload_result.get('success'):
|
||||
raise HTTPException(status_code=400, detail=upload_result.get('error', '文件上传失败'))
|
||||
|
||||
file_url = upload_result['file_url']
|
||||
log_info(f"文件上传成功: {file_url}")
|
||||
|
||||
# 调用 install_package API 安装
|
||||
api_url = f"{Config.jingrow_server_url}/api/action/jingrow.ai.utils.jlocal.install_package"
|
||||
headers = get_jingrow_api_headers()
|
||||
|
||||
response = requests.post(
|
||||
api_url,
|
||||
json={'package_file_url': file_url},
|
||||
headers=headers,
|
||||
timeout=60
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
result_data = response.json()
|
||||
if result_data.get('message', {}).get('success'):
|
||||
log_info(f"扩展包安装成功: {result_data['message'].get('package_name')}")
|
||||
return {
|
||||
'success': True,
|
||||
'package_name': result_data['message']['package_name'],
|
||||
'file_url': file_url,
|
||||
'file_count': result_data['message'].get('file_count', 0)
|
||||
}
|
||||
else:
|
||||
log_error(f"API调用失败: HTTP {response.status_code}")
|
||||
raise HTTPException(status_code=500, detail=f'安装API调用失败: HTTP {response.status_code}')
|
||||
|
||||
finally:
|
||||
# 清理临时文件
|
||||
if temp_file_path:
|
||||
try:
|
||||
os.unlink(temp_file_path)
|
||||
log_info(f"临时文件已删除: {temp_file_path}")
|
||||
except Exception as cleanup_error:
|
||||
log_error(f"清理临时文件失败: {cleanup_error}")
|
||||
error_msg = result_data.get('message', {}).get('error', '未知错误')
|
||||
log_error(f"安装失败: {error_msg}")
|
||||
raise HTTPException(status_code=400, detail=error_msg)
|
||||
else:
|
||||
log_error(f"API调用失败: HTTP {response.status_code}")
|
||||
raise HTTPException(status_code=500, detail=f'安装API调用失败: HTTP {response.status_code}')
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
import traceback
|
||||
error_detail = traceback.format_exc()
|
||||
log_error(f"安装扩展包失败: {str(e)}\n{error_detail}")
|
||||
log_error(f"安装扩展包失败: {str(e)}")
|
||||
raise HTTPException(status_code=500, detail=f"安装扩展包失败: {str(e)}")
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user