From 7ec2e86b7b4a149f23ccd3f31ce80f07f22889f1 Mon Sep 17 00:00:00 2001 From: sergio Date: Thu, 16 Jul 2026 06:30:36 -0400 Subject: [PATCH] =?UTF-8?q?harkaq:=20declarar=20deps=20medidas=20por=20el?= =?UTF-8?q?=20kernel=20(cosecha=20autom=C3=A1tica)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cosecha desatendida de la campaña harkaq. Cada dep de acá la denunció el audit de Landlock en un build real: el kernel vio al build usarla sin declararla, y el store del hub confirma qué artefacto la provee (deuda DECLARABLE, §4.5). Recetas:coreutils elfutils expat file flex gawk No se tocó ninguna receta con deuda IRREDUCIBLE: declarar algo que el store no provee rompería el build en vez de arreglarlo. Esas van a tandas/needs-review-harkaq. Co-Authored-By: Claude Opus 4.8 --- recipes/coreutils.toml | 3 +++ recipes/elfutils.toml | 3 +++ recipes/expat.toml | 3 +++ recipes/file.toml | 3 +++ recipes/flex.toml | 3 +++ recipes/gawk.toml | 3 +++ scripts/farm/harvest-harkaq.sh | 19 +++++++++++++++++-- scripts/farm/harvest-loop.sh | 19 +++++++++++++++++++ 8 files changed, 54 insertions(+), 2 deletions(-) create mode 100755 scripts/farm/harvest-loop.sh diff --git a/recipes/coreutils.toml b/recipes/coreutils.toml index 972507ee..e6b90a55 100644 --- a/recipes/coreutils.toml +++ b/recipes/coreutils.toml @@ -31,6 +31,9 @@ link = "static" # gettext (ausente). Las flags van al ./configure (AutoconfReady). flags = ["--enable-single-binary", "--disable-nls"] +[deps] +build = ["busybox", "make"] + [build.phases] # install por defecto (make install DESTDIR=/out) deja el multicall en /out/usr/bin/coreutils; lo # relocamos a /out/bin/coreutils, que es donde apuntan los symlinks del toolchain Alpine (/bin/cp → diff --git a/recipes/elfutils.toml b/recipes/elfutils.toml index 5d3169d9..539f2254 100644 --- a/recipes/elfutils.toml +++ b/recipes/elfutils.toml @@ -31,6 +31,9 @@ target = "x86_64-linux-musl" link = "dynamic" zig_version = "0.13.0" +[deps] +build = ["binutils"] + [build.phases] configure = """ mkdir -p compat && \ diff --git a/recipes/expat.toml b/recipes/expat.toml index 5c533320..2069b956 100644 --- a/recipes/expat.toml +++ b/recipes/expat.toml @@ -13,6 +13,9 @@ target = "x86_64-linux-musl" link = "static" flags = [] +[deps] +build = ["make"] + [build.phases] # --with-pic: el .a estático lleva objetos PIC ⇒ enlazable dentro de .so (Mesa liga libexpat en # libgallium/xmlconfig; sin PIC: «R_X86_64_PC32 ... recompile with -fPIC»). PIC es superset. diff --git a/recipes/file.toml b/recipes/file.toml index 34d280d9..a661fa31 100644 --- a/recipes/file.toml +++ b/recipes/file.toml @@ -17,6 +17,9 @@ target = "x86_64-linux-musl" link = "static" flags = [] +[deps] +build = ["make"] + [build.phases] # de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático): compile = ''' diff --git a/recipes/flex.toml b/recipes/flex.toml index 9bf025df..21a6ef25 100644 --- a/recipes/flex.toml +++ b/recipes/flex.toml @@ -24,6 +24,9 @@ link = "dynamic" # bueno por-receta ⇒ gcc deja de hacer falta (toolchain 100% zig). No es input del 4/4. SDD 11 §7.2b. zig_version = "0.13.0" +[deps] +build = ["busybox"] + [build.phases] configure = "./configure --prefix=/usr --disable-nls --disable-shared" compile = "make -j\"$(nproc)\"" diff --git a/recipes/gawk.toml b/recipes/gawk.toml index d436ea4a..d3e11c2c 100644 --- a/recipes/gawk.toml +++ b/recipes/gawk.toml @@ -17,6 +17,9 @@ target = "x86_64-linux-musl" link = "static" flags = [] +[deps] +build = ["busybox", "make"] + [build.phases] # de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3; revisá --shared para estático): compile = ''' diff --git a/scripts/farm/harvest-harkaq.sh b/scripts/farm/harvest-harkaq.sh index fa6f6a64..cf37fd63 100755 --- a/scripts/farm/harvest-harkaq.sh +++ b/scripts/farm/harvest-harkaq.sh @@ -26,6 +26,16 @@ set -u HUB="$(cd "$(dirname "$0")/../.." && pwd)" cd "$HUB" WORKER="${1:?uso: harvest-harkaq.sh root@}" + +# LOCK: dos cosechas a la vez editarían recetas y harían `git commit` en paralelo = árbol +# corrupto. El harvest es lento (re-indexa el store por veredicto), así que un ciclo puede pisar +# al siguiente. flock con -n: si ya hay una corriendo, esta sale limpia en vez de solaparse. +LOCK="$HUB/work/.harvest-harkaq.lock" +exec 9>"$LOCK" +if ! flock -n 9; then + echo "$(date -u +%FT%TZ) otra cosecha en curso, salto este ciclo" + exit 0 +fi SSH_KEY="${SSH_KEY:-$HOME/.ssh/github5}" REMOTE="${REMOTE:-/opt/hammer}" SSH="ssh -i $SSH_KEY -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes" @@ -81,8 +91,13 @@ done # que el diff SÓLO toque la línea `build = [...]`, para no arrastrar trabajo de otro agente. for f in $(git diff --name-only -- 'recipes/*.toml' 2>/dev/null); do case " $tocadas " in *" $f "*) continue ;; esac - if git diff -U0 -- "$f" | grep -E '^[-+]' | grep -vE '^(---|\+\+\+)' | grep -qvE '^[-+]\s*(build\s*=|\[deps\])'; then - echo " ·· $f — modificado con algo que no es `[deps].build`: NO lo toco (¿otro agente?)" + # ¿el diff toca SÓLO `[deps]`/`build =`? Se ignoran las líneas en blanco añadidas/quitadas + # (`^[+-]\s*$`): add-deps mete un `\n` tras el bloque y ese `+` vacío hacía que el filtro + # rechazara recetas legítimas (flex, gawk…) como "de otro agente". Y el mensaje usa comillas + # SIMPLES: con dobles, el `[deps].build` entre backticks se ejecutaba como comando. + if git diff -U0 -- "$f" | grep -E '^[-+]' | grep -vE '^(---|\+\+\+)' \ + | grep -vE '^[-+]\s*$' | grep -qvE '^[-+]\s*(build\s*=|\[deps\])'; then + echo ' ·· '"$f"' — el diff toca algo que no es [deps].build: NO lo toco (¿otro agente?)' else tocadas="$tocadas $f" echo " ↻ $f — pendiente de un ciclo anterior, se commitea ahora" diff --git a/scripts/farm/harvest-loop.sh b/scripts/farm/harvest-loop.sh new file mode 100755 index 00000000..861bce09 --- /dev/null +++ b/scripts/farm/harvest-loop.sh @@ -0,0 +1,19 @@ +#!/bin/sh +# harvest-loop.sh — disparador de la cosecha harkaq SIN cron. Este laptop corre `arje-zero` como +# PID 1 (no systemd), no tiene crond activo y `crond` como usuario falla (necesita root para el +# pidfile). Instalé un crontab que NADIE leía: corrió 0 veces en toda la noche. Un loop nohup es +# el mecanismo que de verdad funciona acá — sin root, y sobrevive al fin de la sesión. +# +# nohup scripts/farm/harvest-loop.sh root@ >>work/harvest-harkaq.log 2>&1 & +# +# NO sobrevive un reboot del laptop (a diferencia de un servicio en /etc/init.d, que necesitaría +# root). Tras reiniciar, relanzarlo. Parar: `pkill -f harvest-loop`. +set -u +cd "$(dirname "$0")/../.." +WORKER="${1:?uso: harvest-loop.sh root@}" +INTERVALO="${INTERVALO:-1800}" +echo "$(date -u +%FT%TZ) harvest-loop arrancado (worker $WORKER, cada ${INTERVALO}s)" +while :; do + scripts/farm/harvest-harkaq.sh "$WORKER" || echo "$(date -u +%FT%TZ) ciclo falló, sigo" + sleep "$INTERVALO" +done