Some checks failed
Docker image builds / build (push) Waiting to run
Asset Build Verification / asset_verification (push) Has been cancelled
Docs deploy / build (push) Has been cancelled
Go Mod Tidy Check / go_mod_tidy_check (push) Has been cancelled
Go / go_tests (push) Has been cancelled
Package builds (unstable) / package_builds (push) Has been cancelled
Smoke tests / smoke-test (default-config-macro) (push) Has been cancelled
Smoke tests / smoke-test (docker-registry) (push) Has been cancelled
Smoke tests / smoke-test (double_slash) (push) Has been cancelled
Smoke tests / smoke-test (forced-language) (push) Has been cancelled
Smoke tests / smoke-test (git-clone) (push) Has been cancelled
Smoke tests / smoke-test (git-push) (push) Has been cancelled
Smoke tests / smoke-test (healthcheck) (push) Has been cancelled
Smoke tests / smoke-test (i18n) (push) Has been cancelled
Smoke tests / smoke-test (log-file) (push) Has been cancelled
Smoke tests / smoke-test (nginx) (push) Has been cancelled
Smoke tests / smoke-test (palemoon/amd64) (push) Has been cancelled
Smoke tests / smoke-test (robots_txt) (push) Has been cancelled
Check Spelling / Check Spelling (push) Has been cancelled
SSH CI / ssh (aarch64-16k) (push) Has been cancelled
SSH CI / ssh (aarch64-4k) (push) Has been cancelled
SSH CI / ssh (ppc64le) (push) Has been cancelled
SSH CI / ssh (riscv64) (push) Has been cancelled
zizmor / zizmor latest via PyPI (push) Has been cancelled
70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
package dns
|
|
|
|
import (
|
|
"log/slog"
|
|
"time"
|
|
|
|
"git.sad.ovh/sophie/nuke/lib/store"
|
|
|
|
_ "git.sad.ovh/sophie/nuke/lib/store/all"
|
|
)
|
|
|
|
type DnsCache struct {
|
|
forward store.JSON[[]string]
|
|
reverse store.JSON[[]string]
|
|
forwardTTL time.Duration
|
|
reverseTTL time.Duration
|
|
}
|
|
|
|
func NewDNSCache(forwardTTL int, reverseTTL int, backend store.Interface) *DnsCache {
|
|
return &DnsCache{
|
|
forward: store.JSON[[]string]{
|
|
Underlying: backend,
|
|
Prefix: "forwardDNS",
|
|
},
|
|
reverse: store.JSON[[]string]{
|
|
Underlying: backend,
|
|
Prefix: "reverseDNS",
|
|
},
|
|
forwardTTL: time.Duration(forwardTTL) * time.Second,
|
|
reverseTTL: time.Duration(reverseTTL) * time.Second,
|
|
}
|
|
}
|
|
|
|
func (d *Dns) getCachedForward(host string) ([]string, bool) {
|
|
if d.cache == nil {
|
|
return nil, false
|
|
}
|
|
if cached, err := d.cache.forward.Get(d.ctx, host); err == nil {
|
|
slog.Debug("DNS: forward cache hit", "name", host, "ips", cached)
|
|
return cached, true
|
|
}
|
|
slog.Debug("DNS: forward cache miss", "name", host)
|
|
return nil, false
|
|
}
|
|
|
|
func (d *Dns) getCachedReverse(addr string) ([]string, bool) {
|
|
if d.cache == nil {
|
|
return nil, false
|
|
}
|
|
if cached, err := d.cache.reverse.Get(d.ctx, addr); err == nil {
|
|
slog.Debug("DNS: reverse cache hit", "addr", addr, "names", cached)
|
|
return cached, true
|
|
}
|
|
slog.Debug("DNS: reverse cache miss", "addr", addr)
|
|
return nil, false
|
|
}
|
|
|
|
func (d *Dns) forwardCachePut(host string, entries []string) {
|
|
if d.cache == nil {
|
|
return
|
|
}
|
|
d.cache.forward.Set(d.ctx, host, entries, d.cache.forwardTTL)
|
|
}
|
|
|
|
func (d *Dns) reverseCachePut(addr string, entries []string) {
|
|
if d.cache == nil {
|
|
return
|
|
}
|
|
d.cache.reverse.Set(d.ctx, addr, entries, d.cache.reverseTTL)
|
|
}
|