b2ad8f4844
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.
29 lines
1.0 KiB
Go
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 }
|
|
}
|