tawasuyu

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

⎇ 4a2801331696245af7df3cccbbac5da68360bf98 recipes/opensmtpd.toml TOML · 82 siq'ikuna · 5.1 KB Ñawpa willay ch'uya

opensmtpd: la familia «correo» estaba vacía — y la colisión de símbolos se CONTÓ antes de arreglarla f52205af3 · Sergio ·

1# OpenSMTPD 7.8.0p1 — el servidor de correo. Cierra la tercera de las cuatro familias que la tabla
2# de `scripts/mudanza/planear.py` daba VACÍAS en el catálogo («correo»: ni postfix, ni exim, ni
3# opensmtpd). Una familia vacía no se descubre leyendo: se descubre el día que la mudanza llega a
4# ese servicio y se para.
5#
6# ⚠ **CUÁL DE LOS TRES ES UNA DECISIÓN, Y ACÁ ESTÁ EL MOTIVO PARA PODER DISCUTIRLA.** No es gusto:
7#
8#   · **postfix** asume glibc en varios sitios (NIS, `nsswitch`, su propio `dict_nis`), su árbol son
9#     ~250 kLOC y su configuración son dos ficheros con cientos de parámetros. Portarlo a musl es un
10#     frente, no una receta.
11#   · **exim** tiene una configuración que es literalmente un lenguaje de programación con listas de
12#     ACL; su superficie de configuración ha sido su fuente histórica de CVEs.
13#   · **OpenSMTPD** viene de OpenBSD: separación de privilegios POR DISEÑO (procesos `smtpd`/`queue`
14#     con usuarios distintos, que es justo lo que el `--with-user-*` de abajo configura), ~40 kLOC,
15#     licencia ISC, y una `smtpd.conf` útil entra en cinco líneas. Y lo más importante para acá: su
16#     rama «portable» existe precisamente para construirse fuera de OpenBSD, así que musl es un
17#     objetivo previsto y no una aventura.
18#
19# Si alguien necesita las tablas MySQL/LDAP de postfix, ésta no sirve y hay que discutirlo — pero se
20# discute con la razón delante en vez de descubrir la ausencia en la mudanza.
21#
22# ⚠ **`--with-libfts` NO ES OPCIONAL Y CASI NO SE VE.** `fts(3)` —recorrer un árbol de directorios—
23# está en glibc y **NO en musl**. El corpus tiene `musl-fts` sellada exactamente para este hueco. Si
24# no se pasa, `configure` la BUSCA en el entorno: otra decisión que saldría del LAB, que no entra en
25# `hash_inputs`. Se declara como dep y se apunta la ruta a mano.
26#
27# `--without-libbsd`: no hay libbsd en el corpus, y `configure` la usaría si la encontrara.
28# **PAM queda apagado** (no se pasa `--with-auth-pam`): no hay Linux-PAM en el corpus, así que la
29# autenticación SMTP sale de `smtpd.conf` con una tabla de credenciales, que es el camino nativo de
30# OpenSMTPD. `--with-table-db` queda en su default `no`: pide Berkeley DB, que tampoco está.
31#
32# **Los usuarios `_smtpd`/`_smtpq` NO EXISTEN todavía en la distro**, igual que el `chrony` de
33# `recipes/chrony.toml`. Se dejan en su nombre canónico a propósito: son lo que la documentación de
34# OpenSMTPD y cualquier runbook nombran, y cambiarlos por `root` sería peor —tiraría la separación de
35# privilegios, que es la razón principal para elegir este servidor—. Crearlos es parte de armar la
36# imagen, no de esta receta; hasta entonces `smtpd` no arranca, y eso es ruidoso y correcto.
37name    = "opensmtpd"
38version = "7.8.0p1"
39license = "ISC"
40
41[source]
42tarball = "https://github.com/OpenSMTPD/OpenSMTPD/releases/download/7.8.0p1/opensmtpd-7.8.0p1.tar.gz"
43sha256  = "f473b1b32e3440f28669419466d1e6ff037cf6b228769979135a4fb39060e3c3"
44
45[build]
46compiler = "zig-cc"
47target   = "x86_64-linux-musl"
48link     = "static"
49flags    = []
50
51[build.phases]
52# ⚠ **`-Dtls_free=…` NO ES UN APAÑO A CIEGAS: ES UNA COLISIÓN MEDIDA, Y ES EXACTAMENTE UNA.**
53#
54# OpenSMTPD-portable trae su propia **libtls** (la envoltura TLS de LibreSSL) en
55# `openbsd-compat/libtls/`, porque la necesita cuando se construye contra OpenSSL en vez de LibreSSL.
56# Y OpenSSL 3 define, en su capa de récords (`ssl/record/methods/tls_common.c`), una función INTERNA
57# que se llama igual. Enlazando estático las dos caen en el mismo binario:
58#
59#     ld.lld: error: duplicate symbol: tls_free
60#       defined at ../../openbsd-compat/libtls/tls.c:708
61#       defined at ssl/record/methods/tls_common.c:1473  in archive /usr/lib/libssl.a
62#
63# Antes de elegir el arreglo se CONTÓ el solapamiento en vez de suponerlo — comparando los símbolos
64# globales definidos por los `.o` de la libtls bundleada contra los de `libssl.a`:
65#
66#     nm -g --defined-only openbsd-compat/libtls/*.o | … | sort -u  →  158 símbolos
67#     comm -12 <esos> <los de libssl.a>                             →  **1**:  tls_free
68#
69# Uno. Por eso el arreglo es renombrar ése y nada más. El `-D` se aplica a TODA la compilación de
70# OpenSMTPD, así que renombra a la vez la definición, la declaración de `tls.h` y todos los usos —
71# consistente por construcción; la de OpenSSL vive en un `.a` ya compilado y no se toca. Es seguro
72# porque esa libtls es INTERNA a este build: nadie enlaza contra ella desde fuera.
73#
74# Si el solapamiento hubiera sido de docenas de símbolos, el arreglo correcto era otro —traer
75# LibreSSL al corpus, que es contra lo que upstream construye—, y por eso se midió primero. Queda
76# dicho para que el día que OpenSSL sume otro choque se vuelva a contar en vez de apilar `-D`s.
77configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc/smtpd --without-libbsd --without-rpath --with-libfts=/usr --with-mantype=man --with-cppflags=-Dtls_free=opensmtpd_tls_free'
78compile   = 'make -j"$(nproc)"'
79install   = "make install DESTDIR=/out && find /out -name '*.la' -delete"
80
81[deps]
82build = ["binutils", "busybox", "make", "pkgconf", "libevent", "openssl", "zlib", "musl-fts"]