diff --git a/recipes/libmnl.toml b/recipes/libmnl.toml new file mode 100644 index 00000000..805bfc2d --- /dev/null +++ b/recipes/libmnl.toml @@ -0,0 +1,35 @@ +# libmnl 1.0.5 — la envoltura mínima de netlink de netfilter. Entra por el §6.5 del SDD 26: el +# «modo foco» de `atuq` no lo sostiene una extensión sino el cortafuegos del sistema, y el +# cortafuegos de tawasuyu habla con el kernel por `nft`, que se apoya en libnftnl → libmnl. +# +# El grafo ya pedía `nftables` como `wanted` desde antes; nadie había puesto la cadena. Son tres +# recetas y ésta es la hoja. +# +# Tarball de release y no fuente por commit: el árbol de git NO trae `configure` (lo genera +# `autoreconf`) y el corpus no tiene autoconf/automake — mismo motivo por el que jq y gmp entran +# por tarball. El sha256 es el que publica netfilter.org junto al fichero, verificado al bajarlo. +# +# `link = "dynamic"` para que la cadena entera comparta forma con gmp, que sólo publica `.so`: +# `nft` va a enlazar contra las tres, y mezclar `.a` de una con `.so` de otra es la clase de +# detalle que se descubre cuando algo no arranca. +name = "libmnl" +version = "1.0.5" +license = "LGPL-2.1-or-later" + +[source] +tarball = "https://www.netfilter.org/pub/libmnl/libmnl-1.0.5.tar.bz2" +sha256 = "274b9b919ef3152bfb3da3a13c950dd60d6e2bcd54230ffeca298d03b40d0525" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --disable-static --enable-shared' +compile = 'make -j"$(nproc)"' +install = "make install DESTDIR=/out && find /out -name '*.la' -delete" + +[deps] +build = ["binutils", "busybox", "make", "pkgconf"] diff --git a/recipes/libnftnl.toml b/recipes/libnftnl.toml new file mode 100644 index 00000000..95660347 --- /dev/null +++ b/recipes/libnftnl.toml @@ -0,0 +1,29 @@ +# libnftnl 1.3.2 — la librería que traduce entre las estructuras de nftables y netlink. Eslabón +# del medio de la cadena que pide el §6.5 del SDD 26 (`libmnl` → `libnftnl` → `nftables`). +# +# La versión NO es libre: `nftables` 1.1.6 exige `libnftnl >= 1.3.1` en su `configure.ac:60` +# (leído en el tarball pineado, no supuesto). 1.3.2 es la última de la serie. +# +# Tarball de release por el mismo motivo que libmnl: el árbol de git no trae `configure` y el corpus +# no tiene autoconf/automake. +name = "libnftnl" +version = "1.3.2" +license = "GPL-2.0-or-later" + +[source] +tarball = "https://www.netfilter.org/pub/libnftnl/libnftnl-1.3.2.tar.xz" +sha256 = "c97abc3409f8fa396b4462b2bb7f147a3a47a4ddc97cfa0b2f18890c9cfde8b0" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --disable-static --enable-shared' +compile = 'make -j"$(nproc)"' +install = "make install DESTDIR=/out && find /out -name '*.la' -delete" + +[deps] +build = ["binutils", "busybox", "make", "pkgconf", "libmnl"] diff --git a/recipes/nftables-sin-bashismo-ni-sello.patch b/recipes/nftables-sin-bashismo-ni-sello.patch new file mode 100644 index 00000000..3c9d4e5e --- /dev/null +++ b/recipes/nftables-sin-bashismo-ni-sello.patch @@ -0,0 +1,20 @@ +--- a/configure 2026-09-10 22:26:51.138468172 +0000 ++++ b/configure 2026-09-10 22:27:03.298756289 +0000 +@@ -15608,7 +15608,7 @@ + + # Current date should be fetched exactly once per build, + # so have 'make' call date and pass the value to every 'gcc' call +-MAKE_STAMP="\$(shell date +%s)" ++MAKE_STAMP="0" + + + # Check whether --enable-distcheck was given. +@@ -17940,7 +17940,7 @@ + echo " ${STABLE_RELEASE}" + echo "};" + echo "static char nftbuildstamp[] = {" +- for ((i = 56; i >= 0; i-= 8)); do ++ for i in 56 48 40 32 24 16 8 0; do + echo " ((uint64_t)MAKE_STAMP >> $i) & 0xff," + done + echo "};" diff --git a/recipes/nftables.toml b/recipes/nftables.toml new file mode 100644 index 00000000..d097da32 --- /dev/null +++ b/recipes/nftables.toml @@ -0,0 +1,61 @@ +# nftables 1.1.6 — el `nft` con el que se aplica el reglaset del cortafuegos. Es la pieza que el +# grafo pedía como `wanted` desde antes de este frente, y la que destraba el §6.5 del SDD 26: el +# «modo foco» de `atuq` lo sostiene el sistema (una regla de egress por cgroup) y no una extensión +# que el propio navegador puede apagar. +# +# ⚠ LA VERSIÓN ES UNA DECISIÓN, NO UN DEFAULT. 1.1.7 ya está publicada (2026-09-01), pero el SDD del +# cortafuegos de tawasuyu dice que sus expresiones —en particular `socket cgroupv2 level N`— están +# «verificadas en metal contra nftables 1.1.6». Cambiar de versión cambia qué acepta `nft -c`, así +# que se pinea la que la otra mitad ya midió; subirla es su propia unidad de trabajo, con la +# revalidación incluida. +# +# `--without-cli`: el modo interactivo pide readline o editline, y acá nadie escribe reglas a mano +# — las genera `cortafuegos-core` y se aplican con `nft -f`. `--disable-man-doc` porque el manual +# sale de asciidoc/docbook, que no están en el corpus. +# +# Sin bison ni flex en `[deps]`: el tarball de release YA trae `src/parser_bison.c` y `src/scanner.c` +# generados (comprobado en el tarball pineado). El árbol de git no, y ésa es otra de las razones por +# las que esto entra por tarball. +# +# EL PARCHE ARREGLA DOS COSAS QUE VIENEN DE FÁBRICA, y las dos se midieron acá: +# +# 1. **un bashismo en `config.status`** — `configure.ac` emite `for ((i = 56; i >= 0; i-= 8))` para +# escribir `nftversion.h`, y el `/bin/sh` del lab es busybox: el build murió con +# `config.status: line 2041: syntax error: bad for loop variable`. Se reemplaza por un `for i in +# 56 48 ... 0` POSIX, que produce la MISMA secuencia. Se podría haber pasado `CONFIG_SHELL=bash` +# —el lab trae bash— pero eso mete una dependencia INVISIBLE: el lab no entra en `hash_inputs` +# (ADR pendiente), así que el día que un lab sin bash construya esta receta, el fallo vuelve sin +# que nada haya cambiado en el corpus. El parche sí entra en el hash. +# +# 2. **un sello de tiempo dentro del binario** — `MAKE_STAMP` es literalmente +# `$(shell date +%s)`, y `nftversion.h` lo mete byte a byte en el ejecutable. Eso es la familia +# exacta del `BuildID` de waterfox: dos builds de la misma fuente NO reproducen. nftables no mira +# `SOURCE_DATE_EPOCH`. Se fija en `0`, que además es lo correcto acá: el sello sólo se usa +# (`src/netlink.c:version_cmp`) para comparar qué `nft` creó una tabla, y en una distro +# reproducible dos builds de la MISMA versión son el mismo `nft`. +# +# `link = "dynamic"` porque no hay alternativa honesta: nft necesita libgmp y `recipes/gmp.toml` +# publica sólo `.so` (`--disable-static`). Un `link = "static"` acá sellaría un binario dinámico y +# la receta estaría mintiendo — la familia de fallos del `link=static` por libtool. +name = "nftables" +version = "1.1.6" +license = "GPL-2.0-only" + +[source] +tarball = "https://www.netfilter.org/pub/nftables/nftables-1.1.6.tar.xz" +sha256 = "372931bda8556b310636a2f9020adc710f9bab66f47efe0ce90bff800ac2530c" +patches = ["nftables-sin-bashismo-ni-sello.patch"] + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --sbindir=/usr/sbin --disable-static --enable-shared --without-cli --disable-man-doc' +compile = 'make -j"$(nproc)"' +install = "make install DESTDIR=/out && find /out -name '*.la' -delete" + +[deps] +build = ["binutils", "busybox", "make", "pkgconf", "libmnl", "libnftnl", "gmp"]