Fix install.sh venv robustness + batch install API error reporting
install.sh: detect incomplete venv (missing activate), auto-install python3-venv and retry instead of silently failing. servers.py batch install: preserve server_name on exception, detect "Status: FAILED" in stdout, return error details when stderr is empty, increase SSH timeout to 180s. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+11
-6
@@ -445,28 +445,33 @@ async def batch_install_agent(
|
||||
|
||||
async def _install_one(sid: int):
|
||||
async with sem:
|
||||
server_name = ""
|
||||
try:
|
||||
server = await service.get_server(sid)
|
||||
if not server:
|
||||
return BatchAgentResultItem(server_id=sid, server_name="", success=False, error="服务器不存在")
|
||||
server_name = server.name
|
||||
api_key = server.agent_api_key or settings.API_KEY
|
||||
if not api_key:
|
||||
return BatchAgentResultItem(server_id=sid, server_name=server.name, success=False, error="请先生成 Agent API Key")
|
||||
return BatchAgentResultItem(server_id=sid, server_name=server_name, success=False, error="请先生成 Agent API Key")
|
||||
install_cmd = (
|
||||
f"TMP=$(mktemp) && curl -fsSL {shlex.quote(base_url)}/agent/install.sh -o \"$TMP\" && bash \"$TMP\" -- "
|
||||
f"--url {shlex.quote(base_url)} --key {shlex.quote(api_key)} "
|
||||
f"--id {sid} --port {shlex.quote(str(server.agent_port or 8601))}"
|
||||
f"; RC=$?; rm -f \"$TMP\"; exit $RC"
|
||||
)
|
||||
r = await exec_ssh_command(server, install_cmd, timeout=120)
|
||||
r = await exec_ssh_command(server, install_cmd, timeout=180)
|
||||
ok = r["exit_code"] == 0
|
||||
# Also detect install.sh reporting FAILED in stdout
|
||||
if ok and "Status: FAILED" in r.get("stdout", ""):
|
||||
ok = False
|
||||
return BatchAgentResultItem(
|
||||
server_id=sid, server_name=server.name, success=ok,
|
||||
stdout=r["stdout"][:1000] if ok else "",
|
||||
error=r["stderr"][:300] if not ok else "",
|
||||
server_id=sid, server_name=server_name, success=ok,
|
||||
stdout=r["stdout"][:2000] if ok else r["stdout"][:1000],
|
||||
error="" if ok else (r.get("stderr", "")[:500] or f"安装失败 (exit {r['exit_code']}), 查看stdout"),
|
||||
)
|
||||
except Exception as e:
|
||||
return BatchAgentResultItem(server_id=sid, server_name="", success=False, error=str(e)[:200])
|
||||
return BatchAgentResultItem(server_id=sid, server_name=server_name, success=False, error=str(e)[:300])
|
||||
|
||||
items = await asyncio.gather(*[_install_one(sid) for sid in payload.server_ids])
|
||||
results = list(items)
|
||||
|
||||
+14
-1
@@ -67,8 +67,21 @@ echo " Using: $PYTHON ($($PYTHON --version 2>&1))"
|
||||
# 2. Create dir + venv
|
||||
echo "[2/5] Create venv..."
|
||||
mkdir -p "$INSTALL_DIR"
|
||||
if [ ! -d "$VENV_DIR" ]; then
|
||||
if [ ! -f "$VENV_DIR/bin/activate" ]; then
|
||||
"$PYTHON" -m venv "$VENV_DIR"
|
||||
# venv creation silently fails when python3-venv is missing (dir exists but no activate)
|
||||
if [ ! -f "$VENV_DIR/bin/activate" ]; then
|
||||
echo " venv incomplete — installing python3-venv..."
|
||||
apt-get update -qq && apt-get install -y -qq "python$( "$PYTHON" -c 'import sys;print(f"{sys.version_info.major}.{sys.version_info.minor}")' )-venv" 2>/dev/null \
|
||||
|| apt-get install -y -qq python3-venv 2>/dev/null \
|
||||
|| { echo "ERROR: Cannot install python3-venv. Run: apt install python3-venv"; exit 1; }
|
||||
rm -rf "$VENV_DIR"
|
||||
"$PYTHON" -m venv "$VENV_DIR"
|
||||
if [ ! -f "$VENV_DIR/bin/activate" ]; then
|
||||
echo "ERROR: venv creation failed even after installing python3-venv"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
# shellcheck disable=SC1091
|
||||
source "$VENV_DIR/bin/activate"
|
||||
|
||||
Reference in New Issue
Block a user