From 4b38af8f3fc42bef2f421895076d8d2c6a2e60ca Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Sep 2026 01:38:50 +0000 Subject: [PATCH] =?UTF-8?q?networkmanager=20al=20corpus=20CON=20WiFi=20y?= =?UTF-8?q?=20con=20nmcli=20=E2=80=94=20y=20los=20perfiles=20que=20no=20te?= =?UTF-8?q?n=C3=ADan=20gestor=20de=20red?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit networkmanager b3:c36414ece23e322ef007d0acc7ce6f65b8b822ae55c38b38c9afa4b3eb340adb (52 MB) Arreglo del segundo hueco del barrido: `networkmanager` figuraba SÓLO en escritorio-kde, y desde GNOME, COSMIC o sway no se alcanza (cola hermana). Pero promover la receta de KDE tal cual habría sido peor que no hacerlo, y sólo se vio mirando el ARTEFACTO: · `-Dwifi=false` ⇒ un gestor de red que no maneja interfaces inalámbricas. Allá es correcto (esa receta existe para dar libnm.so a plasma-nm y nada más); acá habría puesto en tres imágenes un demonio que arranca, dibuja el applet y no lista una sola red. · sin `nmcli` ⇒ ni una herramienta con la que manejarlo. En sway eso es la diferencia entre tener red y no tenerla. La variante del corpus cambia tres cosas, y la tercera hizo falta MEDIRLA: 1. `-Dwifi=true`. Habla nl80211 por libnl (ya era dep) y delega el handshake WPA2 en `wpa_supplicant`, que desde hoy está en perfil.base ⇒ va también en [deps] runtime. 2. `readline` en [deps] build. 3. `-Dnmcli=true -Dreadline=libreadline`. Con sólo la dep, nmcli NO se construyó: `-Dnmcli` vale true de fábrica pero `-Dreadline` es un COMBO que por defecto va en `auto`, y sin decirle dónde mirar resolvió a «none» ⇒ meson apagó el CLI EN SILENCIO. Comprobado sobre el store. Y `readline-shared` en runtime, cazado con provee.py sobre las NEEDED del binario: nmcli sale con `NEEDED libreadline.so.8` y la readline canónica del corpus es sólo .a. La dep de BUILD y la de RUNTIME son artefactos distintos — tercer caso del día tras cmus y bluez. No mueve el hash. ⚠ Se queda `-Dcrypto=null`, y es una limitación real escrita en la receta: sin cripto no valida 802.1X / WPA-Enterprise (el WiFi de una oficina). WPA2-PSK funciona porque ése lo hace el supplicant. Encender nss o gnutls arrastra dos cadenas enormes: unidad de trabajo aparte. ── targets.toml ──────────────────────────────────────────────────────────────────────────────── escritorio-gnome, escritorio-cosmic, escritorio-sway += networkmanager (+ servicio) escritorio-kde, escritorio-sway += wireplumber (+ servicio) ⚠ networkmanager NO se declara en escritorio-kde: allá plasma-nm ya arrastra la variante de la cola, y dos NetworkManager distintos en la misma ruta es la enfermedad de las dos glib. Que la de KDE vaya sin WiFi es deuda del frente KDE, y queda escrita donde toca. --- docs/state/targets.toml | 46 ++++++++++++++++ recipes/networkmanager.toml | 106 ++++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 recipes/networkmanager.toml diff --git a/docs/state/targets.toml b/docs/state/targets.toml index 50c39404..f351a2d0 100644 --- a/docs/state/targets.toml +++ b/docs/state/targets.toml @@ -391,6 +391,14 @@ paquetes = [ # `-Dprint_backends=file`, así que una app GTK3 seguirá viendo un solo destino («a fichero») # hasta que gtk3 se re-selle. La pieza está, el sistema la ignora, y ninguna métrica lo dice. "cups", "bluez", + # `wireplumber` (2026-09-13): **el audio de esta imagen no encaminaba nada.** `pipewire` está y + # arranca, pero se construyó con `-Dsession-managers=[]`: sin gestor de sesión no hay política de + # qué es entrada, qué es salida ni qué se enlaza con qué — el sink que ve la aplicación es + # `auto_null`, o sea el nodo de descarte. Audio que parece vivo y no suena. + # Vive en el CORPUS —y no en esta cola— porque desde acá no se alcanza una cola hermana: las + # copias de `incoming-gnome` e `incoming-cosmic` eran invisibles para este perfil. Ver su receta: + # hay tres variantes vivas a propósito y consolidarlas es el trabajo siguiente. + "wireplumber", ] # ── QUÉ ARRANCA (el «enable»; SDD 30 §3) ──────────────────────────────────────────────────────── @@ -416,6 +424,8 @@ paquetes = [ servicios = [ "dbus-system", "upowerd", "cupsd", "bluetoothd", "pipewire", "pipewire-pulse", + # 2026-09-13: con `wireplumber` declarado arriba, el audio pasa de «acepta clientes» a «encamina». + "wireplumber", ] [perfil.escritorio-gnome] @@ -706,6 +716,14 @@ paquetes = [ # `-Dprint_backends=file`, así que una app GTK3 seguirá viendo un solo destino («a fichero») # hasta que gtk3 se re-selle. La pieza está, el sistema la ignora, y ninguna métrica lo dice. "cups", "bluez", + # `networkmanager` (2026-09-13): este perfil no tenía CON QUÉ gestionar una red. La receta existía + # sólo en `incoming-kde` —inalcanzable desde acá— y además estaba construida con `-Dwifi=false`, + # porque allá se escribió para dar `libnm.so` a plasma-nm y nada más. La variante del CORPUS va + # con `-Dwifi=true` y con `nmcli` (el artefacto de KDE no lo trae, comprobado sobre el store), y + # delega el handshake WPA2 en el `wpa_supplicant` que `base` declara desde hoy. + # ⚠ NO declarar esto en `escritorio-kde`: allá `plasma-nm` ya arrastra la variante de la cola, y + # dos NetworkManager distintos en la misma ruta es la enfermedad de las dos glib. + "networkmanager", ] # ── QUÉ ARRANCA (el «enable»; SDD 30 §3) ──────────────────────────────────────────────────────── @@ -724,6 +742,7 @@ servicios = [ # 2026-09-13: los dos que nacieron con `cups` y `bluez`. Sin esta línea la imagen los traía # instalados y apagados, que es la mitad inútil de tenerlos. "cupsd", "bluetoothd", + "NetworkManager", # 2026-09-13: el perfil no tenía gestor de red; ver el paquete arriba ] [perfil.escritorio-cosmic] @@ -934,6 +953,14 @@ paquetes = [ # este perfil y en COSMIC: habla `wlr-data-control`, que KWin y mutter NO implementan (mismo # muro que `wf-recorder`). Declararlo donde no funciona sería peor que no tenerlo. "cliphist", + # `networkmanager` (2026-09-13): este perfil no tenía CON QUÉ gestionar una red. La receta existía + # sólo en `incoming-kde` —inalcanzable desde acá— y además estaba construida con `-Dwifi=false`, + # porque allá se escribió para dar `libnm.so` a plasma-nm y nada más. La variante del CORPUS va + # con `-Dwifi=true` y con `nmcli` (el artefacto de KDE no lo trae, comprobado sobre el store), y + # delega el handshake WPA2 en el `wpa_supplicant` que `base` declara desde hoy. + # ⚠ NO declarar esto en `escritorio-kde`: allá `plasma-nm` ya arrastra la variante de la cola, y + # dos NetworkManager distintos en la misma ruta es la enfermedad de las dos glib. + "networkmanager", ] # ── QUÉ ARRANCA (el «enable»; SDD 30 §3) ──────────────────────────────────────────────────────── @@ -956,6 +983,7 @@ paquetes = [ servicios = [ "dbus-system", "logind-compat", "cupsd", "bluetoothd", "pipewire", "pipewire-pulse", "wireplumber", + "NetworkManager", # 2026-09-13 ] [perfil.escritorio-sway] @@ -1156,6 +1184,22 @@ paquetes = [ # pantalla. `swaymsg output` sirve si el compositor está vivo y configurado; esto es la # herramienta equivalente a xrandr para wlroots, y era otra hoja sellada sin perfil. "wlr-randr", + # `wireplumber` (2026-09-13): **el audio de esta imagen no encaminaba nada.** `pipewire` está y + # arranca, pero se construyó con `-Dsession-managers=[]`: sin gestor de sesión no hay política de + # qué es entrada, qué es salida ni qué se enlaza con qué — el sink que ve la aplicación es + # `auto_null`, o sea el nodo de descarte. Audio que parece vivo y no suena. + # Vive en el CORPUS —y no en esta cola— porque desde acá no se alcanza una cola hermana: las + # copias de `incoming-gnome` e `incoming-cosmic` eran invisibles para este perfil. Ver su receta: + # hay tres variantes vivas a propósito y consolidarlas es el trabajo siguiente. + "wireplumber", + # `networkmanager` (2026-09-13): este perfil no tenía CON QUÉ gestionar una red. La receta existía + # sólo en `incoming-kde` —inalcanzable desde acá— y además estaba construida con `-Dwifi=false`, + # porque allá se escribió para dar `libnm.so` a plasma-nm y nada más. La variante del CORPUS va + # con `-Dwifi=true` y con `nmcli` (el artefacto de KDE no lo trae, comprobado sobre el store), y + # delega el handshake WPA2 en el `wpa_supplicant` que `base` declara desde hoy. + # ⚠ NO declarar esto en `escritorio-kde`: allá `plasma-nm` ya arrastra la variante de la cola, y + # dos NetworkManager distintos en la misma ruta es la enfermedad de las dos glib. + "networkmanager", ] # ── QUÉ ARRANCA (el «enable»; SDD 30 §3) ──────────────────────────────────────────────────────── @@ -1178,6 +1222,8 @@ paquetes = [ servicios = [ "dbus-system", "cupsd", "bluetoothd", "pipewire", "pipewire-pulse", + # 2026-09-13: los dos que se destrabaron promoviendo al corpus lo que vivía en colas hermanas. + "wireplumber", "NetworkManager", ] [perfil.servidor] diff --git a/recipes/networkmanager.toml b/recipes/networkmanager.toml new file mode 100644 index 00000000..73b8b824 --- /dev/null +++ b/recipes/networkmanager.toml @@ -0,0 +1,106 @@ +# NetworkManager 1.52.0 — **la variante del CORPUS: el gestor de red de verdad, con WiFi.** +# +# ══ POR QUÉ EXISTE ESTA COPIA (2026-09-13) ═════════════════════════════════════════════════════ +# `incoming-kde/networkmanager.toml` se escribió para UN objetivo —dar `libnm.so` a +# networkmanager-qt → plasma-nm, el applet de KDE— y sus perillas lo dicen: **`-Dwifi=true`**. Eso +# es correcto ahí y es inservible en cualquier otro lado. Y desde GNOME, COSMIC o sway esa receta +# **no se alcanza**: una receta resuelve sibling-first y después el catálogo PADRE, nunca una cola +# hermana. Resultado medido en el barrido de perfiles: `networkmanager` figuraba SÓLO en +# `escritorio-kde`, y los otros tres escritorios no tenían con qué gestionar una red. +# +# ⇒ Esta copia va al corpus —el único sitio desde el que las cuatro imágenes la ven, el mismo +# argumento que `mpv`, `atuq` y `wireplumber`— y cambia DOS cosas respecto de la de KDE: +# +# 1. **`-Dwifi=true`.** Sin esto NM no maneja interfaces inalámbricas: el demonio arranca, el +# applet se dibuja y no hay una sola red que listar. Habla `nl80211` por `libnl` (ya era dep) y +# delega el handshake WPA2 en `wpa_supplicant`, que desde hoy está declarado en `perfil.base` +# — por eso va también en `[deps] runtime`: sin el supplicant, WiFi=true es un cartel. +# 2. **`-Dnmcli=true -Dreadline=libreadline` + `readline` en `[deps] build`.** Los tres, y hizo +# falta medirlo: con sólo la dep, `nmcli` NO se construyó (`-Dnmcli` vale `true` de fábrica, +# pero `-Dreadline` es un combo que por defecto va en `auto` y sin que nadie le diga dónde +# mirar resolvió a «none» ⇒ meson apagó el CLI en silencio). Se nombran los tres. El artefacto de la +# variante KDE NO trae `nmcli` —comprobado sobre el store, no deducido— así que promoverla tal +# cual habría dado un demonio sin con qué manejarlo. En sway eso es la diferencia entre tener +# red y no tenerla; en GNOME y COSMIC hay panel gráfico, pero el CLI es lo que funciona el día +# que el panel no arranca. +# +# ⚠ SE QUEDA `-Dcrypto=null`, y es una limitación REAL que conviene escribir: sin cripto NM no +# valida certificados **802.1X / WPA-Enterprise** (el WiFi de una oficina o universidad). WPA2-PSK +# —el de casa— funciona, porque ése lo hace `wpa_supplicant`, que a su vez va con `CONFIG_TLS=internal` +# por la misma razón. Encender nss o gnutls arrastra dos cadenas enormes (nspr/sqlite, o +# nettle/libtasn1/p11-kit): es su propia unidad de trabajo, no una perilla de paso. +# +# ⚠ Y hay DOS variantes vivas (corpus y `incoming-kde`) con hashes distintos, a propósito. No es la +# enfermedad de las dos glib: ninguna imagen hidrata las dos. KDE sigue con la suya porque su cadena +# —networkmanager-qt, plasma-nm— está sellada contra ese hash y re-apuntarla es trabajo del frente +# KDE, no de este barrido. +# +# Lo que sigue es la documentación original de la variante de KDE, de la que ésta es copia. +# +# El tarball NO está en download.gnome.org (sólo llega a 1.9.x; NM migró) ⇒ git-archive de +# gitlab.freedesktop.org. +# +# **-Dcrypto=null es la clave**: NM ofrece crypto ∈ {nss, gnutls, null}; 'null' evita nss (→nspr/sqlite) y +# gnutls (→nettle/libtasn1/p11-kit), dos cadenas enormes. Sin cripto no valida certificados 802.1X, pero +# libnm compila y la API D-Bus que usa networkmanager-qt es completa. +# +# Deps DURAS de NM (dependency() sin required:false): libudev (→ libudev-zero YA sellado, da libudev.so.1 +# + libudev.pc), libndp (receta nueva), gio-unix-2.0 (→ glib-shared, la deuda Capa 0 recién saldada). +# jansson/libpsl son required:false. Todo lo demás se apaga: sin daemon-extras (ovs/ppp/modem/wifi/nmtui/ +# teamdctl/ofono/cloud-setup), sin systemd (session_tracking=no, journal off), sin polkit/selinux/audit, +# sin introspection/docs/tests/ebpf/firewalld. +name = "networkmanager" +version = "1.52.0" +license = "GPL-2.0-or-later" + +[source] +tarball = "https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/archive/1.52.0/NetworkManager-1.52.0.tar.gz" +sha256 = "2ebe60a1497a9650d58336b73413d838189b04543365b3dbc22e1eb8023d205f" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = ''' +# meson.build:92 hace `find_program('xsltproc')` INCONDICIONAL (required por defecto), pero xsltproc sólo +# se usa en man/meson.build (páginas de manual), que no se construye con -Ddocs=false. Se degrada a +# required:false y así se evita la receta libxslt entera. (sed DIRECTO: el sandbox usa busybox grep, que +# no soporta --include.) +sed -i "s/xsltproc = find_program('xsltproc')/xsltproc = find_program('xsltproc', required: false)/" meson.build +PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release \ + -Ddefault_library=shared \ + -Dld_gc=false -Dconcheck=false -Dnmcli=false -Dreadline=none \ + -Dcrypto=null \ + -Dsystemdsystemunitdir=no \ + -Dsession_tracking=no -Dsession_tracking_consolekit=false -Dsuspend_resume=consolekit \ + -Dpolkit=false -Dselinux=false -Dsystemd_journal=false -Dlibaudit=no \ + -Dwifi=true -Dppp=false -Dmodem_manager=false -Dovs=false -Dnmtui=false -Dnmcli=true -Dreadline=libreadline -Dnm_cloud_setup=false \ + -Dteamdctl=false -Dofono=false -Debpf=false -Dfirewalld_zone=false -Dlibpsl=false \ + -Dintrospection=false -Ddocs=false -Dtests=no -Dvapi=false \ + -Dconfig_dhcp_default=internal -Dqt=false +''' +compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" +install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "glib-shared", "pcre2-shared", "libffi", "readline", + "libudev-zero", "libndp", "libnl", "zlib-shared", "gettext-tiny", "libxml2", "util-linux", "perl", "dbus", "expat"] + +# `wpa_supplicant` NO es dep de build (NM habla con él por D-Bus/control socket, no lo enlaza) y SÍ +# lo es de runtime: con `-Dwifi=true` y sin supplicant, NM enumera la interfaz y no puede asociarse. +# `readline-shared` no es capricho: `nmcli` sale con `NEEDED libreadline.so.8` y la `readline` +# canónica del corpus es sólo `.a` ⇒ sin declarar la variante compartida, el CLI viaja en la imagen +# y muere en el loader. Mismo trance que ya pagaron `cmus` y `bluez` esta misma jornada: la dep de +# BUILD (`readline`) y la de RUNTIME (`readline-shared`) son artefactos distintos. +runtime = ["wpa_supplicant", "readline-shared"] + +# El demonio. SDD 30: declararlo NO lo enciende — falta que el perfil lo habilite. +[[service]] +label = "NetworkManager" +id = "01HQAR53D4M2NBV8KZTYXFQA2B" +exec = "/usr/sbin/NetworkManager --no-daemon" +scope = "system" +restart = { initial_ms = 500, max_ms = 20000 }