tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

⎇ main scripts/adoptar-test.sh Shell · 103 líneas · 6.4 KB Historia crudo

feat(instalador): adoptar la particion en vez de formatearla, con la mudanza de verdad 4b1f19d8d · sergio ·

1#!/bin/sh
2# adoptar-test.sh — la mudanza del sistema anterior, certificada SIN root y sin un disco.
3#
4# ── QUÉ PRUEBA, Y POR QUÉ ASÍ ──────────────────────────────────────────────────────────────────
5# Adoptar es la operación que decide si alguien pierde su /home, así que lo que se comprueba no es
6# lo que imprime sino lo que QUEDA en el árbol: qué se movió, qué no se movió, y que nada se borró.
7# Corre sobre directorios y por eso no necesita losetup, mount ni root — un mecanismo que sólo se
8# puede probar con el hardware delante es un mecanismo que no se prueba.
9#
10# Lo que este banco NO cubre, y se dice para que nadie lo lea como «adoptar está probado entero»:
11# montar un ext4 de verdad y ponerle la etiqueta con `e2label`. Eso vive en el banco con root
12# (`install-particion-test.sh`) y en metal.
13set -eu
14ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
15T="${T:-work/.adoptar-test}"; rm -rf "$T"; mkdir -p "$T"
16es_bloque() { [ -b "$1" ]; }
17. scripts/lib/usuarios-del-home.sh
18. scripts/lib/adoptar.sh
19
20OK=0; MAL=0
21ok()  { OK=$((OK+1));  printf '  ✓ %s\n' "$1"; }
22mal() { MAL=$((MAL+1)); printf '  ✗ %s\n' "$1"; }
23comprobar() { if [ "$2" = "$3" ]; then ok "$1"; else mal "$1 (esperaba «$3», salió «$2»)"; fi; }
24
25# Un sistema de mentira con un /home adentro, que es el caso del que trata todo esto.
26sistema() {
27    _s="$1"; rm -rf "$_s"; mkdir -p "$_s"/etc "$_s"/usr/bin "$_s"/var/log "$_s"/home/sergio "$_s"/lost+found
28    echo "viejo" > "$_s/etc/os-release"
29    echo "un programa" > "$_s/usr/bin/algo"
30    echo "la foto de la abuela" > "$_s/home/sergio/foto.jpg"
31    mkdir -p "$_s/home/sergio/.config/app"; echo "cfg" > "$_s/home/sergio/.config/app/x.conf"
32}
33# Y el árbol del sistema nuevo que se va a instalar encima.
34arbol_nuevo() {
35    _a="$1"; rm -rf "$_a"; mkdir -p "$_a"/etc "$_a"/usr/bin "$_a"/home
36    echo "nuevo" > "$_a/etc/os-release"
37    echo "etc/passwd" > "$_a/etc/passwd"; : > "$_a/etc/group"
38}
39
40echo "== 1. una partición con un sistema y un /home adentro se adopta =="
41DEST="$T/caso1"; sistema "$DEST"; arbol_nuevo "$T/arbol1"
42USE_FREE=""; ADOPT=1
43adopt_validar >/dev/null
44comprobar "el subdirectorio es /sistema-anterior" "$ADOPT_SUB" "sistema-anterior"
45case " $ADOPT_MUEVE " in *" etc "*) ok "etc se mueve" ;; *) mal "etc tendría que moverse" ;; esac
46case " $ADOPT_MUEVE " in *" home "*) mal "/home NO se mueve: es el punto entero" ;; *) ok "/home no se mueve" ;; esac
47case " $ADOPT_MUEVE " in *" lost+found "*) mal "lost+found no se mueve" ;; *) ok "lost+found no se mueve" ;; esac
48comprobar "cosechó al usuario del /home de adentro" "$(cut -d: -f1 "$ADOPT_USUARIOS" | tr '\n' ' ')" "sergio "
49adopt_mudar "$T/arbol1" >/dev/null
50comprobar "la foto sigue donde estaba" "$(cat "$DEST/home/sergio/foto.jpg")" "la foto de la abuela"
51comprobar "los dotfiles viajan con el /home" "$(cat "$DEST/home/sergio/.config/app/x.conf")" "cfg"
52comprobar "el sistema viejo está entero un nivel adentro" "$(cat "$DEST/sistema-anterior/etc/os-release")" "viejo"
53comprobar "y su programa también" "$(cat "$DEST/sistema-anterior/usr/bin/algo")" "un programa"
54comprobar "el sistema nuevo quedó en la raíz" "$(cat "$DEST/etc/os-release")" "nuevo"
55[ -f "$DEST/sistema-anterior/MUDANZA.txt" ] && ok "quedó la marca de la mudanza" || mal "falta MUDANZA.txt"
56grep -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"
57
58echo "== 2. adoptar dos veces NO pisa la primera mudanza =="
59ADOPT_SUB=""; ADOPT_MUEVE=""; arbol_nuevo "$T/arbol2"
60adopt_validar >/dev/null
61comprobar "la segunda va a /sistema-anterior-2" "$ADOPT_SUB" "sistema-anterior-2"
62case " $ADOPT_MUEVE " in *" sistema-anterior "*) mal "la mudanza anterior no se vuelve a mover" ;; *) ok "la mudanza anterior se queda donde está" ;; esac
63adopt_mudar "$T/arbol2" >/dev/null
64comprobar "lo de la primera sigue ahí" "$(cat "$DEST/sistema-anterior/etc/os-release")" "viejo"
65comprobar "la foto NO se movió nunca" "$(cat "$DEST/home/sergio/foto.jpg")" "la foto de la abuela"
66
67echo "== 3. lo que no tiene forma de sistema no se adopta =="
68DEST="$T/caso3"; rm -rf "$DEST"; mkdir -p "$DEST/Fotos" "$DEST/Documentos"
69echo "mía" > "$DEST/Fotos/a.jpg"
70if ( 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
71comprobar "y no le tocó nada" "$(cat "$DEST/Fotos/a.jpg")" "mía"
72
73echo "== 4. si el sistema nuevo NO ENTRA, no se mueve nada =="
74DEST="$T/caso4"; sistema "$DEST"; arbol_nuevo "$T/arbol4"
75adopt_validar >/dev/null
76# Un árbol que no entra: se fuerza el `df` a decir que queda poquísimo. La función tapa al binario.
77df() { printf 'Filesystem 1K-blocks Used Available Use%%%% Mounted\n x 100 99 1 99%%%% /\n'; }
78SALIDA=$(adopt_mudar "$T/arbol4" 2>&1) && mal "tendría que abortar por espacio" || ok "aborta por espacio"
79# **Y aborta por LO QUE CREEMOS**, no por otra cosa: un `du` que falta abortaría igual, y el test
80# diría que la guarda del espacio funciona cuando nunca llegó a mirarla.
81case "$SALIDA" in *"no entra"*) ok "y aborta por el espacio, no por otra cosa" ;;
82                  *) mal "abortó por otra razón: $(echo "$SALIDA" | head -1)" ;; esac
83unset -f df
84[ -d "$DEST/etc" ] && ok "etc sigue en la raíz: no se movió nada" || mal "movió algo pese a abortar"
85[ -e "$DEST/sistema-anterior" ] && mal "dejó el subdirectorio a medias" || ok "no dejó nada a medias"
86# El brazo de control de ESTE caso: el mismo árbol, con el `df` de verdad, SÍ entra. Sin esto el
87# verde de arriba también lo daría una guarda que rechaza siempre.
88adopt_mudar "$T/arbol4" >/dev/null && ok "control: con el espacio real, el mismo árbol sí entra" \
89    || mal "control: tendría que entrar y no entró"
90
91echo "== 5. el brazo de control del instrumento: ¿ve lo que tiene que ver? =="
92# Un «está igual que antes» sólo significa algo si el instrumento es capaz de ver una diferencia.
93DEST="$T/caso5"; sistema "$DEST"; arbol_nuevo "$T/arbol5"
94HUELLA() { find "$DEST" | sort | md5sum; }
95ANTES=$(HUELLA)
96comprobar "sin tocar nada, la huella no cambia" "$(HUELLA)" "$ANTES"
97adopt_validar >/dev/null; adopt_mudar "$T/arbol5" >/dev/null
98if [ "$(HUELLA)" = "$ANTES" ]; then mal "la huella NO vio la mudanza: el instrumento es ciego"
99else ok "la huella sí ve una mudanza (el instrumento mide algo)"; fi
100
101echo
102printf '%d bien · %d mal\n' "$OK" "$MAL"
103[ "$MAL" = "0" ] || exit 1