caudal/programa/simulacro_usb_nuevo.sh
2026-10-13 08:01:06 -05:00

63 lines
3.1 KiB
Bash

#!/bin/bash
# simulacro_usb_nuevo.sh — Ensaya montar la cartera en un USB nuevo, sin tocar este.
#
# bash programa/simulacro_usb_nuevo.sh
#
# En una carpeta temporal: descarga el programa del servidor git, crea un entorno de
# Python desde cero (sin wheels/, como en un USB nuevo), pasa las pruebas y
# recupera tus datos de la copia cifrada (llave de seguridad). Al final compara lo
# recuperado con los datos de este USB. Solo muestra recuentos; la carpeta
# temporal se borra al terminar, pase lo que pase.
cd "$(dirname "$0")" || exit 1
PROGRAMA=$PWD
pausa() { read -r -p "Pulsa Enter para cerrar..."; }
URL=$(git -C .. remote get-url origin 2>/dev/null)
if [ -z "$URL" ]; then
echo "✗ Esta carpeta no está enlazada con el servidor git (no hay «origin»)."
pausa; exit 1
fi
# Como en actualizar_app.sh: con doble clic se usa el agente SSH de la llave de seguridad
if command -v gpgconf >/dev/null; then
socket=$(gpgconf --list-dirs agent-ssh-socket 2>/dev/null)
if [ -n "$socket" ] && SSH_AUTH_SOCK="$socket" ssh-add -L >/dev/null 2>&1; then
export SSH_AUTH_SOCK="$socket"
fi
fi
command -v gpg-connect-agent >/dev/null && gpg-connect-agent updatestartuptty /bye >/dev/null 2>&1
tmp=$(mktemp -d /tmp/cartera-simulacro.XXXXXX)
trap 'rm -rf "$tmp"' EXIT
fallo() { echo "✗ $1"; echo "Simulacro NO superado."; pausa; exit 1; }
echo "1/4 Descargando el programa del servidor git… (toca la llave de seguridad si parpadea)"
git clone --quiet --branch main "$URL" "$tmp/usb" || fallo "No se pudo descargar el programa."
echo " ✓ versión $(git -C "$tmp/usb" log -1 --format='%h del %ad' --date=short)"
echo "2/4 Creando el entorno de Python desde cero (sin wheels/, descarga de internet)…"
CARTERA_VENV="$tmp/venv" bash "$tmp/usb/programa/entorno_python.sh" || fallo "No se pudo preparar Python."
echo "3/4 Pasando las pruebas del programa…"
(cd "$tmp/usb/programa" && "$tmp/venv/bin/python" -m unittest discover -s pruebas >"$tmp/pruebas.log" 2>&1) \
|| { tail -20 "$tmp/pruebas.log"; fallo "Las pruebas fallan."; }
echo " ✓ $(grep -o 'Ran [0-9]* tests' "$tmp/pruebas.log")"
echo "4/4 Recuperando tus datos de la copia cifrada (llave de seguridad: toque y quizá PIN)…"
(cd "$tmp/usb/programa" && "$tmp/venv/bin/python" -m cartera.restaurar --datos "$tmp/usb/programa/datos") \
|| fallo "No se pudieron recuperar los datos."
if [ -f "$PROGRAMA/datos/activos.jsonl" ]; then
(cd "$tmp/usb/programa" && "$tmp/venv/bin/python" -c "
import sys
from pathlib import Path
from cartera.datos import leer
from cartera.restaurar import diferencias
n = diferencias(leer(Path(sys.argv[1])), leer(Path(sys.argv[2])))
print(' ✓ Idénticos a los de este USB.' if n == 0 else
f' ⚠ Difieren en {n} registro(s) de este USB: normal si no has sincronizado desde el último cambio.')
" "$tmp/usb/programa/datos" "$PROGRAMA/datos") || fallo "No se pudieron comparar."
fi
echo
echo "✓ Simulacro superado: con un USB vacío, el servidor git y la llave de seguridad recuperas programa y datos."
echo " (La carpeta temporal se borra ahora; este USB no se ha tocado.)"
pausa