#!/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