`targets.toml` declaraba `chrony`, `cronie` y `logrotate` como raíces del perfil `servidor` con el
motivo escrito al lado, y ninguna tenía receta: el grafo las contaba como `wanted` y ésa era toda la
deuda que le quedaba al perfil. Ahora sellan las cuatro (popt es la hoja que `logrotate` exige:
incluye `<popt.h>` en la primera pantalla y su configure aborta sin él).
servidor 97/97 → 101/101 listo, falta 0. `wanted` desaparece de los totales.
Lo que se midió, no se supuso:
· logrotate estático, CERO NEEDED, corre, y las rutas de gzip quedan en `/bin` — que es donde
busybox las deja de verdad; el default de upstream en Linux es `/usr/bin/gzip`, que en esta
distro NO EXISTE y habría fallado en runtime diciendo «no se pudo comprimir».
· chrony `+CMDMON +REFCLOCK +RTC +PRIVDROP +IPV6`; `cap_set_proc` está en el ELF, o sea que
libcap entró de verdad y chronyd suelta privilegios. Sale `-NTS -SECHASH` a propósito: NTS
necesita nettle o gnutls y ninguna está en el corpus.
· cronie los cuatro binarios estáticos sin NEEDED, con inotify dentro, y `/bin/vi` pineado.
**El hilo que recorre las tres recetas es el mismo, y es el que valía la pena escribir:** los tres
`configure` DECIDEN MIRANDO EL LAB. `logrotate` trae `--with-selinux/--with-acl` en `[default=check]`;
`chrony` prueba nettle, gnutls, libcap, seccomp y editline; `cronie` resuelve el editor de
`crontab -e` con `AC_PATH_PROG([vi])` y lo graba en el binario. El lab NO entra en `hash_inputs` ⇒
dos labs distintos sellarían bytes distintos en la MISMA dirección del store y nada lo notaría.
Cada palanca va fijada en la receta —que sí entra en el hash— para que sea una decisión y no un
accidente del entorno.
Y una anotada en vez de tapada: cronie no reemplaza al `crond` de busybox por reflejo (busybox ya lo
pone en `/sbin`); agrega `@reboot`, crontabs por usuario, `/etc/cron.d` y anacron. Cuál va en cada
imagen es decisión de perfil — lo que faltaba era que la opción existiera en el corpus.
53 lines
3.0 KiB
TOML
53 lines
3.0 KiB
TOML
# logrotate 3.22.0 — la rotación de logs. Es la última de las tres raíces que `targets.toml` declara
|
|
# para el perfil `servidor` y que no tenían receta: el grafo las contaba como `wanted` y la deuda del
|
|
# perfil era exactamente ésa. El motivo escrito allí sigue valiendo: en una caja que sirve, el log de
|
|
# acceso crece hasta llenar el disco, y Caddy rota el suyo por configuración pero nada más lo hace.
|
|
#
|
|
# DOS DEFAULTS DE `configure` QUE SE PINEAN A PROPÓSITO, y no por prolijidad:
|
|
#
|
|
# 1. **`--with-selinux=no --with-acl=no`.** Los dos vienen con `[default=check]`, o sea que el
|
|
# contenido del binario depende de si el LAB tiene `libselinux`/`libacl` instaladas. El lab NO
|
|
# entra en `hash_inputs` (deuda conocida del repo): dos labs distintos sellarían bytes distintos
|
|
# en la MISMA dirección del store y nada lo notaría. Fijarlo en `no` lo vuelve una decisión de la
|
|
# receta —que sí entra en el hash— en vez de un accidente del entorno. Y `no` es lo correcto acá:
|
|
# la distro no lleva SELinux ni ACLs POSIX.
|
|
#
|
|
# 2. **`--with-compress-command` / `--with-uncompress-command`.** `configure.ac` elige la ruta por
|
|
# sistema operativo y en Linux fija `/usr/bin/gzip`, que en esta distro NO EXISTE: el `gzip` y el
|
|
# `gunzip` los provee busybox y quedan en `/bin` (comprobado en el artefacto sellado de busybox).
|
|
# Un logrotate con `compress` en la config fallaría en runtime buscando un binario ausente, y el
|
|
# error sería «no se pudo comprimir», no «la ruta está mal». Se pinean a `/bin/…`.
|
|
#
|
|
# **Lo que NO se pinea, y por qué se deja anotado:** el `mail command` queda en su default
|
|
# `/bin/mail`, que en esta distro NO existe — busybox provee `sendmail`, no `mail`. No se cambia a
|
|
# `/bin/sendmail` porque no es un reemplazo: logrotate lo invoca como `mail -s <asunto> <destino>` y
|
|
# la interfaz de busybox es otra. Sólo afecta a configuraciones que usen la directiva `mail`, que la
|
|
# distro hoy no tiene; queda dicho para que se descubra leyendo y no en runtime.
|
|
#
|
|
# `--with-state-file-path` se deja en su default (`/var/lib/logrotate.status`): es ruta de ESTADO en
|
|
# la máquina viva, no algo que la imagen deba decidir.
|
|
#
|
|
# `link = "static"`: binario monolítico, como el resto de las herramientas de sistema. popt publica
|
|
# sólo `.a` justo para que acá no aparezca un NEEDED colgante.
|
|
name = "logrotate"
|
|
version = "3.22.0"
|
|
license = "GPL-2.0-or-later"
|
|
|
|
[source]
|
|
tarball = "https://github.com/logrotate/logrotate/releases/download/3.22.0/logrotate-3.22.0.tar.xz"
|
|
sha256 = "42b4080ee99c9fb6a7d12d8e787637d057a635194e25971997eebbe8d5e57618"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "static"
|
|
flags = []
|
|
|
|
[build.phases]
|
|
configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --with-selinux=no --with-acl=no --with-compress-command=/bin/gzip --with-uncompress-command=/bin/gunzip'
|
|
compile = 'make -j"$(nproc)"'
|
|
install = "make install DESTDIR=/out && find /out -name '*.la' -delete"
|
|
|
|
[deps]
|
|
build = ["binutils", "busybox", "make", "pkgconf", "popt"]
|