#!/bin/bash # ========================================================== # adn/tools/bkps/cron-bkps.sh — Wrapper cron para backups # ---------------------------------------------------------- # Ejecuta un comando bkps con: # - Lockfile (evita ejecuciones simultáneas) # - Bitácora automática vía dron # - Logging de salida # # Uso en crontab: # 0 2 * * * /ruta/adn/tools/bkps/cron-bkps.sh C4 # 0 3 * * * /ruta/adn/tools/bkps/cron-bkps.sh T3 # # Ejemplo manual: # ./adn/tools/bkps/cron-bkps.sh C4 "Pipeline nocturno C4" # ========================================================== set -euo pipefail # ─── Configuración ───────────────────────────────────────── SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" ADN_RUN="$PROJECT_ROOT/adn/tools/run" LOCK_DIR="$PROJECT_ROOT/tmp/locks" LOG_DIR="$PROJECT_ROOT/tmp/logs/bkps" mkdir -p "$LOCK_DIR" "$LOG_DIR" # ─── Argumentos ──────────────────────────────────────────── REF="${1:-}" NOTA="${2:-Cron: bkps run $REF --batch}" AMBITO="dtic-BKPs" NODO="srv-ns8" if [ -z "$REF" ]; then echo "✗ Uso: cron-bkps.sh [nota]" exit 1 fi # ─── Lockfile ────────────────────────────────────────────── LOCKFILE="$LOCK_DIR/bkps_${REF}.lock" if [ -f "$LOCKFILE" ]; then PID_LOCK=$(cat "$LOCKFILE") if kill -0 "$PID_LOCK" 2>/dev/null; then echo "⚠ bkps $REF ya está corriendo (PID: $PID_LOCK, lock: $LOCKFILE)" exit 0 # No es error, simplemente ya está corriendo else echo "ℹ Lock stale removido (PID $PID_LOCK ya no existe)" rm -f "$LOCKFILE" fi fi echo $$ > "$LOCKFILE" trap 'rm -f "$LOCKFILE"' EXIT # ─── Log ─────────────────────────────────────────────────── FECHA=$(date +%Y-%m-%d) HORA=$(date +%H:%M) LOGFILE="$LOG_DIR/bkps_${REF}_${FECHA}_${HORA//:/}.log" echo "[$(date)] cron-bkps: Iniciando $REF" >> "$LOGFILE" # ─── Bitácora + Ejecución via Dron ────────────────────── # Crear evento EVENTO_ID=$("$ADN_RUN" db evento:crear \ --ambito "$AMBITO" \ --nodo "$NODO" \ --descripcion "$NOTA" \ --inicio "$HORA" \ --modo R --ia 2>&1 | grep -oP 'ID \K\d+' | tail -1) if [ -z "$EVENTO_ID" ]; then echo "[$(date)] cron-bkps: ⚠ No se pudo crear evento, ejecutando sin bitácora" >> "$LOGFILE" "$ADN_RUN" bkps run "$REF" --batch >> "$LOGFILE" 2>&1 EXIT_CODE=$? else echo "[$(date)] cron-bkps: Evento #$EVENTO_ID creado, delegando al dron" >> "$LOGFILE" "$ADN_RUN" dron lanzar \ --evento "$EVENTO_ID" \ --nota "$NOTA" \ -- "$ADN_RUN" bkps run "$REF" --batch >> "$LOGFILE" 2>&1 EXIT_CODE=$? fi echo "[$(date)] cron-bkps: Finalizado con código $EXIT_CODE" >> "$LOGFILE" exit $EXIT_CODE