Files
theta-agent/hosts_override_unix.go
wmantly b2ad8f4844 feat(discovery): Windows local-discovery + local route pinning + prompt reconnect
Completes the mDNS local-discovery feature on Windows (was Linux-only since
v2.1.2). Three parts:

1. Windows hosts override (hosts_override_windows.go): %SystemRoot%...\\hosts,
   CRLF-aware read/write, ipconfig /flushdns after each change. The agent runs
   as a SYSTEM service so elevation is a non-issue. hosts_override.go split
   into shared rewrite logic + platform files; the hosts tests now run the real
   Windows write path on CI instead of skipping.

2. Local route pinning (local_route*.go): the hosts override only fixes name
   resolution -- the packet path is the routing table's job. If the WG mesh
   tunnel is up with AllowedIPs covering the LAN (or full-tunnel 0.0.0.0/0) it
   swallows the direct connection. Discovery now pins a /32 host route via the
   owning local interface (route.exe metric 1 on Windows, ip route replace on
   Linux) and drops it on revert. Closes a gap in the shipped Linux path too.

3. Prompt reconnect: apply/revert signals the WS loop so it reconnects
   immediately instead of waiting out the 5s backoff.

Route/hosts code is injectable + unit tested; go test passes natively on
Windows (this machine), and linux/amd64 + windows/arm64 cross-builds are clean.
2026-08-10 17:24:21 -07:00

29 lines
1.0 KiB
Go

//go:build !windows
package main
// Unix hosts override (Linux today; macOS slots in here later with its own
// dscacheutil -flushcache flush -- see AGENT_LOCAL_DISCOVERY_SPEC.md).
// hostsFilePathUnix is a var, not a const, so tests can point it at a temp
// file instead of touching the real /etc/hosts.
var hostsFilePathUnix = "/etc/hosts"
func hostsFilePath() string { return hostsFilePathUnix }
func hostsEOL() string { return "\n" }
// flushDNSOnHostsChange is a no-op on Linux: resolvers read /etc/hosts per
// lookup, and nscd/systemd-resolved -- where present -- pick up hosts edits
// without an explicit flush. (macOS will need dscacheutil -flushcache here.)
func flushDNSOnHostsChange() {}
// setTestHostsPath points hostsFilePath() at a temp file for tests and
// returns a restore func. Exists in both platform files so the shared test
// code can compile everywhere.
func setTestHostsPath(path string) (restore func()) {
prev := hostsFilePathUnix
hostsFilePathUnix = path
return func() { hostsFilePathUnix = prev }
}