Fixed
- Critical Correctness (#148):
parseIntEnvreplaced withstrconv.Atoito prevent silent integer overflow on 32-bit platformsformatSRVKeyusesfmt.Sprintfinstead ofstring(rune(int))which produced Unicode characters instead of numeric keys- Thread-safe DNS record
Catalog— all public methods now protected bysync.Mutex - Enum validation for
log_level,log_format, anddocker_modeconfig fields RemoveHostnamenormalizes hostname before operations (RFC 1035)- A record validation rejects IPv6 addresses (must use AAAA)
GetExistingRecordsuses case-insensitive comparison per RFC 1035
- Concurrency & Safety (#149):
_FILEsecret read failure is now a hard error — no longer silently falls through to direct env var- Signal handler registered early (before initialization) so SIGINT/SIGTERM during startup triggers graceful shutdown
- Reconciliation concurrency guard —
TryLockprevents overlapping reconciliation from timer + events SetEnabled/SetDryRunuseatomic.Boolfor thread-safe access from concurrent goroutines- Mass deletion circuit breaker — orphan cleanup aborts if >50% of known hostnames would be deleted
- Kubernetes
AddEventHandlererrors now propagated (previously logged and silently dropped) sync.WaitGroupensures periodic reconciliation goroutine completes during shutdown
- Provider & Security Hardening (#150):
- dnsmasq
GetServer()usesnet.SplitHostPort— correct IPv6 address parsing - Domain matcher strips trailing dots before comparison for consistent matching
- Pi-hole v6 URL path values escaped with
url.PathEscapeto prevent injection - dnsmasq reload command validated against shell metacharacters
- SSH
RunWithSudopipes password via stdin instead ofecho(no/procexposure) - HTTP response bodies capped at 10 MB via
httputil.ReadBodyacross all providers
- dnsmasq
- Documentation Alignment (#151):
- Added dnsmasq provider example to
config.example.yml - Documented
_FILEsuffix support forTSIG_SECRETandSSH_PASSWORD - Fixed
DNSWEAVER_SOURCE(singular) →DNSWEAVER_SOURCES(plural) in K8s deployment docs - Documented Kubernetes source auto-registration behavior
record-typeannotation and K8s source doc consistently list A, AAAA, CNAME, SRV, TXT
- Added dnsmasq provider example to
- Helm Chart: Bumped appVersion to 0.9.2
Docker Images
docker pull ghcr.io/maxfield-allison/dnsweaver:v0.9.2
docker pull docker.io/maxamill/dnsweaver:v0.9.2