feat: bake dig/ldapsearch/xxd and refresh the stale pi-extensions rootfs floor

Two changes that share one forced base rebuild, hence one commit.

1. THREE PACKAGES, each closing a capability gap measured during the
   gitea.egl.lan/FreeIPA work on 2026-09-09..10 rather than a preference:

   bind9-dnsutils (~6.1 MB measured) -- dig/host/nslookup were ALL absent,
   so the container could resolve names but had no way to interrogate a
   SPECIFIC nameserver. `getent hosts` only follows the resolver's default
   path, so diagnosing "gateway 172.16.88.1 NXDOMAINs the egl.lan zone
   while 10.20.253.1 is authoritative for it" had to be hand-rolled in
   python3. Split-horizon DNS is a recurring class of bug on this fleet.
   Note the package name: plain `dnsutils` is transitional in trixie.

   ldap-utils (1244 KB, pulls nothing extra) -- the fleet authenticates
   against FreeIPA, yet every LDAP probe had to be run by SSHing to an
   already-enrolled host. Simple binds only; GSSAPI would additionally
   need krb5-user + libsasl2-modules-gssapi-mit, deliberately not added
   as that is a Kerberos-client decision, not a tool.

   xxd (198 KB) -- convenience for verifying git-crypt blob magic in
   myconfigs; `od -c` from coreutils already does the same job.

   netcat-openbsd was in the original proposal and is deliberately NOT
   here: measured redundant, because socat is already baked and bash's
   /dev/tcp does reachability checks with zero packages (verified against
   gitea.egl.lan:3000). Recorded in the Dockerfile so the omission reads
   as a decision rather than an oversight.

2. ROOTFS FLOOR REFRESH: rootfs/.../pi-extensions/SKILL.md was 34284 B,
   unchanged since fa04d20 (2026-07-30), while the canonical package copy
   is 38973 B. Dockerfile.variant copies the fresh package copy over the
   SERVED path at build time but never writes back to this floor, so the
   floor is a silent fallback: if that build-time copy is ever absent it
   ships the July skill with no log line or manifest flag to say which
   version deployed. Refreshed from pi-extensions@c64c122, verified
   byte-identical to both the canonical and the runtime-served copies.

Why one commit: the base_tag hash folds in `cat Dockerfile.base` AND
`find rootfs -type f | xargs cat` (.gitea/workflows/docker-publish.yml),
so either change alone forces the same full base rebuild -- and that
rebuild is precisely what re-bakes rootfs/ as it then stands. Emulating
the workflow hash with a fixed toolkit ref: f3d6462c7416 -> fc4edda03c54.

Verified: scripts/check-base-hash.sh passes (no new ARG *_REF added), and
no shell scripts are touched so the lint-shell gate is unaffected. Sizes
and dependency fan-out measured via apt-get --no-install-recommends
--dry-run on Debian 13 trixie.
This commit is contained in:
Joakim Persson
2026-09-10 18:56:11 +02:00
parent 15a3728ae9
commit ecfd2fc2e5
2 changed files with 114 additions and 2 deletions
+43
View File
@@ -122,6 +122,46 @@ ENV DEBIAN_FRONTEND=noninteractive
# are already present. NOTE this file feeds the base-decide
# hash (Dockerfile.base + rootfs/), so adding it forces one
# full base rebuild.
# bind9-dnsutils — `dig` and `nslookup`. Added 2026-09-10 to close a
# DIAGNOSTIC gap measured during the gitea.egl.lan/FreeIPA
# work: the container could resolve names but had NO way to
# ask a SPECIFIC nameserver anything. `getent hosts` only
# follows the resolver's default path, so the whole "gateway
# 172.16.88.1 returns NXDOMAIN for the egl.lan zone while
# 10.20.253.1 is authoritative for it" diagnosis had to be
# hand-rolled in python3 — dig, host AND nslookup were all
# absent. `dig @10.20.253.1 freeipa-4.egl.lan` is the
# one-liner that replaces it, and split-horizon DNS is a
# recurring class of bug on this fleet, not a one-off. NOTE
# the package to name is bind9-dnsutils: plain `dnsutils` is
# a transitional package in trixie. ~6.1 MB total (6210 KB
# measured): bind9-dnsutils 721 KB + bind9-host 161 KB +
# bind9-libs 3804 KB plus 7 small libs (libfstrm0,
# libjson-c5, liblmdb0, libmaxminddb0, libprotobuf-c1,
# liburcu8t64, libuv1t64) under --no-install-recommends.
# ldap-utils — `ldapsearch`/`ldapmodify`. Added 2026-09-10. This fleet
# authenticates against FreeIPA (EGL.LAN), and every LDAP
# probe during the Gitea auth work had to be run by SSHing to
# an already-enrolled host because the container had no LDAP
# client at all. 1244 KB and pulls NOTHING extra under
# --no-install-recommends — its deps (libldap, libsasl2) are
# already present. CAVEAT: this gives SIMPLE binds only,
# which is what Gitea itself uses and what most probes need.
# GSSAPI binds (`ldapsearch -Y GSSAPI`) additionally require
# krb5-user + libsasl2-modules-gssapi-mit, deliberately NOT
# added here — that is a Kerberos-client decision with
# /etc/krb5.conf implications, not just a tool.
# xxd — hex dump. 198 KB, no extra deps. Convenience, and honestly
# marginal: `od -c` from coreutils is always present and does
# the same job. Earned its place because verifying that
# git-crypt actually encrypted a staged blob (the \0GITCRYPT\0
# magic) is a recurring check in myconfigs and xxd is the
# muscle-memory command for it.
# NOT added — netcat-openbsd (133 KB): measured redundant on
# 2026-09-10, because socat is already baked above AND bash's
# /dev/tcp does reachability checks with zero packages
# (verified against gitea.egl.lan:3000). Recorded here so the
# omission reads as a decision rather than an oversight.
RUN apt-get update && \
apt-get upgrade -y --no-install-recommends && \
apt-get install -y --no-install-recommends \
@@ -163,6 +203,9 @@ RUN apt-get update && \
kitty-terminfo \
ncurses-term \
iproute2 \
bind9-dnsutils \
ldap-utils \
xxd \
&& ln -s /usr/bin/fdfind /usr/local/bin/fd \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*