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.
50 lines
3.0 KiB
Markdown
50 lines
3.0 KiB
Markdown
# 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.
|