`planear.py --revisar` sobre el censo ordena lo que queda, y lo primero no eran los servicios del usuario sino TRES CAPACIDADES que ninguna metrica reclama: el disparador periodico, la hora y la rotacion de logs. Los tres paquetes ya estaban sellados y declarados en `perfil.servidor` desde que ese perfil nacio — lo que faltaba era el eslabon que los ARRANCA, igual que con squid. · `chronyd`: la caja iba **15 s atrasada** y nadie la corregia. Ahora stratum 3 contra los NTP de Hetzner, 0,000005 s de NTP. Sin hora no hay TLS ni firmas, y el sintoma no se parece a la causa. · `crond`: no existia el latido. Verificado con una entrada `* * * * *` en el crontab REAL. · `logrotate`: `/var/log/squid` sin rotar. Diario, con `squid -k rotate` (squid mantiene los ficheros abiertos: un rename a secas lo deja escribiendo en un inode que nadie puede leer). · `scripts/respaldo-gitea.sh` + `17 3 * * *`: cierra el hueco del §6.15 — los 44 repos vivian en UNA copia y el respaldo se hacia a mano. Sube 23+21 repos (1,5 G) y un `gitea.db` de 332 M tomado con `.backup`, consistente con el servidor vivo. El control no es que el script salga 0: es CONTAR los repos de los dos lados. `chrony` y `cronie` NO declaraban `[[service]]` — el paquete llegaba a la imagen y no lo arrancaba nadie. Ahora lo declaran (fuera de `hash_inputs`: los hashes no se movieron) y el perfil los habilita. TRES MEDICIONES que valen mas que el resultado: 1. **La deriva era de gioser, no de la caja**: despues de sincronizar, el HUB quedo 3 s adelantado. Medir «contra el otro» sin un tercero no dice quien esta mal. 2. **El spool de cronie es `/var/spool/cron/<usuario>`**, no `…/crontabs/<usuario>`: `crontab -l` mostraba las entradas y `crontabs/` estaba vacio. Un crontab restaurado en el sitio equivocado es un fichero perfecto que nadie lee. 3. 🧨 **`sqlite3` seguia INERTE en la caja** (`compressBound: symbol not found`): el ultimo de los 23 del §6.4. Le faltaba `zlib-shared`, sellado y declarado en `perfil.base` desde el 11-09 — pero la caja se instalo antes. Sin el no habia snapshot consistente. Un paquete declarado no es un paquete instalado: en una caja viva vale lo que el `upgrade` proyecto. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
86 lines
5.3 KiB
TOML
86 lines
5.3 KiB
TOML
# cronie 1.7.2 — el disparador periódico. Es la tercera y última de las raíces que `targets.toml`
|
|
# declaraba para el perfil `servidor` sin receta detrás. El motivo escrito allí es directo: en una
|
|
# distro sin systemd no hay timers, y el latido de la granja son tres líneas de crontab.
|
|
#
|
|
# **Y busybox YA trae un `crond` — esto no lo reemplaza por reflejo.** El artefacto sellado de
|
|
# busybox pone `crond` en `/sbin`. Lo que cronie agrega y busybox no tiene: `@reboot`, crontabs por
|
|
# usuario con `crontab -e`, `/etc/cron.d`, `cronnext`, y `anacron` para las tareas que hay que
|
|
# recuperar cuando la máquina estuvo apagada. Cuál de los dos va en cada imagen es una decisión de
|
|
# perfil, no de esta receta; lo que hacía falta era que la opción EXISTIERA en el corpus en vez de
|
|
# descubrirse ausente el día que alguien la necesite.
|
|
#
|
|
# ⚠ EL DEFAULT QUE HABÍA QUE PINEAR SÍ O SÍ: `--with-editor`. Sin él, `configure.ac` hace
|
|
# `AC_PATH_PROG([vi])` — o sea que la ruta del editor que `crontab -e` lanza SALE DE BUSCAR `vi` EN
|
|
# EL LAB, y queda grabada en el binario con `AC_DEFINE_UNQUOTED`. El lab no entra en `hash_inputs`:
|
|
# dos labs con `vi` en rutas distintas sellarían bytes distintos en la MISMA dirección del store y
|
|
# nada lo notaría. Se fija en `/bin/vi`, que además es donde busybox lo deja de verdad (comprobado
|
|
# en su artefacto sellado); el fallback de autoconf era `/usr/bin/vi`, que en esta distro no existe.
|
|
#
|
|
# Lo demás son palancas de cosas que el corpus no tiene, apagadas explícitamente por la misma razón
|
|
# —que el probe no salga del entorno— y no porque estorben:
|
|
# --without-pam no hay Linux-PAM en el corpus. La autorización de `crontab` cae entonces a
|
|
# `/etc/cron.allow` + `/etc/cron.deny`, que es el mecanismo clásico y no
|
|
# necesita nada más.
|
|
# --without-selinux la distro no lleva SELinux.
|
|
# --without-audit no hay libaudit.
|
|
# --with-inotify esto se ENCIENDE: con inotify, crond se entera de un crontab editado sin
|
|
# esperar al minuto siguiente. Es una API del kernel, no una dep nueva.
|
|
# --enable-syscrontab `/etc/crontab` y `/etc/cron.d`, que es por donde entra el latido de la granja.
|
|
#
|
|
# `link = "static"`: binarios monolíticos como el resto de las herramientas de sistema.
|
|
#
|
|
# La licencia es compuesta y no se adivina: el grueso (`src/cron.c` y compañía) es ISC de Vixie/ISC,
|
|
# y `anacron` —que se construye— trae su propio `COPYING.anacron`, GPLv2-or-later.
|
|
name = "cronie"
|
|
version = "1.7.2"
|
|
license = "ISC AND GPL-2.0-or-later"
|
|
|
|
[source]
|
|
tarball = "https://github.com/cronie-crond/cronie/releases/download/cronie-1.7.2/cronie-1.7.2.tar.gz"
|
|
sha256 = "f1da374a15ba7605cf378347f96bc8b678d3d7c0765269c8242cfe5b0789c571"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "static"
|
|
flags = []
|
|
|
|
[build.phases]
|
|
configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc --localstatedir=/var --sbindir=/usr/sbin --with-editor=/bin/vi --with-inotify --without-pam --without-selinux --without-audit --enable-syscrontab'
|
|
compile = 'make -j"$(nproc)"'
|
|
install = "make install DESTDIR=/out && find /out -name '*.la' -delete"
|
|
|
|
[deps]
|
|
build = ["binutils", "busybox", "make", "pkgconf"]
|
|
|
|
# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
|
|
# Fuera de `hash_inputs`: declarar esto NO re-hashea cronie.
|
|
#
|
|
# ⚠ SIN DISPARADOR PERIÓDICO UN SERVIDOR NO TIENE LATIDO, y eso no lo canta ninguna métrica: la
|
|
# caja se ve perfecta —todo sellado, todo sirviendo— y no rota un log, no renueva nada por su
|
|
# cuenta y no respalda nada. En la mudanza de gioser se descubrió al revés: el `crond` del origen
|
|
# era el que disparaba la cosecha, el respaldo y la poda, y el destino no tenía NADA equivalente.
|
|
# Es la misma familia que la lección de `foot`, pero de una CAPACIDAD, no de un paquete.
|
|
#
|
|
# `-n` (foreground) porque el supervisor es arje: un daemon que se va a segundo plano deja al init
|
|
# cuidando un proceso que ya murió. `-P` deja el PATH del entorno en vez de reescribirlo.
|
|
#
|
|
# ⚠ La guarda mira el DIRECTORIO de spool, no un fichero: un `crond` sin `/var/spool/cron` arranca
|
|
# igual y no ejecuta nada — un latido que late en el vacío es peor que uno ausente, porque parece
|
|
# que está.
|
|
#
|
|
# ⚠ Y el spool de ESTA cronie es `/var/spool/cron/<usuario>`, NO `/var/spool/cron/crontabs/<usuario>`
|
|
# (medido en la caja: `crontab -l` mostraba las entradas y `crontabs/` estaba vacío). La diferencia
|
|
# importa el día que alguien restaure un crontab a mano en el sitio equivocado: quedaría un fichero
|
|
# perfecto que nadie lee. El control que lo decide es el único que vale — meter una entrada
|
|
# `* * * * *` en el crontab REAL y ver si dispara.
|
|
[[service]]
|
|
label = "crond"
|
|
id = "01M2EKDA00CR0N1EDAEM0N5QZ8"
|
|
exec = "/bin/busybox"
|
|
argv = ["sh", "-c", "mkdir -p /var/spool/cron /etc/cron.d; test -d /var/spool/cron || { echo 'crond: no pude crear /var/spool/cron — sin spool no ejecuta NADA y arranca igual' >&2; exit 78; }; exec /usr/sbin/crond -n -P"]
|
|
envp = [["PATH", "/usr/sbin:/usr/bin:/sbin:/bin"], ["HOME", "/root"], ["USER", "root"], ["SHELL", "/bin/sh"]]
|
|
networking = "full"
|
|
cgroup = "arje.slice/crond"
|
|
restart = { initial_ms = 1000, max_ms = 30000 }
|