`b3:932ba096…` proyectado en la caja y arrancado por arje SIN bwrap: `pid 11548 · uid=968 · exe=/usr/sbin/squid`, con la cuenta `proxy` que declara la receta. La instancia `qorpa/squid` se borró — el manifiesto es descartable por diseño (ADR 0015 D3) y esto es para lo que existía. El arreglo de esta tanda: **`--disable-log-daemon-helpers` compilaba perfecto y no arrancaba**. El default de `access_log` es `daemon:`, asi que sin `log_file_daemon` squid muere con `FATAL: logfile_daemon /usr/lib/squid/log_file_daemon: (2) No such file or directory`. Sellaba, hasheaba y pasaba `-k parse` — se ve SOLO levantando el servicio con la config real. Familia [[subcomando-sin-driver]]. El control que lo caza, y que corre en el hub antes de tocar produccion: con la config REAL del origen y en un puerto aparte, arranque completo + CONNECT a claude.ai y api.anthropic.com con TCP_TUNNEL/200 + el access.log escrito por el log daemon + `basic_ncsa_auth` leyendo el `passwd` de verdad (control negativo: clave mala ⇒ `ERR Wrong password`). Los DOS primeros intentos de esta receta habrian llegado a produccion sin ese control: el binario estaba sellado y el hash era estable las dos veces. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
130 lines
9.4 KiB
TOML
130 lines
9.4 KiB
TOML
# squid 7.7 — el proxy de salida (forward proxy) con autenticación básica y ACLs por IP.
|
|
#
|
|
# ── POR QUÉ ENTRA AL CORPUS (SDD 28 §6.2 y §6.27) ──────────────────────────────────────────────
|
|
# Es uno de los servicios que la mudanza de gioser tiene que PRODUCIR como receta, no sólo mover:
|
|
# en la caja vieja corre sobre binarios de Artix y nadie sabría reconstruirlo. El 2026-09-15 se
|
|
# levantó primero dentro de una jaula `qorpa` porque estaba en uso —`CONNECT api.anthropic.com` y
|
|
# `claude.ai` en el minuto anterior— y eso lo destrabó en minutos; esta receta es la respuesta
|
|
# definitiva, y cuando esté proyectada la instancia se tira. La diferencia con `php-fpm`, que se
|
|
# queda enjaulado para siempre, es que squid es C++ y el lab lo construye.
|
|
#
|
|
# ── LA FUENTE VIENE DE GITHUB, Y NO ES CAPRICHO ────────────────────────────────────────────────
|
|
# `https://www.squid-cache.org/Versions/v7/squid-7.7.tar.xz` **devuelve 200 con una página HTML de
|
|
# 8985 bytes**, no el tarball. Un `sha256` sobre eso habría quedado pineado a una página de error,
|
|
# que es la forma más tonta de anclar una fuente. El release de GitHub sí trae el tarball de
|
|
# distribución (con `configure` ya generado: no hace falta autoreconf ni autotools del lab).
|
|
# La URL es locator y no entra en `hash_inputs` (ADR 0013 §1) ⇒ espejarla después es gratis.
|
|
#
|
|
# ── LAS PERILLAS, Y POR QUÉ CADA GRUPO ─────────────────────────────────────────────────────────
|
|
# · `--enable-auth-basic=NCSA` y nada más de auth: la config de producción usa exactamente
|
|
# `basic_ncsa_auth` contra un fichero `passwd`. Negotiate/NTLM/Digest arrastran krb5, SASL y LDAP.
|
|
# · `--without-openssl`: el proxy no hace ssl-bump ni `https_port`; un `CONNECT` es un túnel ciego y
|
|
# no necesita TLS de este lado. Menos superficie y una dep menos.
|
|
# · `--disable-arch-native`: el default ya es ese, y se escribe igual porque es la perilla que
|
|
# hornearía la ISA del builder — el SIGILL en otra CPU que ya costó una vez (ver la nota de
|
|
# `-mcpu=baseline` en el sandbox).
|
|
# · `--disable-eui` / `--disable-snmp` / `--disable-wccp*` / `--disable-htcp` / `--disable-icap-client`:
|
|
# protocolos de red que este proxy no habla. `eui` además quiere las cabeceras de ARP del sistema.
|
|
# · `--disable-translation`: las páginas de error localizadas se GENERAN con `po2html`, que el lab
|
|
# no trae. El inglés sale igual.
|
|
# · ⚠ `--enable-log-daemon-helpers=file` **no es opcional aunque suene a extra**: el default de
|
|
# `access_log` es `daemon:/var/log/squid/access.log`, y sin ese helper squid arranca, avisa… y
|
|
# muere con `FATAL: logfile_daemon /usr/lib/squid/log_file_daemon: (2) No such file or directory`.
|
|
# La primera versión de esta receta lo apagaba junto al resto de los helpers y sólo se vio al
|
|
# levantar el servicio con la config real — nunca al construir. Los que sí sobran (DB, reescritura
|
|
# de URL, ACL externas) siguen apagados.
|
|
name = "squid"
|
|
version = "7.7"
|
|
license = "GPL-2.0-or-later"
|
|
|
|
[source]
|
|
tarball = "https://github.com/squid-cache/squid/releases/download/SQUID_7_7/squid-7.7.tar.xz"
|
|
sha256 = "e3bd613b91b1c498ec2992276063342a85cd6edddd5521294e04f44bc055da9b"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "static"
|
|
# Split de la info de depuración (SDD 23): squid sin strip son decenas de megas de DWARF.
|
|
strip_debug = true
|
|
|
|
[build.phases]
|
|
configure = '''
|
|
./configure --build=$CBUILD --host=$CHOST --prefix=/usr \
|
|
--sysconfdir=/etc/squid --libexecdir=/usr/lib/squid --datadir=/usr/share/squid \
|
|
--localstatedir=/var --with-logdir=/var/log/squid --with-swapdir=/var/cache/squid \
|
|
--with-pidfile=/run/squid.pid --with-default-user=proxy \
|
|
--disable-arch-native --disable-strict-error-checking --disable-translation \
|
|
--enable-auth-basic=NCSA --disable-auth-digest --disable-auth-negotiate --disable-auth-ntlm \
|
|
--disable-external-acl-helpers --disable-url-rewrite-helpers --disable-storeid-rewrite-helpers \
|
|
--enable-log-daemon-helpers=file --disable-security-cert-validators --disable-security-cert-genrators \
|
|
--disable-icap-client --disable-snmp --disable-wccp --disable-wccpv2 --disable-eui --disable-htcp \
|
|
--without-openssl --without-gnutls --without-nettle --without-cap --without-systemd \
|
|
--without-ldap --without-sasl --without-gss --without-mit-krb5 --without-heimdal-krb5 \
|
|
--without-tdb --without-cppunit
|
|
# ⚠ EL `libtool` GENERADO AÑADE `--export-dynamic` SOLO, y eso desactiva el enlace estático.
|
|
# Ver la nota larga de `compile`: el wrapper del lab quita `-static` de cualquier enlace que
|
|
# mencione `--export-dynamic`, y libtool lo añade por su cuenta en cuanto hay un `-dlopen` —o sea
|
|
# que no alcanza con sacarlo de `squid_LDFLAGS`. Se vacía la plantilla en el `libtool` generado,
|
|
# que es local a este build y no toca la fuente. Con guarda: si el campo no aparece, ABORTA, porque
|
|
# un `sed` que no acierta deja pasar el problema y el binario sale dinámico sin que nada falle.
|
|
grep -q '^export_dynamic_flag_spec=' libtool || {
|
|
echo 'squid: el libtool generado no declara export_dynamic_flag_spec — revisar antes de sellar' >&2
|
|
exit 1
|
|
}
|
|
sed -i 's|^export_dynamic_flag_spec=.*|export_dynamic_flag_spec=|' libtool
|
|
'''
|
|
# ── DOS COSAS EN LA LÍNEA DE ENLACE, Y LA SEGUNDA SÓLO SE VE MIRANDO EL BINARIO ────────────────
|
|
# `-all-static`: squid enlaza CON LIBTOOL, que lee el `-static` del lab como «preferí mis `.a`» y
|
|
# NO como flag del enlazador ⇒ `link = "static"` se ignoraría en silencio y el binario saldría
|
|
# dinámico. Es el patrón de curl/jq/parted, y la trampa está medida en
|
|
# [[link-static-mentira-libtool]]. Va también en `install` porque libtool RELINKEA al instalar.
|
|
#
|
|
# ⚠ `squid_LDFLAGS=`: el `Makefile.am` de squid declara `squid_LDFLAGS = -export-dynamic -dlopen
|
|
# force` (línea 562) para los módulos de eCAP, que acá están apagados. Y **el wrapper del lab quita
|
|
# `-static` de cualquier enlace que mencione `--export-dynamic`** —a propósito, para que las
|
|
# extensiones `.so` de Python y compañía se puedan enlazar—, así que ese flag de squid desactivaba
|
|
# el estático del proyecto entero. MEDIDO: el primer sellado dio un `squid` **dinámico con
|
|
# `NEEDED libc.so`** mientras sus helpers salían estáticos, lo que además lo hace inerte en
|
|
# cualquier imagen sin cargador ([[needed-colgante-libstdcxx]]). Redefinir la variable por línea de
|
|
# comandos es la vía de automake para anular flags por-objetivo sin parchear la fuente.
|
|
#
|
|
# ⚠⚠ Y se queda `-dlopen force`, que parecía sobrar: vaciar la variable ENTERA rompe el enlace con
|
|
# `undefined symbol: lt__PROGRAM__LTX_preloaded_symbols`. Ese símbolo lo emite el propio libtool en
|
|
# el `squidS.o` que genera **porque hay un `-dlopen`**, y `libltdlc.a` lo referencia siempre. O sea:
|
|
# de los dos flags, el que estorba es `-export-dynamic` y el otro es estructural. Sale una sola
|
|
# medición distinguirlos, y adivinar cuesta un build entero.
|
|
compile = 'make -j"$(nproc)" LDFLAGS="-all-static -no-pie" squid_LDFLAGS="-dlopen force"'
|
|
install = 'make DESTDIR=/out install LDFLAGS="-all-static -no-pie" squid_LDFLAGS="-dlopen force"'
|
|
|
|
[deps]
|
|
build = ["binutils"]
|
|
|
|
# ── LA CUENTA (SDD 30) ──────────────────────────────────────────────────────────────────────────
|
|
# Un proxy que atiende la red pública no corre como root: squid baja de privilegio al usuario que
|
|
# le fijó `--with-default-user`. Si la cuenta no existe, el `setuid` falla y squid muere; por eso el
|
|
# servicio de abajo lo comprueba y sale 78 nombrándolo, en vez de dejar un bucle de reinicios.
|
|
[[user]]
|
|
name = "proxy"
|
|
uid = 968
|
|
home = "/var/cache/squid"
|
|
|
|
# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
|
|
# Fuera de `hash_inputs`: declarar esto NO re-hashea squid.
|
|
#
|
|
# ⚠ La CONFIG no viene acá y es a propósito: `squid.conf`, el `passwd` de los usuarios y las ACL de
|
|
# IPs son datos del SITIO —en gioser son 412 K con tres cuentas y 40 IPs autorizadas— y viajan con
|
|
# la mudanza, no con el paquete. El servicio arranca sólo si están, y lo dice.
|
|
#
|
|
# ⚠ `-N` (sin daemonizar) porque el supervisor es arje: un servicio que se va a segundo plano deja
|
|
# al init cuidando un proceso que ya murió. `-YC` es lo que corría en gioser y se conserva.
|
|
[[service]]
|
|
label = "squid"
|
|
id = "01M2EKDA00SQ7D5X2KB9WHNT4P"
|
|
exec = "/bin/busybox"
|
|
argv = ["sh", "-c", "test -f /etc/squid/squid.conf || { echo 'squid: falta /etc/squid/squid.conf — es config del SITIO (con su `passwd` y sus ACL), viene con la mudanza y no con el paquete' >&2; exit 78; }; /bin/grep -q '^proxy:' /etc/passwd || { echo 'squid: no existe el usuario `proxy` en /etc/passwd y squid NO se queda como root' >&2; exit 78; }; mkdir -p /var/log/squid /var/cache/squid; chown proxy:proxy /var/log/squid /var/cache/squid; exec /usr/sbin/squid -YC -f /etc/squid/squid.conf -N"]
|
|
envp = [["PATH", "/usr/bin:/bin"], ["HOME", "/var/cache/squid"], ["USER", "proxy"]]
|
|
networking = "full"
|
|
cgroup = "arje.slice/squid"
|
|
restart = { initial_ms = 1000, max_ms = 30000 }
|