diff --git a/docs/state/servicios.txt b/docs/state/servicios.txt new file mode 100644 index 00000000..9a22bdc5 --- /dev/null +++ b/docs/state/servicios.txt @@ -0,0 +1,59 @@ +servicios por imagen · medido 2026-09-12T11:12:49Z +── autoprueba del vigía (el primer caso es el CONTROL, tiene que pasar) + ✓ CONTROL: declarado, habilitado y la receta en el perfil + ✓ habilitado y NADIE lo declara + ERROR sshd: habilitado por el perfil y NINGUNA receta lo declara + ✓ dos recetas DEL PERFIL declaran el mismo label + ERROR sshd: lo declaran 2 recetas DEL PERFIL (openssh, dropbear) + AVISO sshd: `openssh` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + AVISO sshd: `dropbear` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + ✓ lo declara una receta que NO está en el perfil + ERROR sshd: lo declara(n) openssh, que NO pertenece(n) al perfil ⇒ el card apuntaría a un binario que la imagen no trae + ✓ mismo label en DOS COLAS, sólo una en el perfil ⇒ NO es colisión + ✓ servicio de SESIÓN ⇒ avisa pero no rompe + AVISO pipewire: es de SESIÓN (`pipewire`) — hoy lo lanza el script de sesión, no arje: fuera de mirada nadie entrega cards de sesión (SDD 30 §4c) + ✓ la INVERSA: en la imagen, trae demonio, nadie lo arranca ⇒ AVISO + AVISO sshd: `openssh` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + TODAS OK +── base + AVISO dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + (el perfil no arranca ningún servicio) +── cli + AVISO dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + (el perfil no arranca ningún servicio) +── escritorio-cosmic + AVISO dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + AVISO logind-compat: `arje-logind-compat` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + AVISO pipewire: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + AVISO pipewire-pulse: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + AVISO wireplumber: `wireplumber` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + (el perfil no arranca ningún servicio) +── escritorio-gnome + AVISO pipewire: es de SESIÓN (`pipewire`) — hoy lo lanza el script de sesión, no arje: fuera de mirada nadie entrega cards de sesión (SDD 30 §4c) + AVISO pipewire-pulse: es de SESIÓN (`pipewire`) — hoy lo lanza el script de sesión, no arje: fuera de mirada nadie entrega cards de sesión (SDD 30 §4c) + AVISO wireplumber: es de SESIÓN (`wireplumber`) — hoy lo lanza el script de sesión, no arje: fuera de mirada nadie entrega cards de sesión (SDD 30 §4c) + dbus-system dbus /usr/bin/dbus-daemon + logind-compat arje-logind-compat /usr/bin/arje-logind-compat + polkit-compat arje-polkit-compat /usr/bin/arje-polkit-compat + accounts-daemon accountsservice /usr/libexec/accounts-daemon + upowerd upower /usr/libexec/upowerd + colord colord /usr/libexec/colord + pipewire pipewire /usr/bin/pipewire + pipewire-pulse pipewire /usr/bin/pipewire-pulse + wireplumber wireplumber /usr/bin/wireplumber +── escritorio-kde + AVISO dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + AVISO pipewire: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + AVISO pipewire-pulse: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + AVISO upowerd: `upower` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + (el perfil no arranca ningún servicio) +── escritorio-mirada + (el perfil no arranca ningún servicio) +── escritorio-sway + AVISO dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + AVISO pipewire: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + AVISO pipewire-pulse: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + (el perfil no arranca ningún servicio) +── servidor + AVISO dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca + sshd openssh /bin/busybox diff --git a/scripts/farm/cosecha-cron.sh b/scripts/farm/cosecha-cron.sh index db47e201..d95ae806 100755 --- a/scripts/farm/cosecha-cron.sh +++ b/scripts/farm/cosecha-cron.sh @@ -376,6 +376,28 @@ if [ -x "$HAMMER" ]; then && echo " sonames.txt ✓ $(grep -c 'FALTA' docs/state/sonames.txt) hueco(s) sin proveedor" \ || echo " ⚠ vigia-sonames.py falló" + # ── VIGÍA DE SERVICIOS (2026-09-12, SDD 30 §4a) ────────────────────────────────────────────── + # Contesta la pregunta que ni el grafo ni `vigia-sonames` contestan: no «¿está sellado?» ni + # «¿arranca el binario?» sino **«¿hay alguien que lo LEVANTE?»**. Un demonio puede estar sellado, + # con contenido, con todos sus sonames resueltos… y que ninguna imagen lo arranque nunca. + # + # Va al latido por la misma lección que dejó escrita `vigia-sonames` doce líneas más arriba —un + # vigía que hay que acordarse de invocar no se distingue de no tenerlo— y con más motivo: su + # entrada son DOS ficheros que cambian por separado (las recetas y `targets.toml`), así que la + # divergencia entre «declarado» y «habilitado» aparece sin que nadie toque el vigía. + # + # Corre PRIMERO su propio `--selftest`: si el guardián está roto, su silencio no es una respuesta. + { echo "servicios por imagen · medido $(ts)" + echo "── autoprueba del vigía (el primer caso es el CONTROL, tiene que pasar)" + python3 scripts/targets.py --selftest 2>&1 | sed 's/^/ /' + for perf in $(python3 scripts/targets.py --lista 2>/dev/null | awk '{print $1}'); do + echo "── $perf" + python3 scripts/targets.py --services "$perf" 2>&1 | sed 's/^/ /' + done + } > work/.servicios.tmp 2>&1 && mv work/.servicios.tmp docs/state/servicios.txt \ + && echo " servicios.txt ✓ $(grep -c '^ ERROR' docs/state/servicios.txt) error(es), $(grep -c '^ AVISO' docs/state/servicios.txt) aviso(s)" \ + || echo " ⚠ vigía de servicios falló" + echo " static-audit: puerta diaria abierta, barriendo el store (~8 min, nice 19)…" nice -n 19 scripts/static-audit.sh > work/.static-audit.salida 2>&1 audit_rc=$? @@ -407,13 +429,13 @@ fi # 4. Commitear SÓLO el estado firme (el avance que el humano sigue). Recetas nuevas que YO autoré se # commitean aparte, a mano, para no meter autoría a medias en un commit de cron. if [ "${NO_COMMIT:-}" != "1" ]; then - git add docs/state/subcomandos.txt docs/state/raices.txt docs/state/sonames.txt docs/state/build-state.json docs/state/build-state-kde.json docs/state/build-state-gnome.json docs/state/build-state-cosmic.json docs/state/build-state-wlr.json docs/state/drenaje.json docs/state/fuentes-vigia.json docs/state/kernel-contract.txt docs/state/static-audit.txt docs/state/keystones.json docs/state/duplicados.json 2>/dev/null || true + git add docs/state/subcomandos.txt docs/state/raices.txt docs/state/sonames.txt docs/state/servicios.txt docs/state/build-state.json docs/state/build-state-kde.json docs/state/build-state-gnome.json docs/state/build-state-cosmic.json docs/state/build-state-wlr.json docs/state/drenaje.json docs/state/fuentes-vigia.json docs/state/kernel-contract.txt docs/state/static-audit.txt docs/state/keystones.json docs/state/duplicados.json 2>/dev/null || true if ! git diff --cached --quiet 2>/dev/null; then # ⚠ ACOTADO POR PATHSPEC (`-- `), no sólo por el `git add` de arriba: el índice es # estado COMPARTIDO y `git commit` a secas commitea el índice ENTERO, así que lo que otro # agente dejara en `git add` viajaría dentro del commit del cron. Es la regla 2 de CLAUDE.md, # y acá pesa más que en ningún lado: esto corre desatendido cada 30 min mientras se trabaja. - git commit -q -m "estado: cosecha granja $(ts) — avance del árbol KDE" -- docs/state/subcomandos.txt docs/state/raices.txt docs/state/sonames.txt docs/state/build-state.json docs/state/build-state-kde.json docs/state/build-state-gnome.json docs/state/build-state-cosmic.json docs/state/build-state-wlr.json docs/state/drenaje.json docs/state/fuentes-vigia.json docs/state/kernel-contract.txt docs/state/static-audit.txt docs/state/keystones.json docs/state/duplicados.json 2>/dev/null \ + git commit -q -m "estado: cosecha granja $(ts) — avance del árbol KDE" -- docs/state/subcomandos.txt docs/state/raices.txt docs/state/sonames.txt docs/state/servicios.txt docs/state/build-state.json docs/state/build-state-kde.json docs/state/build-state-gnome.json docs/state/build-state-cosmic.json docs/state/build-state-wlr.json docs/state/drenaje.json docs/state/fuentes-vigia.json docs/state/kernel-contract.txt docs/state/static-audit.txt docs/state/keystones.json docs/state/duplicados.json 2>/dev/null \ && { git push -q origin main 2>/dev/null && echo "==> estado commiteado+pusheado" \ || echo "==> estado commiteado (push falló, reintenta próximo ciclo)"; } else