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