94 lines
3.0 KiB
Bash
94 lines
3.0 KiB
Bash
#!/usr/bin/env bash
|
|
# bitwarden skill — asegura que `bw serve` esté corriendo.
|
|
#
|
|
# Idempotente:
|
|
# - Si serve responde en localhost:$BW_PORT/status → no hace nada
|
|
# - Si no, mata cualquier proceso huérfano y relanza
|
|
# - Si no hay session válida, llama a setup.sh para re-unlock
|
|
#
|
|
# Output: solo en caso de error o cuando arranca el daemon (silent en happy path).
|
|
|
|
set -euo pipefail
|
|
|
|
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
ENV_FILE="$SKILL_DIR/.env"
|
|
CACHE_DIR="$SKILL_DIR/.cache"
|
|
SESSION_FILE="$CACHE_DIR/session"
|
|
PID_FILE="$CACHE_DIR/serve.pid"
|
|
LOG_FILE="$CACHE_DIR/serve.log"
|
|
BW_DATA_DIR="$CACHE_DIR/bw"
|
|
|
|
if [[ ! -f "$ENV_FILE" ]]; then
|
|
echo "ERROR: $ENV_FILE no existe." >&2
|
|
exit 1
|
|
fi
|
|
|
|
set -a
|
|
# shellcheck disable=SC1090
|
|
source "$ENV_FILE"
|
|
set +a
|
|
|
|
PORT="${BW_PORT:-8087}"
|
|
HOST="127.0.0.1"
|
|
BASE="http://${HOST}:${PORT}"
|
|
|
|
export BITWARDENCLI_APPDATA_DIR="$BW_DATA_DIR"
|
|
|
|
# ─── 1. ¿Ya está corriendo y responde? ───────────────────────────────────
|
|
if curl -sS -m 2 -o /dev/null -w "%{http_code}" "${BASE}/status" 2>/dev/null | grep -q "200"; then
|
|
exit 0
|
|
fi
|
|
|
|
# ─── 2. Limpiar PID huérfano si existe ──────────────────────────────────
|
|
if [[ -f "$PID_FILE" ]]; then
|
|
old_pid="$(cat "$PID_FILE")"
|
|
if [[ -n "$old_pid" ]] && kill -0 "$old_pid" 2>/dev/null; then
|
|
# El PID vive pero no respondía: matarlo
|
|
kill "$old_pid" 2>/dev/null || true
|
|
sleep 1
|
|
kill -9 "$old_pid" 2>/dev/null || true
|
|
fi
|
|
rm -f "$PID_FILE"
|
|
fi
|
|
|
|
# ─── 3. Asegurar session válida ─────────────────────────────────────────
|
|
if [[ ! -s "$SESSION_FILE" ]]; then
|
|
echo "→ No hay session, corriendo setup.sh..." >&2
|
|
bash "$SKILL_DIR/scripts/setup.sh" >&2
|
|
fi
|
|
|
|
session="$(cat "$SESSION_FILE")"
|
|
if [[ -z "$session" ]]; then
|
|
echo "ERROR: session vacía después de setup. Revisá .env." >&2
|
|
exit 2
|
|
fi
|
|
|
|
# ─── 4. Lanzar bw serve en background ───────────────────────────────────
|
|
echo "→ Lanzando bw serve en ${BASE}..." >&2
|
|
|
|
mkdir -p "$CACHE_DIR"
|
|
: > "$LOG_FILE"
|
|
|
|
# nohup + disown para que sobreviva el exit del script
|
|
BW_SESSION="$session" \
|
|
nohup bw serve --hostname "$HOST" --port "$PORT" \
|
|
> "$LOG_FILE" 2>&1 &
|
|
serve_pid=$!
|
|
echo "$serve_pid" > "$PID_FILE"
|
|
chmod 600 "$PID_FILE" 2>/dev/null || true
|
|
disown 2>/dev/null || true
|
|
|
|
# ─── 5. Esperar a que responda ──────────────────────────────────────────
|
|
for i in 1 2 3 4 5 6 7 8 9 10; do
|
|
if curl -sS -m 2 -o /dev/null -w "%{http_code}" "${BASE}/status" 2>/dev/null | grep -q "200"; then
|
|
echo "→ Listo en ${BASE} (PID $serve_pid)" >&2
|
|
exit 0
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
# Si llegamos acá, algo falló
|
|
echo "ERROR: bw serve no respondió en 10s. Logs:" >&2
|
|
tail -20 "$LOG_FILE" >&2
|
|
exit 3
|