Files
takana/scripts/servidor/fuentes-por-ssh.sh
T
SergioandClaude Opus 5 d4896c2999 pagada la deuda: el git del corpus vuelve a clonar por HTTPS
El §6.50 quinquies dejó la caja trayendo fuentes por SSH porque su git no tenía remote-https. Eso era
el síntoma; la causa estaba un paso antes de donde mirábamos —incluida la nota que yo mismo había
escrito, que culpaba al Makefile—: el `configure` de git prueba libcurl con AC_CHECK_LIB, que enlaza
`conftest.c -lcurl` y nada más, y con libcurl estática faltan sus privadas (-lssl -lcrypto -lz).

El test falla, config.mak.autogen se lleva NO_CURL=YesPlease, el Makefile excluye los tres helpers y
conserva git-http-backend —esa asimetría en el artefacto era la firma, y estuvo a la vista desde el
14 de septiembre—. El build termina en verde.

Medido sobre el artefacto: b3:215742cb… trae git-remote-http, -https, git-http-fetch y los ftp, y
CLONA por HTTPS (clone, no ls-remote). En la caja, hidratado y con la reescritura apagada, funcionan
tanto `git clone` como `git clone --mirror`, que es el comando exacto del fetch de takana.

Y el radio, medido en vez de temido: la nota vieja decía «raíz de perfil.base ⇒ radio grande»;
`yupana radio git` dice cero dependientes directos y cero transitivos. El miedo escrito a mano había
sobrestimado el costo de arreglarlo, y eso lo mantuvo roto tres días.

Las reescrituras url.insteadOf quedan retiradas de la caja; el guion se conserva como salida de
emergencia y así lo dice su cabecera.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 20:52:47 +00:00

83 lines
5.2 KiB
Bash
Executable File

#!/bin/sh
# Deja la caja de producción capaz de TRAER FUENTES GIT por SSH.
#
# ⚠ DESDE EL 2026-09-17 ESTO ES UNA SALIDA DE EMERGENCIA, NO EL CAMINO NORMAL. El `git` del corpus
# ya clona por HTTPS (la causa era el test de libcurl del `configure`, ver SDD 28 §6.50 sexies), y en
# la caja las reescrituras `url.insteadOf` están RETIRADAS. Esto se conserva para el día en que el
# HTTPS no esté disponible —un git sin libcurl, un cortafuegos que sólo deja pasar el 22— y para
# dejar escrito lo que costó averiguar.
#
# ── POR QUÉ (2026-09-17) ────────────────────────────────────────────────────────────────────────
# El `git` sellado del corpus no trae `git-remote-http` (falta libcurl): en la caja, cualquier receta
# que clone muere con
#
# git: 'remote-https' is not a git command
#
# y eso son 36 recetas de tawasuyu y ~90 de GitHub — o sea, casi todo lo propio. La salida es traer
# por SSH. **No cuesta ningún hash**: la URL es un LOCALIZADOR y no entra en `hash_inputs`
# (ADR 0013), así que el mismo commit por otro transporte sella el MISMO artefacto. Por eso esto no
# toca ninguna receta: el worker sigue clonando por HTTPS, que es lo que él sí puede.
#
# Idempotente. Se corre EN LA CAJA, como root.
set -eu
CONF_SSH=/root/.ssh/config
CONF_GIT=/root/.gitconfig
CONF_CARGO=/root/.cargo/config.toml
KH=/root/.ssh/known_hosts
# ── 1. reescritura de URLs ───────────────────────────────────────────────────────────────────────
git config --global url."ssh://gitea@git.gioser.net:2345/".insteadOf "https://git.tawasuyu.net/"
git config --global url."ssh://git@github.com/".insteadOf "https://github.com/"
# ── 2. la clave del host, SIN el puerto ──────────────────────────────────────────────────────────
# cargo tiene su propio cliente SSH y busca `git.gioser.net` pelado; con la entrada sólo como
# `[git.gioser.net]:2345` se planta con «This host key was found, but is associated with a different
# host». Es la MISMA clave, reexpresada — no es aceptar nada nuevo.
if ! grep -q "^git.gioser.net ssh-" "$KH" 2>/dev/null; then
grep "^\[git.gioser.net\]:2345 " "$KH" | sed "s|^\[git.gioser.net\]:2345 |git.gioser.net |" >> "$KH"
fi
# ── 3. github.com: la huella se PINEA contra la publicada, no se acepta a ciegas ─────────────────
GH_FP="SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU"
if ! grep -q "^github.com ssh-ed25519" "$KH" 2>/dev/null; then
ssh-keyscan -t ed25519 github.com > /tmp/gh.keys 2>/dev/null
fp=$(ssh-keygen -lf /tmp/gh.keys | awk '{print $2}')
[ "$fp" = "$GH_FP" ] || { echo "github.com anuncia $fp y NO la publicada $GH_FP — no la acepto" >&2; exit 1; }
cat /tmp/gh.keys >> "$KH"; rm -f /tmp/gh.keys
fi
# ── 4. qué clave usa cada host ───────────────────────────────────────────────────────────────────
grep -q "^Host github.com" "$CONF_SSH" 2>/dev/null || cat >> "$CONF_SSH" <<'SSHEOF'
Host github.com
HostName github.com
User git
IdentityFile /root/.ssh/github5
IdentitiesOnly yes
SSHEOF
chmod 600 "$CONF_SSH"
# ── 5. cargo delega en el git de verdad ──────────────────────────────────────────────────────────
# Sin esto, `cargo vendor` usa libgit2 y ni lee `IdentityFile` de ~/.ssh/config:
# «no authentication methods succeeded». Es fetch, no build: no toca ningún hash.
mkdir -p "$(dirname "$CONF_CARGO")"
grep -q "git-fetch-with-cli" "$CONF_CARGO" 2>/dev/null || printf '[net]\ngit-fetch-with-cli = true\n' >> "$CONF_CARGO"
# ── 6. CARGO_HOME NO puede vivir en la raíz ──────────────────────────────────────────────────────
# Son 5,9 G. El vendor del monorepo bajó 2,7 G, la raíz llegó al 100 % y la caja se CAYÓ ENTERA
# —sin HTTP, sin SSH y sin responder al ping— con Hetzner informando `running` (SDD 28 §6.50 quinquies).
if [ ! -L /root/.cargo ]; then
mkdir -p /work/cargo-home
[ -d /root/.cargo ] && cp -a /root/.cargo/. /work/cargo-home/ && rm -rf /root/.cargo
ln -s /work/cargo-home /root/.cargo
fi
# ── control: que de verdad LLEGUE, no que el fichero exista ─────────────────────────────────────
fallos=0
for u in "https://git.tawasuyu.net/tawasuyu/tawasuyu.git" "https://github.com/uutils/coreutils.git"; do
if timeout 45 git ls-remote "$u" >/dev/null 2>&1; then echo " ✓ $u"; else echo " ✗ $u"; fallos=$((fallos+1)); fi
done
[ "$fallos" -eq 0 ] || { echo "NO llega a $fallos origen(es)" >&2; exit 1; }
echo "la caja trae fuentes git por SSH"