Files
takana/scripts/product-userland-from-repo.sh
Sergio 476168bb07 takana etapa 5c: comentarios de scripts, MOTD, y un BUG que introdujo la etapa 4
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.
2026-09-09 19:28:48 +00:00

58 lines
3.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# product-userland-from-repo.sh — arma el USERLAND del producto HIDRATÁNDOLO desde el REPO FIRMADO
# (Etapa F+G, cierre del lazo): por cada paquete corre `takana install --repo <repo> --prefix <rfs>
# --require-signed`, que verifica la firma del release, reproduce desde el `.swm` (cache-hit si ya
# está en el store) e hidrata el FHS bajo el prefix. El resultado es un árbol de userland cuya cadena
# de suministro entera viene del repo firmado, no del bootstrap hardcodeado.
#
# Uso: ./scripts/product-userland-from-repo.sh [pkg...] # default: set curado
# PKGS="bat fd jq" ./scripts/product-userland-from-repo.sh
# OVER=work/product-image/rootfs ./scripts/product-userland-from-repo.sh # hidratar SOBRE un rootfs base
# Env: REPO (def dist/repo) TRUST (def dist/keys) RFS (def work/product-userland) STORE (def ./store)
# OVER (si está, hidrata SOBRE ese dir en vez de uno limpio — p.ej. el product-rootfs base)
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
REPO="${REPO:-dist/repo}"; TRUST="${TRUST:-dist/keys}"; STORE="${STORE:-./store}"
RFS="${OVER:-${RFS:-work/product-userland}}"
DB="$RFS/var/lib/hammer/installed.json"
# Set curado por defecto: el userland "real" que hace usable a la distro. Todos deben estar en el
# índice del repo firmado. Editá/pasá args para cambiarlo.
# El set ya NO vive acá: sale del MANIFIESTO DE OBJETIVO (docs/state/targets.toml), perfil `cli` =
# `base` (userland foundational C, de-Alpinizado, tandas base-system-1..3) + la capa CLI Rust encima.
# Cambiar el userland del producto = editar el manifiesto, que es también lo que mide el grafo de
# estado. Env PERFIL para armar otra imagen (`scripts/targets.py --lista` los muestra).
PERFIL="${PERFIL:-cli}"
DEFAULT_PKGS="$("$ROOT/scripts/targets.py" "$PERFIL")"
PKGS_LIST="${PKGS:-${*:-$DEFAULT_PKGS}}"
[ -n "${OVER:-}" ] || { rm -rf "$RFS"; mkdir -p "$RFS"; }
mkdir -p "$(dirname "$DB")"
echo "==> hidratando userland desde el repo firmado ($REPO) → $RFS"
ok=0; skip=0; fail=0; got=""
for pkg in $PKGS_LIST; do
# ¿está en el índice del repo? (evita abortar por un nombre ausente)
if ! grep -q "\"$pkg\"" "$REPO/index.json" 2>/dev/null; then
printf " - %-16s (no está en el repo, salteado)\n" "$pkg"; skip=$((skip+1)); continue
fi
if NO_PROXY=localhost NIX_STORE="${NIX_STORE:-$HOME/.nixstore}" \
"$ROOT/target/release/takana" --store "$STORE" install "$pkg" \
--repo "$REPO" --prefix "$RFS" --trust "$TRUST" --require-signed --db "$DB" \
>/dev/null 2>"$RFS/.install-$pkg.log"; then
printf " ✓ %-16s\n" "$pkg"; ok=$((ok+1)); got="$got $pkg"
else
printf " ✗ %-16s (ver %s)\n" "$pkg" "$RFS/.install-$pkg.log"; fail=$((fail+1))
fi
done
echo "==> userland: $ok hidratados, $skip ausentes, $fail fallaron"
# verificación: cada binario presente + estático
echo "==> verificación (estático + presente):"
for pkg in $got; do
b=$(find "$RFS/usr/bin" -maxdepth 1 -type f \( -name "$pkg" -o -name "*$pkg*" \) 2>/dev/null | head -1)
[ -n "$b" ] && printf " %-16s %s\n" "$pkg" "$(file -b "$b" 2>/dev/null | grep -oE 'statically linked|dynamically linked' || echo '?')"
done
rm -f "$RFS"/.install-*.log 2>/dev/null || true
echo "==> binarios en $RFS/usr/bin: $(ls "$RFS/usr/bin" 2>/dev/null | wc -l)"