#!/usr/bin/env bash # delete-full.sh — pipeline completo para eliminar un agente o robot # # Revierte todo lo que create-full.sh genera: # 1. VALIDATE → verificar que el agente existe # 2. STOP → detener el proceso si esta corriendo # 3. DEACTIVATE → desactivar usuario Matrix (Synapse admin API) # 4. REMOVE IMPORT → eliminar blank import del launcher # 5. REMOVE ENV VARS → eliminar las 4 env vars del .env # 6. DELETE FILES → borrar directorio del agente + runtime files # 7. REBUILD → recompilar el launcher # # Uso: # ./dev-scripts/agent/delete-full.sh # con confirmacion # ./dev-scripts/agent/delete-full.sh --force # sin confirmacion # ./dev-scripts/agent/delete-full.sh --keep-matrix # preserva usuario Matrix # ./dev-scripts/agent/delete-full.sh --force --keep-matrix # # Requiere en .env: # MATRIX_ADMIN_TOKEN, MATRIX_HOMESERVER, MATRIX_SERVER_NAME (para desactivar Matrix) source "$(dirname "$0")/../_common.sh" load_env need_arg "${1:-}" ID="$1" NORM="$(normalize_id "$ID")" SCRIPT_DIR="$(dirname "$0")" FORCE=false KEEP_MATRIX=false # Parse flags shift while [[ $# -gt 0 ]]; do case "$1" in --force|-f) FORCE=true shift ;; --keep-matrix) KEEP_MATRIX=true shift ;; *) warn "Flag desconocido: $1" shift ;; esac done TOTAL_STEPS=7 echo "" echo -e "${RED}═══════════════════════════════════════════════════════${RST}" echo -e "${RED} Eliminando agente: ${GRN}$ID${RST}" echo -e "${RED}═══════════════════════════════════════════════════════${RST}" echo "" # ── Paso 1: Validar existencia ────────────────────────────────────────────── info "Paso 1/${TOTAL_STEPS} — Validando existencia..." AGENT_DIR="" CFG_PATH="" # Buscar en agents/ y agents/_specials/ if [[ -d "agents/$ID" ]]; then AGENT_DIR="agents/$ID" CFG_PATH="agents/$ID/config.yaml" elif [[ -d "agents/_specials/$ID" ]]; then AGENT_DIR="agents/_specials/$ID" CFG_PATH="agents/_specials/$ID/config.yaml" else fail "Agente '$ID' no encontrado en agents/ ni agents/_specials/" fi # Leer info del agente para mostrar al usuario AGENT_DESC="" AGENT_TYPE="agent" if [[ -f "$CFG_PATH" ]]; then AGENT_DESC=$(grep -m1 'description:' "$CFG_PATH" | cut -d'"' -f2) TYPE_LINE=$(grep -m1 'type:' "$CFG_PATH" | awk '{print $2}') [[ -n "$TYPE_LINE" ]] && AGENT_TYPE="$TYPE_LINE" fi ok "Agente $ID encontrado en $AGENT_DIR/" dim " Tipo: $AGENT_TYPE" [[ -n "$AGENT_DESC" ]] && dim " Descripcion: $AGENT_DESC" echo "" # ── Confirmacion interactiva ──────────────────────────────────────────────── if [[ "$FORCE" != true ]]; then echo -e "${YLW}ATENCION: Esta accion es irreversible.${RST}" echo -e "Se eliminaran:" echo -e " - Directorio ${AGENT_DIR}/ (codigo, config, datos, crypto)" if [[ "$KEEP_MATRIX" != true ]]; then echo -e " - Usuario Matrix @${ID}:${MATRIX_SERVER_NAME:-}" fi echo -e " - Variables de entorno en .env" echo -e " - Import en cmd/launcher/main.go" echo "" read -rp "Escribir '$ID' para confirmar: " CONFIRM if [[ "$CONFIRM" != "$ID" ]]; then fail "Eliminacion cancelada" fi echo "" fi # ── Paso 2: Detener proceso ───────────────────────────────────────────────── info "Paso 2/${TOTAL_STEPS} — Deteniendo proceso..." PIDS="$(find_agent_pids "$ID")" if [[ -n "$PIDS" ]]; then echo "$PIDS" | while read -r pid; do kill "$pid" 2>/dev/null && ok "Proceso $pid detenido" || warn "No se pudo detener proceso $pid" done # Esperar a que terminen sleep 1 else dim " No hay procesos corriendo para $ID" fi # Limpiar PID file rm -f "$(pid_file "$ID")" 2>/dev/null echo "" # ── Paso 3: Desactivar usuario Matrix ─────────────────────────────────────── info "Paso 3/${TOTAL_STEPS} — Desactivando usuario Matrix..." if [[ "$KEEP_MATRIX" == true ]]; then dim " --keep-matrix: usuario Matrix preservado" else if [[ -n "${MATRIX_ADMIN_TOKEN:-}" && -n "${MATRIX_HOMESERVER:-}" && -n "${MATRIX_SERVER_NAME:-}" ]]; then "$SCRIPT_DIR/deactivate-matrix.sh" "$ID" || warn "No se pudo desactivar usuario Matrix (continuando)" else warn "Faltan variables de Matrix en .env — usuario no desactivado" fi fi echo "" # ── Paso 4: Eliminar import del launcher ──────────────────────────────────── info "Paso 4/${TOTAL_STEPS} — Eliminando import del launcher..." "$SCRIPT_DIR/remove-launcher-import.sh" "$ID" echo "" # ── Paso 5: Eliminar variables de entorno ──────────────────────────────────── info "Paso 5/${TOTAL_STEPS} — Eliminando variables de entorno..." "$SCRIPT_DIR/remove-env-vars.sh" "$ID" echo "" # ── Paso 6: Eliminar archivos ─────────────────────────────────────────────── info "Paso 6/${TOTAL_STEPS} — Eliminando archivos..." # Directorio del agente if [[ -d "$AGENT_DIR" ]]; then rm -rf "$AGENT_DIR" ok "$AGENT_DIR/ eliminado" fi # Runtime files for f in "run/${ID}.pid" "run/${ID}.log"; do if [[ -f "$f" ]]; then rm -f "$f" ok "$f eliminado" fi done # Log directory if [[ -d "logs/$ID" ]]; then rm -rf "logs/$ID" ok "logs/$ID/ eliminado" fi echo "" # ── Paso 7: Recompilar ───────────────────────────────────────────────────── info "Paso 7/${TOTAL_STEPS} — Recompilando..." if $GO build -tags goolm ./... 2>&1; then ok "Compilacion exitosa" else fail "Error de compilacion — revisa cmd/launcher/main.go manualmente" fi echo "" # ── Resumen ───────────────────────────────────────────────────────────────── echo -e "${GRN}═══════════════════════════════════════════════════════${RST}" echo -e "${GRN} ✓ Agente $ID eliminado completamente${RST}" echo -e "${GRN}═══════════════════════════════════════════════════════${RST}" echo "" echo -e " ${BLU}Eliminado:${RST}" echo -e " $AGENT_DIR/" echo -e " cmd/launcher/main.go (import)" echo -e " .env (MATRIX_TOKEN_${NORM}, MATRIX_PASSWORD_${NORM}, PICKLE_KEY_${NORM}, SSSS_RECOVERY_KEY_${NORM})" if [[ "$KEEP_MATRIX" != true ]]; then echo -e " @${ID}:${MATRIX_SERVER_NAME:-} (usuario Matrix desactivado)" else echo -e " ${YLW}Usuario Matrix preservado (--keep-matrix)${RST}" fi echo ""