Tres cosas, y las tres quitan vueltas. 1. NO HACE FALTA NINGUNA CREDENCIAL EN EL WORKER, Y TAMPOCO UN USUARIO NUEVO `tawasuyu/tawasuyu` y `sergio/takana` son repos PÚBLICOS en el gitea. Las 23 recetas que apuntaban a `gitea@git.tawasuyu.net` (SSH, que exige la clave que es el SSH de todo) pasan a `https://git.tawasuyu.net/…`. La URL es locator y NO entra en `hash_inputs` (ADR 0013): hecho con control antes/después, **ningún ArtifactHash se movió**. Medido en el worker: `git clone --mirror --filter=blob:none` + `git archive` extrae el árbol (155 M) **sin una sola credencial**. Un usuario propio en gitea sólo haría falta para un repo PRIVADO; hoy ninguna receta usa uno. Si mañana hace falta, es una cuenta de máquina con acceso al repo que toque — nunca la clave personal. De paso, tres recetas decían «HUB-ONLY: el worker secretless recibe Connection refused». Ya no es cierto y el comentario decía lo contrario de lo que pasa: corregido en las tres. 2. LA COPIA FUERA LA DA LA MUDANZA, NO GITHUB (decisión del usuario) El «paso 1: espejar los 26 repos» deja de ser el paso 1. En cuanto el gitea vive en la caja nueva, esos repos dejan de existir sólo en la máquina que se borra — que es lo que el paso pedía. El objetivo es dejar de pagar dos máquinas, no sumar una dependencia. `espejar-repos.sh` queda como herramienta disponible. 3. EL §9 REESCRITO: qué está hecho, qué falta y en qué orden Hecho y cerrado: la caja arranca takana puro · store/grafos/granja/respaldo · repo firmado · la imagen del perfil servidor con gitea sirviendo 200 supervisado por arje · `arjectl` · y el ensayo con los datos REALES de gioser corriendo sobre takana. Falta, en orden: actualizar la caja a la imagen nueva (`upgrade`, no `dd`) → mudar los datos del gitea (`.backup` + rsync, con el origen parado en el corte) → caddy con los 6 dominios vivos → DNS → verificar desde fuera con un clone real → el resto de servicios del censo → borrar gioser con las 8 puertas en verde. Bloqueantes con su tamaño: `git` sellado sin `remote-http` (afecta a clonar DESDE una caja takana, no al gitea que sirve; re-sella una raíz de `base`) y la puerta 5, que no bloquea la mudanza. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn
102 lines
6.3 KiB
TOML
102 lines
6.3 KiB
TOML
# arje-polkit-compat — el shim de `org.freedesktop.PolicyKit1.Authority` del fractal.
|
|
#
|
|
# POR QUÉ HACE FALTA, y es un diagnóstico que su propio autor ya había escrito: el comentario del
|
|
# crate dice literalmente «apps que usan polkit bloquean en `CheckAuthorization` si no responde
|
|
# nadie». Eso es exactamente lo que pasaba al arrancar la sesión GNOME:
|
|
#
|
|
# !! bus: org.freedesktop.Accounts NO apareció en 10s
|
|
# !! bus: org.freedesktop.UPower NO apareció en 10s
|
|
# nombres en el bus: org.freedesktop.DBus, org.freedesktop.login1, :1.0, :1.1, :1.2
|
|
#
|
|
# Los dos daemons estaban CONECTADOS al bus (`:1.x`) pero sin adquirir su nombre: se quedaban en
|
|
# `polkit_authority_get_sync()` esperando a un `org.freedesktop.PolicyKit1` que no existía. Y como no
|
|
# adquirían el nombre, gnome-shell esperaba 25 s a cada uno.
|
|
#
|
|
# **Ese dato no se sacó del log del daemon sino de la LISTA DE NOMBRES DEL BUS**: una conexión anónima
|
|
# sin nombre bien conocido dice «arrancó y no llegó a pedirlo», que es distinto de «no arrancó» y de
|
|
# «lo pidió y se lo negaron». Vale para cualquier servicio D-Bus que parezca colgado.
|
|
#
|
|
# POR QUÉ ESTE SHIM Y NO EL polkitd DE VERDAD: nuestra receta `polkit` va con `-Dlibs-only=true` —el
|
|
# bloque `if not libs_only` es justo el que pide expat y duktape— y la decisión estaba tomada desde
|
|
# entonces: **el demonio lo pone arje**. La autorización real del fractal no es polkit sino SO_PEERCRED
|
|
# + capability grants sobre el bus interno; polkit es sólo la interfaz que el escritorio espera
|
|
# encontrar.
|
|
#
|
|
# ⚠ POSTURA DE SEGURIDAD, explícita porque no es un detalle: este shim responde
|
|
# `is_authorized = true` a TODO, y deja traza en el log de qué se pidió. Es la decisión que arje ya
|
|
# había tomado —el fractal es un sistema confiado y la puerta está en otro lado—, no algo que esta
|
|
# receta introduzca. Su propio comentario marca el camino de producción: que `CheckAuthorization` pida
|
|
# un token al grafo y devuelva el resultado. Mientras eso no exista, **cualquier cliente de polkit en
|
|
# esta distro está autorizado**, y quien lea esta receta tiene que saberlo.
|
|
#
|
|
# YA NO ES HUB-ONLY (2026-09-14): la fuente pasó a `https://git.tawasuyu.net/…`, que el gitea sirve
|
|
# PÚBLICO y sin credencial. Antes apuntaba a `gitea@git.tawasuyu.net` por SSH y el worker —que no
|
|
# tiene ni debe tener esa clave— moría con «access rights». La URL es locator y NO entra en
|
|
# `hash_inputs` (ADR 0013): el cambio se hizo con control y NINGÚN ArtifactHash se movió.
|
|
name = "arje-polkit-compat"
|
|
version = "0.0.1"
|
|
license = "MIT"
|
|
|
|
[source]
|
|
# Mismo commit y misma rama que arje-logind-compat: `selfhost/arje-zero-attest-lockfile` es la única
|
|
# que versiona el `Cargo.lock` de la raíz, sin el cual el vendoreo `--locked` no es reproducible.
|
|
repo = "https://git.tawasuyu.net/tawasuyu/tawasuyu.git"
|
|
commit = "98db584fd28d9ff2bf34c9cf7d7db2e1de0b3fd0"
|
|
# El monorepo commitea su propio `vendor/` (la copia parcheada de smithay que mirada necesita) y el
|
|
# `cargo vendor` de takana lo pisaría. Ver [[takana-cargo-vendor-clobbers-project-vendor]].
|
|
cargo_vendor_dir = ".hammer-cargo-vendor"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "static"
|
|
flags = ["-p", "arje-compat", "--bin", "arje-polkit-compat"]
|
|
|
|
# ── La POLÍTICA D-Bus viaja con el artefacto ───────────────────────────────────────────────────
|
|
# Misma razón que en arje-logind-compat: un servicio que no puede adueñarse de su nombre no es un
|
|
# servicio, así que su política es parte de lo que el paquete promete. Hasta hoy la escribía el script
|
|
# de la imagen de GNOME, con lo cual el shim existía para las otras imágenes y no servía en ellas.
|
|
#
|
|
# ⚠ EL NOMBRE `zz-` NO ES DECORATIVO. A diferencia de login1, acá el nombre YA TIENE política: la trae
|
|
# el artefacto de `polkit`, y permite `own` sólo al usuario **polkitd** — este shim corre como root, así
|
|
# que con ella sola se lo niegan. dbus lee `system.d` en ORDEN ALFABÉTICO y las reglas posteriores
|
|
# ganan, de modo que un fichero que ordene después AÑADE el permiso sin descartar el resto de la
|
|
# política de upstream (que además trae las reglas de `AuthenticationAgent`). Reescribir la de polkit
|
|
# habría sido pisar un artefacto sellado.
|
|
[build.phases]
|
|
install = '''
|
|
set -e
|
|
mkdir -p /out/usr/bin /out/usr/share/dbus-1/system.d
|
|
find target/release -maxdepth 1 -type f -perm -100 -exec cp {} /out/usr/bin/ \;
|
|
cat > /out/usr/share/dbus-1/system.d/zz-arje-polkit-compat.conf <<'XML'
|
|
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
|
|
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
|
<!-- Añade a la política de polkit el permiso que el shim del fractal necesita: la de upstream sólo
|
|
deja adueñarse del nombre al usuario `polkitd`, y arje-polkit-compat corre como root. -->
|
|
<busconfig>
|
|
<policy user="root">
|
|
<allow own="org.freedesktop.PolicyKit1"/>
|
|
</policy>
|
|
<policy context="default">
|
|
<allow send_destination="org.freedesktop.PolicyKit1"/>
|
|
<allow receive_sender="org.freedesktop.PolicyKit1"/>
|
|
</policy>
|
|
</busconfig>
|
|
XML
|
|
'''
|
|
|
|
# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
|
|
# ⚠ EL `argv` ESPERA AL BUS ANTES DEL `exec`, Y NO ES UNA MAÑA DE ESTA RECETA. arje ordena el
|
|
# arranque por capacidades (orden topológico real), pero eso ordena el SPAWN, no el ESTAR LISTO: no
|
|
# existe primitiva «esperá a que aparezca este socket» (DE-SYSTEMD-A-ARJE.md §13 lo lista como hueco
|
|
# abierto). Sin la espera, este daemon puede arrancar antes de que dbus-daemon escuche y quedarse en
|
|
# modo idle sin registrar nunca su nombre — un fallo que NO se ve: el proceso vive, el bus no lo
|
|
# tiene. Mientras el hueco siga abierto la espera va DENTRO del card, a la vista en el argv y no
|
|
# escondida en un wrapper, para que se pueda contar cuántos servicios la están pagando.
|
|
[[service]]
|
|
label = "polkit-compat"
|
|
id = "01HQAR53D4M2NBV8KZTYXFQA22"
|
|
exec = "/bin/busybox"
|
|
argv = ["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-polkit-compat"]
|
|
restart = { initial_ms = 500, max_ms = 20000 }
|