gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

⎇ 7c794568a963b18b68d747959e6bbd07cf2ebff7 recipes/arje-logind-compat.toml TOML · 106 siq'ikuna · 6.8 KB Ñawpa willay ch'uya

feat(recetas): pata y churay entran al catálogo — «no hay pata» era que no existía el paquete 5ba9b5365 · Sergio ·

1# arje-logind-compat — el daemon shim D-Bus que se hace pasar por `org.freedesktop.login1`
2# (systemd-logind) para GNOME/KDE. NO es un stub: implementa el subset del `Manager` que los
3# escritorios consultan al arranque — ListSessions/ListSeats/ListUsers/GetSession(ByPID),
4# Inhibit/ListInhibitors, CanPowerOff/Reboot/Suspend/Hibernate + PowerOff/Reboot/Suspend/Hibernate,
5# propiedades IdleHint/BlockInhibited — y traduce cada llamada al bus interno del fractal arje.
6# Corre FUERA de PID 1 (un parser D-Bus en el Init es superficie de CVE), supervisado por el Ente #0.
7# Toma el DRM master vía el idioma TakeDevice (major 226) para que mutter/kwin sean master.
8#
9# ESTO ES lo que yo creía que faltaba: NO hace falta empaquetar elogind ni delegar nada a tawasuyu.
10# arje-compat ya provee login1. seatd sigue dando SÓLO asiento (DRM/input); login1 = sesiones, y es
11# esto. El frente GNOME (y KDE) enlazan/consultan login1 EN RUNTIME por D-Bus, no linkean libelogind:
12# no hace falta la C-ABI sd-login ni un módulo PAM, porque la sesión se registra por el bus interno
13# de arje (mirada-greeter → fractal), no por pam_systemd. Ver [[frente-gnome]] / [[frente-harkaq-jaula]].
14#
15# Receta Cargo (patrón arje-zero): fuente = monorepo tawasuyu a un commit PINEADO que carga el
16# `Cargo.lock` del workspace en raíz (el monorepo lo gitignora) ⇒ fetch vendorea `--locked` y el
17# build es `--offline` hermético y bit-reproducible. El commit es la rama
18# `selfhost/arje-zero-attest-lockfile` (06184e43): más nueva que la de arje-zero (9967b02c) porque
19# incluye el reorg `arje-compat` — el crate único con un binario por servicio que reemplaza los 15
20# crates dispersos de `compat/`. `-p arje-compat --bin arje-logind-compat` compila SÓLO este daemon.
21# Estático zig-cc (zbus sobre socket unix + tokio + nix; sin loader del host, como todo arje).
22#
23# YA NO ES HUB-ONLY (2026-09-14): la fuente pasó a `https://git.tawasuyu.net/…`, que el gitea sirve
24# PÚBLICO y sin credencial. Antes apuntaba a `gitea@git.tawasuyu.net` por SSH y el worker —que no
25# tiene ni debe tener esa clave— moría con «access rights». La URL es locator y NO entra en
26# `hash_inputs` (ADR 0013): el cambio se hizo con control y NINGÚN ArtifactHash se movió.
27name    = "arje-logind-compat"
28version = "0.0.1"
29license = "MIT"
30
31[source]
32# El `commit` es el identificador inmutable (la URL es sólo locator, no entra al hash).
33repo   = "https://git.tawasuyu.net/tawasuyu/tawasuyu.git"
34commit = "619431cac9753cd55d0f9e2d99ff8efe7fab651b"
35# El monorepo COMMITEA su propio `vendor/` — `[patch.crates-io] smithay = { path = "vendor/smithay" }`,
36# una copia parcheada de smithay que mirada necesita para el tearing. `cargo vendor` de takana escribe
37# en `vendor/` por defecto y lo pisaba: el build moría con
38# `failed to read /src/vendor/smithay/.cargo-checksum.json` al resolver la dep git de taffy. Se
39# vendorea a un subdir aparte. Ver [[takana-cargo-vendor-clobbers-project-vendor]].
40cargo_vendor_dir = ".hammer-cargo-vendor"
41
42[build]
43compiler = "zig-cc"
44target   = "x86_64-linux-musl"
45link     = "static"
46flags    = ["-p", "arje-compat", "--bin", "arje-logind-compat"]
47
48# ── La POLÍTICA D-Bus viaja con el artefacto, no con la imagen ──────────────────────────────────
49# El `system.conf` de dbus trae `<deny own="*"/>` por defecto: cada servicio de sistema aporta su
50# propio fichero de política, y el de login1 normalmente lo instala systemd. Acá no hay systemd, así
51# que hasta hoy lo escribía `scripts/gnome/qemu-desktop-image.sh` — con un TODO al lado diciendo que
52# ése no era su lugar. Y no lo era: **un servicio que no puede adueñarse de su nombre no es un
53# servicio**, así que la política es parte de lo que este paquete PROMETE, igual que el binario.
54# Dejarla en el script de una imagen significaba que cualquier otra imagen —metal, KDE, mirada— tenía
55# el daemon y no podía usarlo.
56#
57# `allow own` sólo a root (es quien lo lanza) y `send_destination` a cualquiera, porque mutter y el
58# resto consultan login1 sin ser root.
59#
60# La fase `install` REPLICA el default del lab para Cargo (copiar los ejecutables de target/release a
61# /usr/bin) y le agrega el fichero. Sobrescribir la fase es la única forma: el default no tiene un
62# gancho para material extra.
63[build.phases]
64install = '''
65set -e
66mkdir -p /out/usr/bin /out/usr/share/dbus-1/system.d
67find target/release -maxdepth 1 -type f -perm -100 -exec cp {} /out/usr/bin/ \;
68cat > /out/usr/share/dbus-1/system.d/org.freedesktop.login1.conf <<'XML'
69<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
70 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
71<busconfig>
72  <policy user="root">
73    <allow own="org.freedesktop.login1"/>
74  </policy>
75  <policy context="default">
76    <allow send_destination="org.freedesktop.login1"/>
77    <allow receive_sender="org.freedesktop.login1"/>
78  </policy>
79</busconfig>
80XML
81'''
82
83# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
84# `ARJE_LOGIN_STATE=1` NO es opcional y la razón está medida en `scripts/gnome/gnome-start-qemu.sh`:
85# es la perilla que hace que el daemon ESCRIBA `/run/systemd/{sessions,seats,users}`, que es lo que
86# libelogind LEE para resolver la C-ABI de sd-login. Su default es `off` porque en un host con
87# systemd real pisaría el estado del sistema; acá no hay systemd y el que la prende es el lanzador
88# de sesión. Sin ella mutter muere con "Failed to find any matching session".
89#
90# Va DESPUÉS del bus de sistema (registra `org.freedesktop.login1` ahí). Ese orden hoy lo garantiza
91# el script esperando el socket; en Cards lo daría el grafo de capacidades de arje, pero el
92# ordenamiento es por spawn y no por READINESS (SDD 30 §5) — el hueco está contado, no tapado.
93# ⚠ EL `argv` ESPERA AL BUS ANTES DEL `exec`, Y NO ES UNA MAÑA DE ESTA RECETA. arje ordena el
94# arranque por capacidades (orden topológico real), pero eso ordena el SPAWN, no el ESTAR LISTO: no
95# existe primitiva «esperá a que aparezca este socket» (DE-SYSTEMD-A-ARJE.md §13 lo lista como hueco
96# abierto). Sin la espera, este daemon puede arrancar antes de que dbus-daemon escuche y quedarse en
97# modo idle sin registrar nunca su nombre — un fallo que NO se ve: el proceso vive, el bus no lo
98# tiene. Mientras el hueco siga abierto la espera va DENTRO del card, a la vista en el argv y no
99# escondida en un wrapper, para que se pueda contar cuántos servicios la están pagando.
100[[service]]
101label   = "logind-compat"
102id      = "01HQAR53D4M2NBV8KZTYXFQA21"
103exec    = "/bin/busybox"
104argv    = ["sh", "-c", "i=0; while [ ! -S /run/dbus/system_bus_socket ] && [ $i -lt 100 ]; do i=$((i+1)); sleep 0.2; done; exec /usr/bin/arje-logind-compat"]
105envp    = [["ARJE_LOGIN_STATE", "1"]]
106restart = { initial_ms = 500, max_ms = 20000 }