diff --git a/docs/28-servidor-de-produccion.md b/docs/28-servidor-de-produccion.md index e59c973c..a60c5048 100644 --- a/docs/28-servidor-de-produccion.md +++ b/docs/28-servidor-de-produccion.md @@ -670,10 +670,32 @@ rechazándolo, que es lo único honesto que se podía hacer sin la clave. los clientes debería llevar también el Storage Box. El primer origen roto, si es el único, es el último. -⚠ **Y el aviso periódico no está cableado en la caja a propósito**: `/var/lib/hammer/installed.json` -no existe ahí —ningún paquete se instaló por `takana install`, el sistema viene de imágenes—, así -que `avisar-actualizaciones.sh` sólo diría «nada instalado» cada 30 minutos. Se enchufa el día que -la caja consuma su propio repo, que es el §6.46 visto desde el otro lado. +### 5.9 El aviso, enchufado en la caja *(2026-09-21)* + +`41 * * * *` en el crontab de root → `/usr/local/bin/avisar-actualizaciones`, un envoltorio de tres +líneas que **sólo fija las rutas de la caja** (`REPO`, `DB`, `TRUST`, `STATE`, `TAKANA`) y llama al +guion del repo. La lógica no se copia a propósito: el día que el guion cambie, el cron no se queda +con una versión vieja — y se comprobó en vivo, arreglando el guion en el clon y viendo cambiar la +salida del envoltorio **sin volver a desplegar nada**. + +Tres piezas que faltaban en la caja y ahora están: + +| | | +|---|---| +| `/var/lib/hammer/trust/release.ed25519.pub` | el almacén de confianza **por defecto** de la CLI, que no existía ⇒ `install`/`outdated` verifican la firma **sin pasar `--trust`** | +| `/usr/local/bin/takana` | build release con el arreglo del §5.5. ⚠ El `PATH` de la caja **no incluye `/usr/local/bin`**, así que un `takana` a secas sigue siendo el del store (que no conoce `outdated`). El cron usa rutas absolutas. Ponerlo canónico es reconstruir la receta `takana` e hidratarla — su propia unidad de trabajo | +| `/var/log/takana-actualizaciones.log` | una línea por hora | + +⚠ **Y la primera corrida real destapó un defecto del propio aviso**: con la DB de instalados vacía +decía **«al día»**. Es verdad y no dice nada — peor, se lee como «comprobado y correcto» cuando lo +cierto es que *no había nada que comprobar*. Un aviso que suena igual cuando vigila que cuando no +vigila nada es exactamente cómo se deja de mirar un aviso. Ahora distingue: *«nada instalado por +takana en esta máquina (DB …) — no hay qué comparar»*. Control en la caja con una DB de juguete +(un `zsh` a otro hash): grita `1 con novedad · hash distinto`, y en la segunda corrida calla. + +Hoy la caja no instala de su propio repo —viene de imágenes—, así que el aviso dirá esa línea hasta +que lo haga; se pone igual para que el día que instale algo ya esté, y porque una línea por hora no +es ruido. Cada hora y no cada 30 minutos: el repo cambia cuando alguien publica. --- diff --git a/scripts/servidor/avisar-actualizaciones.sh b/scripts/servidor/avisar-actualizaciones.sh index 677e3ad8..80fa7f12 100755 --- a/scripts/servidor/avisar-actualizaciones.sh +++ b/scripts/servidor/avisar-actualizaciones.sh @@ -68,10 +68,20 @@ AHORA="$(huella "$NUEVO")" mv "$NUEVO" "$STATE" N=$(python3 -c 'import json,sys; print(len(json.load(open(sys.argv[1])).get("novedades",[])))' "$STATE") +INSTALADOS=$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1])).get("instalados",0))' "$STATE") SELLO="$(date -u +%FT%TZ)" +# ⚠ «Al día» con CERO paquetes instalados es verdad y no dice nada — peor: se lee como «comprobado +# y correcto» cuando lo cierto es que no había nada que comprobar. Medido la primera vez que corrió +# en la caja, cuya DB de instalados ni existe. Un aviso que suena igual cuando vigila que cuando no +# vigila nada es exactamente cómo se deja de mirar un aviso. +if [ "$INSTALADOS" = "0" ]; then + echo "$SELLO · nada instalado por takana en esta máquina (DB $DB) — no hay qué comparar contra $REPO" + exit 0 +fi + if [ "$N" = "0" ]; then - echo "$SELLO · al día contra $REPO" + echo "$SELLO · al día contra $REPO ($INSTALADOS paquete(s) comprobado(s))" exit 0 fi