gioser

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…

TOML 1181Shell 82Rust 62Markdown 521515 Definiciones

⎇ 943ea3aac617d65a1f752fe0efde4d6d17210f68 scripts/fs-label-test.sh Shell · 76 líneas · 4.2 KB Historia crudo

feat(instalador): la etiqueta sin e2fsprogs, que es lo que le faltaba a adoptar para arrancar f1e662831 · sergio ·

1#!/bin/sh
2# fs-label-test.sh — `takana fs-label` contra un ext4 DE VERDAD.
3#
4# ── POR QUÉ NO ALCANZAN LOS TESTS DE UNIDAD ────────────────────────────────────────────────────
5# Los de `fs_label.rs` trabajan sobre un superbloque sintético, y por eso no traían `metadata_csum`
6# — el flag que obliga a recalcular el crc32c. Con el cálculo mal, esos tests seguían verdes y
7# `e2fsck` decía «Superblock checksum does not match» sobre un filesystem perfecto. Medido el
8# 2026-10-02: el error era el complemento final del crc, que la convención de «crc32c de una
9# cadena» lleva y ext4 no.
10#
11# Acá se arma un ext4 real, se le cambia la etiqueta y se le pregunta a `e2fsck`. Es la única forma
12# de saber que el checksum quedó bien, porque el único que lo valida es quien lo valida de verdad.
13#
14#   sh scripts/fs-label-test.sh
15set -eu
16ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
17for h in mke2fs e2fsck dumpe2fs; do
18    command -v "$h" >/dev/null 2>&1 || { echo "falta $h (e2fsprogs): no puedo probar esto" >&2; exit 2; }
19done
20TAKANA="${TAKANA:-$ROOT/target/release/takana}"
21[ -x "$TAKANA" ] || TAKANA="$ROOT/target/debug/takana"
22[ -x "$TAKANA" ] || { echo "no hay binario takana (cargo build -p takana-cli)" >&2; exit 2; }
23
24T="${TMPDIR:-/var/tmp}/fs-label-test.$$"; rm -rf "$T"; mkdir -p "$T/arbol/etc"
25trap 'rm -rf "$T"' EXIT
26echo contenido > "$T/arbol/etc/algo"
27OK=0; MAL=0
28ok()  { OK=$((OK+1));  printf '  ✓ %s\n' "$1"; }
29mal() { MAL=$((MAL+1)); printf '  ✗ %s\n' "$1"; }
30
31armar() { rm -f "$T/fs.img"; truncate -s 64M "$T/fs.img"
32          mke2fs -q -t ext4 -L "antes" -d "$T/arbol" "$T/fs.img"; }
33# ⚠ El rótulo es «Filesystem volume name», no «Volume name»: con el patrón corto el lector devolvía
34# vacío SIEMPRE y el banco acusaba al código por no haber sabido mirar. Por eso el caso 3 empieza
35# leyendo la etiqueta vieja — si el lector no la ve, el que está roto es el lector.
36etiqueta() { dumpe2fs -h "$T/fs.img" 2>/dev/null | sed -n 's/^Filesystem volume name: *//p'; }
37fsck_limpio() { e2fsck -fn "$T/fs.img" 2>&1 | grep -qi "checksum does not match" && return 1 || return 0; }
38
39echo "== 1. el ext4 de prueba trae metadata_csum (si no, este banco no prueba nada) =="
40armar
41if dumpe2fs -h "$T/fs.img" 2>/dev/null | grep -q "metadata_csum"; then
42    ok "trae metadata_csum: el checksum del superbloque está en juego"
43else
44    mal "este mke2fs NO pone metadata_csum: el banco no puede ver el defecto que busca"
45fi
46
47echo "== 2. el brazo de control: antes de tocar nada, e2fsck está contento =="
48fsck_limpio && ok "el filesystem recién hecho pasa e2fsck" || mal "ya venía roto: el banco no sirve"
49
50echo "== 3. la etiqueta se cambia =="
51# El control del instrumento, antes de usarlo: si no sabe leer la etiqueta que mke2fs acaba de
52# poner, cualquier veredicto suyo sobre la nueva no significa nada.
53[ "$(etiqueta)" = "antes" ] && ok "control: el lector ve la etiqueta que puso mke2fs" \
54    || mal "control: el lector NO ve la etiqueta original (leyó «$(etiqueta)»): el banco es ciego"
55"$TAKANA" fs-label "$T/fs.img" hammer-root >/dev/null
56[ "$(etiqueta)" = "hammer-root" ] && ok "dumpe2fs lee «hammer-root»" || mal "la etiqueta quedó en «$(etiqueta)»"
57
58echo "== 4. y el superbloque SIGUE VÁLIDO =="
59# Ésta es la comprobación entera. Sin ella, el banco diría que todo anda con un filesystem que el
60# kernel monta de sólo lectura.
61fsck_limpio && ok "e2fsck no se queja del checksum" \
62    || mal "e2fsck: $(e2fsck -fn "$T/fs.img" 2>&1 | grep -i checksum | head -1)"
63
64echo "== 5. los datos no se tocaron =="
65debugfs -R "ls /etc" "$T/fs.img" 2>/dev/null | grep -q algo \
66    && ok "el contenido sigue ahí" || mal "se perdió el contenido"
67
68echo "== 6. donde no hay superbloque, no se escribe =="
69rm -f "$T/basura.img"; head -c 4096 /dev/zero > "$T/basura.img"
70ANTES=$(sha256sum "$T/basura.img" | cut -d' ' -f1)
71"$TAKANA" fs-label "$T/basura.img" hammer-root >/dev/null 2>&1 && mal "aceptó un fichero sin ext" || ok "rechaza lo que no es ext"
72[ "$(sha256sum "$T/basura.img" | cut -d' ' -f1)" = "$ANTES" ] && ok "y no lo tocó" || mal "escribió igual"
73
74echo
75printf '%d bien · %d mal\n' "$OK" "$MAL"
76[ "$MAL" = "0" ] || exit 1