#!/bin/sh # reparchar-paquete-instalador.sh — poner los GUIONES del repo dentro de un paquete ya armado. # # ── POR QUÉ EXISTE, Y QUÉ NO ES ──────────────────────────────────────────────────────────────── # `instalador-paquete.sh` arma el paquete entero, y para eso necesita el `product-rootfs` y el # `linux-metal` del store. En una máquina que no tiene store —la de desarrollo— ese camino no corre, # y entonces un cambio en los guiones no se puede probar en metal: el paquete sigue llevando los de # la víspera. # # Esto hace lo único que falta en ese caso: **reemplazar los guiones**, que son texto y no dependen # de ningún artefacto sellado. El rootfs y el kernel del paquete quedan exactamente como estaban — # no se tocan, no se rearman, y por eso esto NO reemplaza a `instalador-paquete.sh`. # # Y lleva la misma comprobación que aquél, por el mismo motivo: el paquete se armó a mano dos veces # y a la segunda ya mentía —por fuera el script corregido, por dentro el de la víspera—. Acá, al # terminar, se extrae de nuevo lo que quedó adentro y se compara por sha256 contra el repo. Un # paquete que dice llevar el arreglo y no lo lleva es peor que uno que no lo lleva. # # Uso: scripts/reparchar-paquete-instalador.sh set -eu ROOT="$(cd "$(dirname "$0")/.." && pwd)" PAQ="${1:?uso: $0 }" CPIO="$PAQ/takana-instalador.cpio.gz" [ -r "$CPIO" ] || { echo "no encuentro $CPIO" >&2; exit 1; } T="${TMPDIR:-/var/tmp}/reparchar-paquete.$$"; rm -rf "$T"; mkdir -p "$T/x" limpiar() { rm -rf "$T"; } trap limpiar EXIT echo "==> abriendo $CPIO" ( cd "$T/x" && zcat "$CPIO" | cpio -idm --quiet ) # Los guiones que viajan adentro, con su sitio. El `init` del initramfs ES `instalador-initramfs.sh`. copiar() { # [ -r "$ROOT/$1" ] || { echo "falta $ROOT/$1" >&2; exit 1; } mkdir -p "$(dirname "$T/x/$2")" cp "$ROOT/$1" "$T/x/$2"; chmod 755 "$T/x/$2" echo " · $1 → /$2" } copiar scripts/instalador-initramfs.sh init copiar scripts/takana-install-partition.sh instalador/takana-install-partition.sh copiar scripts/lib/adoptar.sh instalador/lib/adoptar.sh copiar scripts/lib/usuarios-del-home.sh instalador/lib/usuarios-del-home.sh copiar scripts/lib/herramientas-desde-store.sh instalador/lib/herramientas-desde-store.sh # **Y el binario, que adentro del initramfs es quien pone la etiqueta** (`takana fs-label`): sin # e2fsprogs ahí, es el único que puede, y un paquete con el guion nuevo y el binario viejo falla # justo al final — con el sistema anterior ya mudado y el nuevo ya copiado. if [ -x "$ROOT/target/x86_64-unknown-linux-musl/release/takana" ]; then cp "$ROOT/target/x86_64-unknown-linux-musl/release/takana" "$T/x/bin/takana" chmod 755 "$T/x/bin/takana" echo " · target/x86_64-unknown-linux-musl/release/takana → /bin/takana" else echo " ⚠ no hay takana musl: el de adentro queda como estaba (sin fs-label no se adopta)" >&2 fi # Y los applets que la adopción usa y no estaban enlazados: `df` mide el espacio (la guarda que # evita mover un sistema a un sitio donde el nuevo no entra) y `date` sella la marca de la mudanza. for _a in df date; do [ -e "$T/x/bin/$_a" ] || { ln -sf busybox "$T/x/bin/$_a"; echo " · /bin/$_a ⇒ busybox"; } done # Y el de afuera, que es el que mira quien abre el paquete. Que los dos sean el mismo fichero es la # mitad del asunto: la copia de afuera es la que se lee y la de adentro la que corre. cp "$ROOT/scripts/takana-install-partition.sh" "$PAQ/takana-install-partition.sh" mkdir -p "$PAQ/lib" cp "$ROOT/scripts/lib/adoptar.sh" "$ROOT/scripts/lib/usuarios-del-home.sh" \ "$ROOT/scripts/lib/herramientas-desde-store.sh" "$PAQ/lib/" echo "==> cerrando el paquete" ( cd "$T/x" && find . | cpio -o -H newc --quiet | gzip -9 ) > "$T/nuevo.cpio.gz" mv "$T/nuevo.cpio.gz" "$CPIO" # ── LA COMPROBACIÓN: lo que quedó ADENTRO es lo del repo ─────────────────────────────────────── echo "==> comprobando lo que quedó adentro" rm -rf "$T/v"; mkdir -p "$T/v" # Se extrae ENTERO y no por patrones: la extracción selectiva de cpio salió vacía y el banco lo # leyó como «el archivo no es el del repo», que es el diagnóstico contrario al verdadero. Una # comprobación que falla cuando no puede mirar está bien; una que falla por mirar mal, no. ( cd "$T/v" && zcat "$CPIO" | cpio -idm --quiet ) MAL=0 comparar() { # _a=$(sha256sum "$ROOT/$1" | cut -d' ' -f1) _b=$(sha256sum "$T/v/$2" 2>/dev/null | cut -d' ' -f1 || echo "AUSENTE") if [ "$_a" = "$_b" ]; then echo " ✓ $2" else echo " ✗ $2 NO es el del repo ($_b)"; MAL=$((MAL+1)); fi } comparar scripts/instalador-initramfs.sh init comparar scripts/takana-install-partition.sh instalador/takana-install-partition.sh comparar scripts/lib/adoptar.sh instalador/lib/adoptar.sh comparar scripts/lib/usuarios-del-home.sh instalador/lib/usuarios-del-home.sh if [ -x "$ROOT/target/x86_64-unknown-linux-musl/release/takana" ]; then comparar target/x86_64-unknown-linux-musl/release/takana bin/takana fi for _a in df date; do [ -e "$T/v/bin/$_a" ] && echo " ✓ bin/$_a" || { echo " ✗ falta bin/$_a"; MAL=$((MAL+1)); } done [ "$MAL" = "0" ] || { echo "✗ el paquete NO quedó con los guiones del repo" >&2; exit 1; } echo "✓ $PAQ al día ($(du -h "$CPIO" | cut -f1)) — el rootfs y el kernel quedaron intactos"