#!/usr/bin/env bash set -euo pipefail : "${STAGING_AUDIT_HOST:?STAGING_AUDIT_HOST is required}" : "${STAGING_AUDIT_PROJECT_DIR:?STAGING_AUDIT_PROJECT_DIR is required}" : "${STAGING_AUDIT_MANAGE:?STAGING_AUDIT_MANAGE is required}" mkdir -p artifacts SSH_OPTS=${SSH_OPTS:-"-o StrictHostKeyChecking=accept-new"} if [[ -n "${STAGING_SSH_KEYFILE:-}" ]]; then SSH_OPTS="$SSH_OPTS -i ${STAGING_SSH_KEYFILE}" fi AUDIT_TIMEOUT_SECONDS=${AUDIT_TIMEOUT_SECONDS:-300} OUT_FILE="artifacts/multilingual-audit.json" TMP_FILE="${OUT_FILE}.tmp" write_failure_json() { python3 - < "$OUT_FILE" import json print(json.dumps({ "run_id": None, "total_urls_checked": 0, "issues_found": 0, "summary": {}, "issues": {}, "error": ${1@Q} }, indent=2)) PY } REMOTE_CMD="cd '${STAGING_AUDIT_PROJECT_DIR}' && '${STAGING_AUDIT_MANAGE}' audit_locales --format=json" set +e SSH_OPTS="$SSH_OPTS" STAGING_AUDIT_HOST="$STAGING_AUDIT_HOST" REMOTE_CMD="$REMOTE_CMD" AUDIT_TIMEOUT_SECONDS="$AUDIT_TIMEOUT_SECONDS" python3 - <<'PY' > "$TMP_FILE" import os import shlex import subprocess import sys ssh_opts = shlex.split(os.environ["SSH_OPTS"]) cmd = ["ssh", *ssh_opts, os.environ["STAGING_AUDIT_HOST"], os.environ["REMOTE_CMD"]] try: proc = subprocess.run( cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, timeout=int(os.environ["AUDIT_TIMEOUT_SECONDS"]), ) sys.stdout.write(proc.stdout) sys.stderr.write(proc.stderr) except subprocess.TimeoutExpired as exc: sys.stderr.write(exc.stderr or "") raise SystemExit(124) except subprocess.CalledProcessError as exc: sys.stdout.write(exc.stdout or "") sys.stderr.write(exc.stderr or "") raise SystemExit(exc.returncode) PY rc=$? set -e if [[ $rc -eq 0 ]]; then mv "$TMP_FILE" "$OUT_FILE" exit 0 fi rm -f "$TMP_FILE" if [[ $rc -eq 124 ]]; then write_failure_json "Remote multilingual audit timed out after ${AUDIT_TIMEOUT_SECONDS}s" else write_failure_json "Remote multilingual audit failed with exit status ${rc}" fi exit $rc