140 lines
4.9 KiB
Bash
Executable File
140 lines
4.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -eu -o pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
RUN_ARG="${1:-}"
|
|
|
|
if [ -n "${RUN_ARG}" ]; then
|
|
if [ -d "${RUN_ARG}" ]; then
|
|
RUN_DIR="${RUN_ARG}"
|
|
RUN_ID="$(basename "${RUN_DIR}")"
|
|
else
|
|
RUN_ID="${RUN_ARG}"
|
|
RUN_DIR="${ROOT_DIR}/evidence/runs/${RUN_ID}"
|
|
fi
|
|
else
|
|
RUN_DIR="$(ls -1dt "${ROOT_DIR}"/evidence/runs/* 2>/dev/null | head -n 1)"
|
|
RUN_ID="$(basename "${RUN_DIR}")"
|
|
fi
|
|
|
|
if [ -z "${RUN_DIR:-}" ] || [ ! -d "${RUN_DIR}" ]; then
|
|
echo "Run directory not found." >&2
|
|
exit 1
|
|
fi
|
|
|
|
BASE_URL="${KEYWARDEN_SCREENSHOT_BASE_URL:-}"
|
|
ADMIN_USER="${KEYWARDEN_ADMIN_USERNAME:-}"
|
|
ADMIN_EMAIL="${KEYWARDEN_ADMIN_EMAIL:-}"
|
|
ADMIN_PASS="${KEYWARDEN_ADMIN_PASSWORD:-}"
|
|
SERVER_ID="${KEYWARDEN_SCREENSHOT_SERVER_ID:-}"
|
|
|
|
if [ -f "${ROOT_DIR}/.env" ]; then
|
|
if [ -z "${BASE_URL}" ]; then
|
|
DOMAIN_LINE="$(grep -m1 '^KEYWARDEN_DOMAIN=' "${ROOT_DIR}/.env" || true)"
|
|
DOMAIN_VALUE="${DOMAIN_LINE#KEYWARDEN_DOMAIN=}"
|
|
if [ -n "${DOMAIN_VALUE}" ]; then
|
|
if printf "%s" "${DOMAIN_VALUE}" | grep -qE '^https?://'; then
|
|
BASE_URL="${DOMAIN_VALUE}"
|
|
else
|
|
BASE_URL="https://${DOMAIN_VALUE}"
|
|
fi
|
|
fi
|
|
fi
|
|
if [ -z "${ADMIN_USER}" ]; then
|
|
USER_LINE="$(grep -m1 '^KEYWARDEN_ADMIN_USERNAME=' "${ROOT_DIR}/.env" || true)"
|
|
ADMIN_USER="${USER_LINE#KEYWARDEN_ADMIN_USERNAME=}"
|
|
fi
|
|
if [ -z "${ADMIN_EMAIL}" ]; then
|
|
EMAIL_LINE="$(grep -m1 '^KEYWARDEN_ADMIN_EMAIL=' "${ROOT_DIR}/.env" || true)"
|
|
ADMIN_EMAIL="${EMAIL_LINE#KEYWARDEN_ADMIN_EMAIL=}"
|
|
fi
|
|
if [ -z "${ADMIN_PASS}" ]; then
|
|
PASS_LINE="$(grep -m1 '^KEYWARDEN_ADMIN_PASSWORD=' "${ROOT_DIR}/.env" || true)"
|
|
ADMIN_PASS="${PASS_LINE#KEYWARDEN_ADMIN_PASSWORD=}"
|
|
fi
|
|
fi
|
|
|
|
if [ -z "${BASE_URL}" ]; then
|
|
BASE_URL="https://localhost"
|
|
fi
|
|
if [ -z "${ADMIN_USER}" ]; then
|
|
ADMIN_USER="admin"
|
|
fi
|
|
if [ -z "${ADMIN_EMAIL}" ]; then
|
|
ADMIN_EMAIL="admin@example.com"
|
|
fi
|
|
if [ -z "${ADMIN_PASS}" ]; then
|
|
echo "Missing KEYWARDEN_ADMIN_PASSWORD (env or .env)." >&2
|
|
exit 1
|
|
fi
|
|
if [ -z "${SERVER_ID}" ] && [ -f "${RUN_DIR}/logs/agent-endpoint-status-counts.txt" ]; then
|
|
SERVER_ID="$(
|
|
sed -n 's#.*servers/\([0-9][0-9]*\)/.*#\1#p' "${RUN_DIR}/logs/agent-endpoint-status-counts.txt" \
|
|
| head -n 1
|
|
)"
|
|
fi
|
|
|
|
CONTAINER_TOOL_DIR="/tmp/keywarden-evidence-tools"
|
|
CONTAINER_OUT_DIR="/app/.evidence-screens/${RUN_ID}"
|
|
HOST_TMP_OUT_DIR="${ROOT_DIR}/app/.evidence-screens/${RUN_ID}"
|
|
HOST_FINAL_OUT_DIR="${RUN_DIR}/screenshots"
|
|
|
|
docker compose exec -T \
|
|
-e KEYWARDEN_SCREENSHOT_BASE_URL="${BASE_URL}" \
|
|
-e KEYWARDEN_ADMIN_USERNAME="${ADMIN_USER}" \
|
|
-e KEYWARDEN_ADMIN_EMAIL="${ADMIN_EMAIL}" \
|
|
-e KEYWARDEN_ADMIN_PASSWORD="${ADMIN_PASS}" \
|
|
-e KEYWARDEN_SCREENSHOT_SERVER_ID="${SERVER_ID}" \
|
|
keywarden sh -lc "
|
|
set -eu
|
|
mkdir -p '${CONTAINER_TOOL_DIR}' '${CONTAINER_OUT_DIR}'
|
|
if [ ! -f '${CONTAINER_TOOL_DIR}/package.json' ]; then
|
|
cd '${CONTAINER_TOOL_DIR}'
|
|
npm init -y >/dev/null 2>&1
|
|
npm pkg set private=true >/dev/null 2>&1
|
|
npm pkg set type=module >/dev/null 2>&1
|
|
fi
|
|
if [ ! -d '${CONTAINER_TOOL_DIR}/node_modules/playwright' ]; then
|
|
cd '${CONTAINER_TOOL_DIR}'
|
|
npm install --silent playwright@1.53.0
|
|
fi
|
|
ln -sfn '${CONTAINER_TOOL_DIR}/node_modules' /app/scripts/node_modules
|
|
cd '${CONTAINER_TOOL_DIR}'
|
|
if [ ! -f '${CONTAINER_TOOL_DIR}/.deps-ok' ]; then
|
|
if ! npx playwright install-deps chromium >/dev/null 2>&1; then
|
|
apt-get update >/dev/null
|
|
apt-get install -y --no-install-recommends \
|
|
libglib2.0-0 \
|
|
libdbus-1-3 \
|
|
libatk1.0-0 \
|
|
libatk-bridge2.0-0 \
|
|
libatspi2.0-0 \
|
|
libcups2 \
|
|
libxcb1 \
|
|
libxkbcommon0 \
|
|
libx11-6 \
|
|
libxcomposite1 \
|
|
libxdamage1 \
|
|
libxext6 \
|
|
libxfixes3 \
|
|
libxrandr2 \
|
|
libgbm1 \
|
|
libcairo2 \
|
|
libpango-1.0-0 \
|
|
libasound2 >/dev/null
|
|
fi
|
|
touch '${CONTAINER_TOOL_DIR}/.deps-ok'
|
|
fi
|
|
npx playwright install chromium >/dev/null
|
|
cd /app
|
|
python manage.py shell -c \"import os; from django.contrib.auth import get_user_model; U=get_user_model(); username=os.environ['KEYWARDEN_ADMIN_USERNAME']; email=os.environ.get('KEYWARDEN_ADMIN_EMAIL','admin@example.com'); password=os.environ['KEYWARDEN_ADMIN_PASSWORD']; user, created = U.objects.get_or_create(username=username, defaults={'email': email}); user.email = ((user.email or email) if created else user.email); user.is_active=True; user.is_staff=True; user.is_superuser=True; user.set_password(password); user.save(); print('ensured-screenshot-admin', user.username, 'created=' + str(created))\"
|
|
node /app/scripts/capture_ui_screenshots.mjs '${CONTAINER_OUT_DIR}'
|
|
"
|
|
|
|
rm -rf "${HOST_FINAL_OUT_DIR}"
|
|
mkdir -p "${HOST_FINAL_OUT_DIR}"
|
|
cp -R "${HOST_TMP_OUT_DIR}/." "${HOST_FINAL_OUT_DIR}/"
|
|
ls -1 "${HOST_FINAL_OUT_DIR}" > "${HOST_FINAL_OUT_DIR}/listing.txt"
|
|
|
|
echo "Screenshots captured for run ${RUN_ID}: ${HOST_FINAL_OUT_DIR}"
|