mirror of https://github.com/interlegis/sapl.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
4.2 KiB
138 lines
4.2 KiB
#!/usr/bin/env bash
|
|
#
|
|
# Starts the two processes needed for manual end-to-end verification of the
|
|
# painel (branch feat/painel-websockets): Redis, and a single Daphne process
|
|
# serving sapl.asgi:application — which routes both regular HTTP (page
|
|
# renders, the views that call broadcast_dados_painel()) and
|
|
# /ws/painel/<sessao_id>/ on the SAME port.
|
|
#
|
|
# This used to run Daphne and `manage.py runserver` on two separate ports.
|
|
# That doesn't work anymore: every screen this branch ships (the public
|
|
# painel, voto individual, votação nominal, and the Vue v2 pages) connects
|
|
# its WebSocket to `window.location.host` — the same host:port the page was
|
|
# loaded from — and none of them fall back to HTTP polling if that socket
|
|
# never connects. Two ports means the WS connection from a page loaded off
|
|
# the runserver port always fails, silently, with no way to notice.
|
|
#
|
|
# See sapl/sessao/README.md for what to actually click through once this is
|
|
# running, and for the daphne-vs-runserver tradeoff during regular dev.
|
|
#
|
|
# Usage: scripts/verify_painel_websockets.sh
|
|
# Stop everything with Ctrl+C.
|
|
#
|
|
# Ports are overridable via env vars if you need to avoid a clash:
|
|
# REDIS_PORT=6380 APP_PORT=8102 scripts/verify_painel_websockets.sh
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
|
|
REDIS_PORT="${REDIS_PORT:-6379}"
|
|
APP_PORT="${APP_PORT:-8002}"
|
|
REDIS_URL="redis://127.0.0.1:${REDIS_PORT}/0"
|
|
|
|
LOG_DIR="$(mktemp -d /tmp/painel-ws-verify.XXXXXX)"
|
|
REDIS_LOG="$LOG_DIR/redis.log"
|
|
APP_LOG="$LOG_DIR/daphne.log"
|
|
|
|
REDIS_PID=""
|
|
APP_PID=""
|
|
TAIL_PID=""
|
|
|
|
log() { echo -e "\033[36m[verify]\033[0m $*"; }
|
|
err() { echo -e "\033[31m[verify]\033[0m $*" >&2; }
|
|
|
|
port_in_use() {
|
|
lsof -nP -iTCP:"$1" -sTCP:LISTEN >/dev/null 2>&1
|
|
}
|
|
|
|
require_cmd() {
|
|
if ! command -v "$1" >/dev/null 2>&1; then
|
|
err "'$1' not found on PATH. Activate the project's virtualenv first."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
require_port_free() {
|
|
local port="$1" label="$2"
|
|
if port_in_use "$port"; then
|
|
err "Port $port is already in use (needed for $label)."
|
|
err "Find what's on it: lsof -nP -iTCP:$port -sTCP:LISTEN"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
wait_for_tcp() {
|
|
local port="$1" label="$2" timeout="${3:-15}" waited=0
|
|
while ! port_in_use "$port"; do
|
|
sleep 0.5
|
|
waited=$((waited + 1))
|
|
if (( waited >= timeout * 2 )); then
|
|
err "$label did not start listening on port $port within ${timeout}s."
|
|
err "Check the logs in $LOG_DIR"
|
|
cleanup
|
|
exit 1
|
|
fi
|
|
done
|
|
}
|
|
|
|
cleanup() {
|
|
trap - EXIT INT TERM
|
|
log "Stopping..."
|
|
[[ -n "$TAIL_PID" ]] && kill "$TAIL_PID" 2>/dev/null || true
|
|
[[ -n "$APP_PID" ]] && kill "$APP_PID" 2>/dev/null || true
|
|
[[ -n "$REDIS_PID" ]] && kill "$REDIS_PID" 2>/dev/null || true
|
|
wait 2>/dev/null || true
|
|
log "Stopped. Logs kept at $LOG_DIR"
|
|
}
|
|
trap cleanup EXIT INT TERM
|
|
|
|
require_cmd lsof
|
|
require_cmd redis-server
|
|
require_cmd redis-cli
|
|
require_cmd daphne
|
|
|
|
require_port_free "$REDIS_PORT" redis-server
|
|
require_port_free "$APP_PORT" daphne
|
|
|
|
log "Logs: $LOG_DIR"
|
|
|
|
log "Starting redis-server on port $REDIS_PORT..."
|
|
redis-server --port "$REDIS_PORT" --save "" --appendonly no >"$REDIS_LOG" 2>&1 &
|
|
REDIS_PID=$!
|
|
wait_for_tcp "$REDIS_PORT" redis-server
|
|
redis-cli -p "$REDIS_PORT" ping >/dev/null 2>&1 || {
|
|
err "redis-server started but is not responding to PING — check $REDIS_LOG"
|
|
exit 1
|
|
}
|
|
log "redis-server ready (pid $REDIS_PID)."
|
|
|
|
log "Starting daphne (HTTP + WebSocket, one process) on 127.0.0.1:$APP_PORT ..."
|
|
(
|
|
cd "$PROJECT_DIR"
|
|
REDIS_URL="$REDIS_URL" exec daphne -b 127.0.0.1 -p "$APP_PORT" sapl.asgi:application
|
|
) >"$APP_LOG" 2>&1 &
|
|
APP_PID=$!
|
|
wait_for_tcp "$APP_PORT" daphne
|
|
log "daphne ready (pid $APP_PID)."
|
|
|
|
cat <<EOF
|
|
|
|
$(printf '\033[32mBoth processes are up.\033[0m')
|
|
|
|
App (HTTP pages + WebSocket, same port): http://127.0.0.1:$APP_PORT/
|
|
Redis: 127.0.0.1:$REDIS_PORT
|
|
|
|
See sapl/sessao/README.md for what to click through and test accounts/data.
|
|
There's no HTTP-polling fallback on any of these screens — if a page never
|
|
updates, check this terminal's daphne log for a WebSocket close/error first.
|
|
|
|
Press Ctrl+C to stop both.
|
|
|
|
EOF
|
|
|
|
log "Tailing logs (Ctrl+C to stop everything)..."
|
|
tail -n +1 -f "$REDIS_LOG" "$APP_LOG" &
|
|
TAIL_PID=$!
|
|
wait "$TAIL_PID"
|
|
|