Files
mesh-catalog/modules/dhcpcd
jochen 73d6a51325 Give /etc/resolv.conf to the uplink's holder (hq ADR 0223)
The program that manages a machine's network is the one that would rewrite
the resolver file, so its module now writes it: networkmanager,
systemd-networkd and dhcpcd render the same template from the resolver's
holders. resolv-conf declares nothing for one release, so every machine
hands the file over in one apply; it is removed once unassigned everywhere.
2026-10-05 23:39:13 +02:00
..

dhcpcd

The uplink seat's module for a machine whose own network is dhcpcd's (novox/hq ADR 0117). It asks two things of dhcpcd, and nothing else: leave the resolver file to the mesh, and leave the private network's interface alone — and it writes that resolver file itself (ADR 0223). It never declares an interface, an address, a route, a wireless network or its credentials — the link dhcpcd keeps is the only channel the mesh reaches the machine over.

What it writes

/etc/resolv.conf, whole: every resolver of the mesh by its private address — this machine's own first when it holds one — and options timeout:1 attempts:2 edns0, rendered by the mesh from the holders of mesh-dns-resolver. The same file every uplink module writes. Not dhcpcd's own static domain_name_servers: dhcpcd writes the file only through its hook, with its own header, and reads its configuration only at its next start, so a change to the mesh's resolvers would not reach the file until then.

Two lines into /etc/dhcpcd.conf, as the mesh's marked region (into: block) — dhcpcd reads no drop-in directory, so the mesh writes into its one file rather than over it (ADR 0102):

  • nohook resolv.conf — dhcpcd's resolv.conf hook rewrites /etc/resolv.conf on every lease it takes or renews, which would silently replace the resolvers this module writes there.
  • denyinterfaces mesh0 — dhcpcd never asks for a lease on the private network's interface, and never takes it down. dhcpcd leaves a point-to-point interface alone by default; this says so rather than relying on it.

At the start of the file (at: start). Both are global options, and dhcpcd reads every line after an interface or ssid line as that interface's own. A configured machine's file ends in exactly such a block (the interface, its static address), so appended at the end these two would quietly apply to one interface only.

Why it declares no service

dhcpcd is the machine's, not the mesh's. The mesh never starts, stops or enables it: stopping it drops the address the machine is reached at, and a module unassigned by mistake must not be able to do that. And there is nothing to reload it with — dhcpcd.service reports CanReload=no, and a restart drops the lease. So the two lines take effect at dhcpcd's next start.

On an adopted machine that is normally no gap: the predecessor wrote the same nohook line, and it is already in force. On a machine that was not adopted, it is one: until dhcpcd next starts (a reboot, or the operator restarting it in a window of their choosing), a lease renewal still rewrites /etc/resolv.conf, and this module puts it back at the next push. Restart dhcpcd once, by hand, when losing the link for a moment is acceptable.

One manager per machine

It claims node-uplink: a machine runs one network manager, and assigning a second module that claims the seat is refused. Assigning this one to a machine whose network is NetworkManager's installs the package and writes the two lines, and starts nothing.