#!/bin/sh # credencial-espejo-github.sh — da a git el token de GitHub del espejo, sin guardarlo en ningún sitio. # # ══ POR QUÉ EXISTE ════════════════════════════════════════════════════════════════════════════ # El latido (`cosecha-cron.sh`, crontab de ROOT con `HOME=/root`) publica el estado y debe espejarlo # a GitHub. El espejo va por HTTPS con el token de `gh` —las claves SSH disponibles no llegan: se # comprobó el 2026-10-07 que ninguna de `/root/.ssh` abre el repo del espejo— y `gh` está logueado # como **sergio**, en `/home/sergio/.config/gh/hosts.yml`. Root no lo ve. # # Las alternativas se descartaron por lo que dejan a la intemperie: # - meter el token en `.git/config` o en un `~/.git-credentials` ⇒ secreto EN REPOSO, en claro, # en una caja que ya tiene root compartido. # - poner la URL con el token adentro (`https://x:TOKEN@github.com/…`) ⇒ lo mismo, y además sale # en cada mensaje de error de git. # - loguear `gh` como root ⇒ dos sesiones que caducan por separado, y la de root nadie la mira. # # Esto lo pide EN EL MOMENTO y no lo escribe: si `gh` pierde la sesión, el push falla ruidosamente # en vez de empujar con un token muerto. # # ⚠ El token NO se imprime en ninguna traza: `gh auth token` escribe sólo a stdout, que git consume. # No añadir `set -x` acá ni redirigir esta salida a un log. # # Uso: no se invoca a mano. Se declara como ayudante de credencial del clon del latido: # git -C /opt/takana config credential.https://github.com.helper /usr/local/bin/credencial-espejo-github # # git llama al ayudante con la operación en $1 (`get`/`store`/`erase`). Sólo `get` tiene respuesta: # no se guarda ni se borra nada, porque no hay nada guardado. [ "${1:-}" = "get" ] || exit 0 DUENO="${DUENO_GH:-sergio}" USUARIO="${USUARIO_GH:-sergiovelasquezzeballos}" # `su - ` y no `sudo`: en esta caja `sudo` reenvía al anfitrión por ssh (ver CLAUDE.md) y acá # ya estamos en el anfitrión. El login shell es necesario para que `gh` encuentre su HOME. token="$(su - "$DUENO" -c 'gh auth token' 2>/dev/null)" if [ -z "$token" ]; then # A stderr, que git muestra: un ayudante que calla deja a git pidiendo usuario y contraseña por # teclado, y en un cron eso es un cuelgue sin mensaje. echo "credencial-espejo-github: $DUENO no tiene sesión de gh (corré: gh auth login)" >&2 exit 1 fi echo "username=$USUARIO" echo "password=$token"