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