#!/bin/sh # adoptar-test.sh — la mudanza del sistema anterior, certificada SIN root y sin un disco. # # ── QUÉ PRUEBA, Y POR QUÉ ASÍ ────────────────────────────────────────────────────────────────── # Adoptar es la operación que decide si alguien pierde su /home, así que lo que se comprueba no es # lo que imprime sino lo que QUEDA en el árbol: qué se movió, qué no se movió, y que nada se borró. # Corre sobre directorios y por eso no necesita losetup, mount ni root — un mecanismo que sólo se # puede probar con el hardware delante es un mecanismo que no se prueba. # # Lo que este banco NO cubre, y se dice para que nadie lo lea como «adoptar está probado entero»: # montar un ext4 de verdad y ponerle la etiqueta con `e2label`. Eso vive en el banco con root # (`install-particion-test.sh`) y en metal. set -eu ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT" T="${T:-work/.adoptar-test}"; rm -rf "$T"; mkdir -p "$T" es_bloque() { [ -b "$1" ]; } . scripts/lib/usuarios-del-home.sh . scripts/lib/adoptar.sh OK=0; MAL=0 ok() { OK=$((OK+1)); printf ' ✓ %s\n' "$1"; } mal() { MAL=$((MAL+1)); printf ' ✗ %s\n' "$1"; } comprobar() { if [ "$2" = "$3" ]; then ok "$1"; else mal "$1 (esperaba «$3», salió «$2»)"; fi; } # Un sistema de mentira con un /home adentro, que es el caso del que trata todo esto. sistema() { _s="$1"; rm -rf "$_s"; mkdir -p "$_s"/etc "$_s"/usr/bin "$_s"/var/log "$_s"/home/sergio "$_s"/lost+found echo "viejo" > "$_s/etc/os-release" echo "un programa" > "$_s/usr/bin/algo" echo "la foto de la abuela" > "$_s/home/sergio/foto.jpg" mkdir -p "$_s/home/sergio/.config/app"; echo "cfg" > "$_s/home/sergio/.config/app/x.conf" } # Y el árbol del sistema nuevo que se va a instalar encima. arbol_nuevo() { _a="$1"; rm -rf "$_a"; mkdir -p "$_a"/etc "$_a"/usr/bin "$_a"/home echo "nuevo" > "$_a/etc/os-release" echo "etc/passwd" > "$_a/etc/passwd"; : > "$_a/etc/group" } echo "== 1. una partición con un sistema y un /home adentro se adopta ==" DEST="$T/caso1"; sistema "$DEST"; arbol_nuevo "$T/arbol1" USE_FREE=""; ADOPT=1 adopt_validar >/dev/null comprobar "el subdirectorio es /sistema-anterior" "$ADOPT_SUB" "sistema-anterior" case " $ADOPT_MUEVE " in *" etc "*) ok "etc se mueve" ;; *) mal "etc tendría que moverse" ;; esac case " $ADOPT_MUEVE " in *" home "*) mal "/home NO se mueve: es el punto entero" ;; *) ok "/home no se mueve" ;; esac case " $ADOPT_MUEVE " in *" lost+found "*) mal "lost+found no se mueve" ;; *) ok "lost+found no se mueve" ;; esac comprobar "cosechó al usuario del /home de adentro" "$(cut -d: -f1 "$ADOPT_USUARIOS" | tr '\n' ' ')" "sergio " adopt_mudar "$T/arbol1" >/dev/null comprobar "la foto sigue donde estaba" "$(cat "$DEST/home/sergio/foto.jpg")" "la foto de la abuela" comprobar "los dotfiles viajan con el /home" "$(cat "$DEST/home/sergio/.config/app/x.conf")" "cfg" comprobar "el sistema viejo está entero un nivel adentro" "$(cat "$DEST/sistema-anterior/etc/os-release")" "viejo" comprobar "y su programa también" "$(cat "$DEST/sistema-anterior/usr/bin/algo")" "un programa" comprobar "el sistema nuevo quedó en la raíz" "$(cat "$DEST/etc/os-release")" "nuevo" [ -f "$DEST/sistema-anterior/MUDANZA.txt" ] && ok "quedó la marca de la mudanza" || mal "falta MUDANZA.txt" grep -q "se-quedo-donde-estaba=/home" "$DEST/sistema-anterior/MUDANZA.txt" && ok "la marca dice qué se quedó" || mal "la marca no nombra el /home" echo "== 2. adoptar dos veces NO pisa la primera mudanza ==" ADOPT_SUB=""; ADOPT_MUEVE=""; arbol_nuevo "$T/arbol2" adopt_validar >/dev/null comprobar "la segunda va a /sistema-anterior-2" "$ADOPT_SUB" "sistema-anterior-2" case " $ADOPT_MUEVE " in *" sistema-anterior "*) mal "la mudanza anterior no se vuelve a mover" ;; *) ok "la mudanza anterior se queda donde está" ;; esac adopt_mudar "$T/arbol2" >/dev/null comprobar "lo de la primera sigue ahí" "$(cat "$DEST/sistema-anterior/etc/os-release")" "viejo" comprobar "la foto NO se movió nunca" "$(cat "$DEST/home/sergio/foto.jpg")" "la foto de la abuela" echo "== 3. lo que no tiene forma de sistema no se adopta ==" DEST="$T/caso3"; rm -rf "$DEST"; mkdir -p "$DEST/Fotos" "$DEST/Documentos" echo "mía" > "$DEST/Fotos/a.jpg" if ( adopt_validar >/dev/null 2>&1 ); then mal "un disco de datos no es un sistema que adoptar"; else ok "un disco de datos se rechaza, y se dice"; fi comprobar "y no le tocó nada" "$(cat "$DEST/Fotos/a.jpg")" "mía" echo "== 4. si el sistema nuevo NO ENTRA, no se mueve nada ==" DEST="$T/caso4"; sistema "$DEST"; arbol_nuevo "$T/arbol4" adopt_validar >/dev/null # Un árbol que no entra: se fuerza el `df` a decir que queda poquísimo. La función tapa al binario. df() { printf 'Filesystem 1K-blocks Used Available Use%%%% Mounted\n x 100 99 1 99%%%% /\n'; } SALIDA=$(adopt_mudar "$T/arbol4" 2>&1) && mal "tendría que abortar por espacio" || ok "aborta por espacio" # **Y aborta por LO QUE CREEMOS**, no por otra cosa: un `du` que falta abortaría igual, y el test # diría que la guarda del espacio funciona cuando nunca llegó a mirarla. case "$SALIDA" in *"no entra"*) ok "y aborta por el espacio, no por otra cosa" ;; *) mal "abortó por otra razón: $(echo "$SALIDA" | head -1)" ;; esac unset -f df [ -d "$DEST/etc" ] && ok "etc sigue en la raíz: no se movió nada" || mal "movió algo pese a abortar" [ -e "$DEST/sistema-anterior" ] && mal "dejó el subdirectorio a medias" || ok "no dejó nada a medias" # El brazo de control de ESTE caso: el mismo árbol, con el `df` de verdad, SÍ entra. Sin esto el # verde de arriba también lo daría una guarda que rechaza siempre. adopt_mudar "$T/arbol4" >/dev/null && ok "control: con el espacio real, el mismo árbol sí entra" \ || mal "control: tendría que entrar y no entró" echo "== 5. el brazo de control del instrumento: ¿ve lo que tiene que ver? ==" # Un «está igual que antes» sólo significa algo si el instrumento es capaz de ver una diferencia. DEST="$T/caso5"; sistema "$DEST"; arbol_nuevo "$T/arbol5" HUELLA() { find "$DEST" | sort | md5sum; } ANTES=$(HUELLA) comprobar "sin tocar nada, la huella no cambia" "$(HUELLA)" "$ANTES" adopt_validar >/dev/null; adopt_mudar "$T/arbol5" >/dev/null if [ "$(HUELLA)" = "$ANTES" ]; then mal "la huella NO vio la mudanza: el instrumento es ciego" else ok "la huella sí ve una mudanza (el instrumento mide algo)"; fi echo printf '%d bien · %d mal\n' "$OK" "$MAL" [ "$MAL" = "0" ] || exit 1