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 1101Rust 61Shell 47Markdown 371349 Definiciones

⎇ 2f9253886ff843d9701ac61a9c3ff4f2cd43ef33 scripts/servidor/fuentes-por-ssh.sh Shell · 82 líneas · 5.2 KB Historia crudo

pagada la deuda: el git del corpus vuelve a clonar por HTTPS d4896c299 · Sergio ·

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