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