250 líneas de comentario en 151 scripts. Control verificado: el diff no toca NI UNA línea que no empiece por #, y la sintaxis de los 151 pasa. El barrido saltea heredocs y cadenas triples, y el guardián DISPARÓ 3 veces: las tres eran el MOTD que el script escribe DENTRO de la imagen construida — texto del producto, no comentario del script. Se cambiaron aparte y a propósito, que es rebranding, no limpieza. Y el hallazgo caro: casaba contra , que es el TARGET de tracing — o sea el module_path!, o sea el nombre del crate. La etapa 4 lo movió a y el script quedó casando NADA. No fallaba: imprimía cero atribuciones, indistinguible de un log sin problemas. Comprobado con el binario (RUST_LOG=info sobre zlib), no deducido. Ahora acepta las dos, y tiene que seguir aceptándolas porque los logs viejos en disco dicen la vieja. Además 14 rutas de módulo en docs, que el barrido anterior no tocó porque no es frontera de palabra.
99 lines
5.8 KiB
Bash
Executable File
99 lines
5.8 KiB
Bash
Executable File
#!/bin/sh
|
|
# Prueba que pressure-vessel —el contenedor con el que Valve corre los juegos— arranca ANIDADO
|
|
# dentro de una instancia qorpa enjaulada. ADR 0015 §Orden 6 / D6.
|
|
#
|
|
# ── POR QUÉ ESTE GUARDIÁN ───────────────────────────────────────────────────────────────────────
|
|
# El paso 6 del ADR quedó PARCIAL con esta frase: «pressure-vessel con un juego real sigue sin
|
|
# ejercitarse», porque el runtime sniper sólo se baja al instalar un juego y eso pide credenciales.
|
|
# Falso techo: el depot está publicado y pineado (`docs/state/qorpa-imagenes.toml`), así que se
|
|
# coloca a mano y **no hace falta cuenta, ni juego, ni pantalla** para responder la pregunta que
|
|
# ordenaba el diseño — ¿nuestra jaula deja anidar la de Valve?
|
|
#
|
|
# ── QUÉ MIDE, Y POR QUÉ ESO Y NO OTRA COSA ──────────────────────────────────────────────────────
|
|
# El veredicto es `/etc/os-release` dentro del contenedor: si dice «Steam Runtime 3 (sniper)», el
|
|
# runtime REAL se montó. NO se mide con `ldd --version`, que es la comprobación que uno escribiría
|
|
# primero y sale mal: pressure-vessel **importa la libc del host cuando es más nueva** que la del
|
|
# runtime, así que ver la glibc de la instancia adentro es lo correcto y no prueba nada.
|
|
#
|
|
# Y mide la contraparte: con `nesting = false` el mismo comando tiene que MORIR. Una concesión que
|
|
# no se puede apagar no es una concesión — sin este segundo tramo, el guardián diría «anida» aunque
|
|
# la jaula no estuviera haciendo nada.
|
|
set -eu
|
|
|
|
QORPA_ROOT="${HAMMER_QORPA_ROOT:-/var/lib/hammer/qorpa}"
|
|
HAMMER="${TAKANA_BIN:-${HAMMER_BIN:-./target/release/takana}}"
|
|
ID="${1:-sniper-probe}"
|
|
|
|
UBUNTU_URL="https://cdimage.ubuntu.com/ubuntu-base/releases/24.04/release/ubuntu-base-24.04.3-base-amd64.tar.gz"
|
|
UBUNTU_SHA="6bc2cde3930ad088b3bb46fa45279e96d25bc3810f209850ecbe4722711874f9"
|
|
DEPOT_URL="https://repo.steampowered.com/steamrt-images-sniper/snapshots/3.0.20260805.254768/SteamLinuxRuntime_sniper.tar.xz"
|
|
DEPOT_SHA="e264f0639ab775338311036f207b35cebe99bc417b016b53931ebca8b30b3d94"
|
|
|
|
export HAMMER_QORPA_ROOT="$QORPA_ROOT"
|
|
echo "== qorpa root: $QORPA_ROOT"
|
|
|
|
# 1. Las dos piezas, por digest. `pull` verifica ANTES de desempacar y es idempotente.
|
|
"$HAMMER" qorpa pull "$UBUNTU_URL" --sha256 "$UBUNTU_SHA" --label ubuntu-base-24.04.3
|
|
# El depot NO es un rootfs (trae `run`, `pressure-vessel/` y la imagen adentro): se trae verificado
|
|
# y sin desempacar. Traerlo a secas FALLA el anclaje por estructura, que es lo que tiene que hacer.
|
|
"$HAMMER" qorpa pull "$DEPOT_URL" --sha256 "$DEPOT_SHA" --label steamlinuxruntime-sniper --verify-only
|
|
|
|
INST="$QORPA_ROOT/instances/$ID"
|
|
if [ ! -f "$INST/instance.toml" ]; then
|
|
"$HAMMER" qorpa create "$ID" --base "$UBUNTU_SHA" --distro ubuntu-24.04
|
|
fi
|
|
|
|
# 2. El depot va al `upper`, que es caché por D3: si esto se pierde, se rehace con este script.
|
|
# `--delay-directory-restore` no es un adorno — sin él, tar sin ser root no puede terminar de
|
|
# llenar un directorio cuyo modo final es de sólo lectura.
|
|
if [ ! -x "$INST/upper/opt/SteamLinuxRuntime_sniper/run" ]; then
|
|
mkdir -p "$INST/upper/opt"
|
|
tar -xf "$QORPA_ROOT/images/$DEPOT_SHA/archive" --delay-directory-restore -C "$INST/upper/opt"
|
|
fi
|
|
|
|
DENTRO='cd /opt/SteamLinuxRuntime_sniper && ./run -- /bin/sh -c "grep ^PRETTY_NAME= /etc/os-release; readlink /proc/self/ns/mnt"'
|
|
LOG=$(mktemp -d)
|
|
trap 'rm -rf "$LOG"' EXIT
|
|
|
|
# ── LA SALIDA VA A FICHERO, NO A `$( )` ─────────────────────────────────────────────────────────
|
|
# MEDIDO acá, y cuesta una hora si no se sabe: `SALIDA=$(timeout … takana qorpa run …)` **se cuelga
|
|
# para siempre** aunque `timeout` mate al hijo. La sustitución de comandos no espera al PROCESO,
|
|
# espera a que se cierre el PIPE, y pressure-vessel deja descendientes (su logger) con el fd
|
|
# abierto. Con redirección a fichero el mismo comando termina y devuelve su código. Es la misma
|
|
# familia que la cicatriz del preflight: el guardián que se cuelga o miente es peor que no tenerlo.
|
|
corre() { # corre <fichero-de-salida> <segundos>
|
|
timeout -k 5 "$2" "$HAMMER" qorpa run "$ID" -- /bin/sh -c "$DENTRO" > "$1" 2>&1 < /dev/null || true
|
|
}
|
|
|
|
# 3. Con la concesión: tiene que aparecer el runtime de Valve.
|
|
sed -i 's/^nesting = false/nesting = true/' "$INST/instance.toml"
|
|
echo "== con nesting = true"
|
|
corre "$LOG/si" 300
|
|
grep -E "PRETTY_NAME|mnt:" "$LOG/si" || true
|
|
if ! grep -q "Steam Runtime 3 (sniper)" "$LOG/si"; then
|
|
tail -20 "$LOG/si"
|
|
echo "FALLA: pressure-vessel no montó el runtime sniper" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# 4. Sin la concesión: tiene que MORIR. Si esto pasa, la jaula no está haciendo nada.
|
|
sed -i 's/^nesting = true/nesting = false/' "$INST/instance.toml"
|
|
echo "== con nesting = false (tiene que fallar)"
|
|
corre "$LOG/no" 120
|
|
sed -i 's/^nesting = false/nesting = true/' "$INST/instance.toml"
|
|
if grep -q "Steam Runtime 3 (sniper)" "$LOG/no"; then
|
|
echo "FALLA: anidó SIN la concesión — \`nesting\` no está conteniendo nada" >&2
|
|
exit 1
|
|
fi
|
|
# NO alcanza con «no salió sniper»: un cuelgue, un timeout o una ruta mal escrita también dejan un
|
|
# log sin esa línea, y el guardián diría OK sin haber probado nada. Se exige la EVIDENCIA POSITIVA
|
|
# de la denegación — el mismo criterio de evidencia negativa de harkaq.
|
|
if ! grep -q "Creating new namespace failed" "$LOG/no"; then
|
|
tail -20 "$LOG/no"
|
|
echo "FALLA: sin \`nesting\` no salió el rechazo esperado del kernel — no se probó nada" >&2
|
|
exit 1
|
|
fi
|
|
grep -o "bwrap: Creating new namespace failed.*" "$LOG/no" | head -1
|
|
|
|
echo "OK: pressure-vessel anida bajo la jaula con \`nesting\`, y NO anida sin ella"
|