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 815Rust 56Shell 37Markdown 291229 Sutichaykuna

⎇ 534014c3ec69daea789a1d0523e1d00a69c6ed65 scripts/product-userland-from-repo.sh Shell · 57 siq'ikuna · 3.3 KB Ñawpa willay ch'uya

takana etapa 5c: comentarios de scripts, MOTD, y un BUG que introdujo la etapa 4 476168bb0 · Sergio ·

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