Files
skill-bitwarden/scripts/serve-up.sh

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