's'
This commit is contained in:
@@ -25,6 +25,7 @@ REMOTE_BASE = os.environ.get("LIVE_DEPLOY_PATH", "/home/live/douyinyoutube").rst
|
||||
REPO_ROOT = Path(__file__).resolve().parent.parent
|
||||
|
||||
FILES = [
|
||||
"src/android_control.py",
|
||||
"src/control_plane.py",
|
||||
"src/web_process_backend.py",
|
||||
"src/hub_routes.py",
|
||||
@@ -39,7 +40,9 @@ FILES = [
|
||||
"scripts/linux/service_ctl.sh",
|
||||
"scripts/linux/lib/common.sh",
|
||||
"services/srs/docker-compose.yml",
|
||||
"services/srs/data/index.html",
|
||||
"services/neko/docker-compose.yml",
|
||||
"services/neko/docker-compose.firefox.yml",
|
||||
"services/neko/chromium.conf",
|
||||
"services/neko/policies/policies.json",
|
||||
"services/neko/.gitignore",
|
||||
@@ -280,6 +283,25 @@ def main() -> int:
|
||||
"done; echo curl_health_failed; exit 0",
|
||||
timeout=120,
|
||||
)
|
||||
# 若健康检查失败,再尝试 reset-failed + start(部分板子 restart 后 unit 未 active)
|
||||
recover_console = (
|
||||
f"echo '{PASS}' | sudo -S bash -c '"
|
||||
"systemctl reset-failed live-console.service 2>/dev/null; "
|
||||
"systemctl start live-console.service 2>/dev/null; "
|
||||
"sleep 5; "
|
||||
"systemctl is-active live-console.service || true; "
|
||||
"journalctl -u live-console.service -n 25 --no-pager 2>/dev/null || true'"
|
||||
)
|
||||
run_logged(client, log_path, "recover_live_console_if_needed", recover_console, timeout=90)
|
||||
run_logged(
|
||||
client,
|
||||
log_path,
|
||||
"curl_health_after_recover",
|
||||
"for i in $(seq 1 12); do "
|
||||
"if curl -sf -m 4 http://127.0.0.1:8001/health >/dev/null 2>&1; then echo health_ok_recover; exit 0; fi; "
|
||||
"sleep 2; done; echo still_failed; exit 0",
|
||||
timeout=60,
|
||||
)
|
||||
run_logged(
|
||||
client,
|
||||
log_path,
|
||||
|
||||
62
tools/probe_board_stack.py
Normal file
62
tools/probe_board_stack.py
Normal file
@@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env python3
|
||||
"""SSH 到板子:打印 ENABLE_NEKO 与 Docker 中与 srs/neko 相关的容器。
|
||||
|
||||
环境变量与 deploy_live_paramiko.py 一致:
|
||||
LIVE_DEPLOY_HOST(默认 192.168.21.105)
|
||||
LIVE_DEPLOY_USER(默认 live)
|
||||
LIVE_DEPLOY_PASS(默认 12345678)
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
try:
|
||||
import paramiko
|
||||
except ImportError:
|
||||
print("请先执行: pip install paramiko", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
HOST = os.environ.get("LIVE_DEPLOY_HOST", "192.168.21.105")
|
||||
USER = os.environ.get("LIVE_DEPLOY_USER", "live")
|
||||
PASS = os.environ.get("LIVE_DEPLOY_PASS", "12345678")
|
||||
|
||||
REMOTE_SH = r"""
|
||||
echo "--- ENABLE_NEKO in known env files ---"
|
||||
for f in /opt/live/config/system-stack.env /opt/live/generated/system-stack.env /home/live/douyinyoutube/config/system-stack.env; do
|
||||
if [ -f "$f" ]; then
|
||||
echo "=== $f ==="
|
||||
grep -E '^ENABLE_NEKO=' "$f" 2>/dev/null || echo '(no ENABLE_NEKO line)'
|
||||
fi
|
||||
done
|
||||
echo "--- docker: srs / neko (running or all) ---"
|
||||
docker ps -a --format '{{.Names}} {{.Status}}' 2>/dev/null | grep -iE 'neko|srs' || echo '(no container name matching neko|srs)'
|
||||
echo "--- docker ps -a (first 25) ---"
|
||||
docker ps -a --format '{{.Names}} {{.Status}}' 2>/dev/null | head -25
|
||||
"""
|
||||
|
||||
|
||||
def main() -> int:
|
||||
c = paramiko.SSHClient()
|
||||
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
try:
|
||||
c.connect(HOST, username=USER, password=PASS, timeout=20)
|
||||
except Exception as e:
|
||||
print(f"SSH_CONNECT_FAILED {HOST} {type(e).__name__}: {e}", file=sys.stderr)
|
||||
return 2
|
||||
_, stdout, stderr = c.exec_command(
|
||||
"export LC_ALL=C.UTF-8 LANG=C.UTF-8; " + REMOTE_SH,
|
||||
timeout=90,
|
||||
)
|
||||
out = stdout.read().decode("utf-8", errors="replace")
|
||||
err = stderr.read().decode("utf-8", errors="replace")
|
||||
code = stdout.channel.recv_exit_status()
|
||||
c.close()
|
||||
print(out, end="")
|
||||
if err.strip():
|
||||
print(err, file=sys.stderr, end="")
|
||||
return code
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
42
tools/ssh_neko_start.py
Normal file
42
tools/ssh_neko_start.py
Normal file
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env python3
|
||||
"""SSH:在板子上执行 service_ctl.sh neko start(拉镜像可能较久)。"""
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
import paramiko
|
||||
|
||||
HOST = os.environ.get("LIVE_DEPLOY_HOST", "192.168.21.105")
|
||||
USER = os.environ.get("LIVE_DEPLOY_USER", "live")
|
||||
PASS = os.environ.get("LIVE_DEPLOY_PASS", "12345678")
|
||||
REMOTE_BASE = os.environ.get("LIVE_DEPLOY_PATH", "/home/live/douyinyoutube").rstrip("/")
|
||||
|
||||
CMD = (
|
||||
f"export LC_ALL=C.UTF-8 LANG=C.UTF-8; "
|
||||
f"cd {REMOTE_BASE} && bash scripts/linux/service_ctl.sh neko start"
|
||||
)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
c = paramiko.SSHClient()
|
||||
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
try:
|
||||
c.connect(HOST, username=USER, password=PASS, timeout=25)
|
||||
except Exception as e:
|
||||
print(f"SSH failed: {e}", file=sys.stderr)
|
||||
return 2
|
||||
_, stdout, stderr = c.exec_command(CMD, timeout=600)
|
||||
out = stdout.read().decode("utf-8", errors="replace")
|
||||
err = stderr.read().decode("utf-8", errors="replace")
|
||||
code = stdout.channel.recv_exit_status()
|
||||
c.close()
|
||||
print(out, end="")
|
||||
if err.strip():
|
||||
print("--- stderr ---", file=sys.stderr)
|
||||
print(err, file=sys.stderr, end="")
|
||||
return code
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user