aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-01-11 13:48:54 +0100
committerMartin Polden <mpolden@mpolden.no>2020-01-11 15:29:24 +0100
commitdeb91244471124365767e330f06fdef2ddc61672 (patch)
tree6b6efec680a4d8a919867d797defa22518e30b1c
parenta03b5b5b001aa175216d627ddc78ada0af1f0b06 (diff)
Wire cache backend
-rw-r--r--cmd/zdns/main.go21
-rw-r--r--config.go4
-rw-r--r--config_test.go4
-rw-r--r--zdnsrc7
4 files changed, 32 insertions, 4 deletions
diff --git a/cmd/zdns/main.go b/cmd/zdns/main.go
index e1c7243..0fc935d 100644
--- a/cmd/zdns/main.go
+++ b/cmd/zdns/main.go
@@ -81,7 +81,10 @@ func newCli(out io.Writer, args []string, configFile string, sig chan os.Signal)
sigHandler := signal.NewHandler(sig, logger)
// SQL backends
- var sqlLogger *sql.Logger
+ var (
+ sqlLogger *sql.Logger
+ sqlCache *sql.Cache
+ )
if config.DNS.Database != "" {
sqlClient, err := sql.New(config.DNS.Database)
fatal(err)
@@ -89,20 +92,30 @@ func newCli(out io.Writer, args []string, configFile string, sig chan os.Signal)
// Logger
sqlLogger = sql.NewLogger(sqlClient, config.DNS.LogMode, config.DNS.LogTTL)
sigHandler.OnClose(sqlLogger)
+
+ // Cache
+ sqlCache = sql.NewCache(sqlClient, logger)
+ sigHandler.OnClose(sqlCache)
}
// DNS client
dnsClient := dnsutil.NewClient(config.Resolver.Protocol, config.Resolver.Timeout, config.DNS.Resolvers...)
// Cache
+ var dnsCache *cache.Cache
var cacheDNS *dnsutil.Client
if config.DNS.CachePrefetch {
cacheDNS = dnsClient
}
- cache := cache.New(config.DNS.CacheSize, cacheDNS)
+ if sqlCache != nil && config.DNS.CachePersist {
+ dnsCache = cache.NewWithBackend(config.DNS.CacheSize, cacheDNS, sqlCache)
+
+ } else {
+ dnsCache = cache.New(config.DNS.CacheSize, cacheDNS)
+ }
// DNS server
- proxy, err := dns.NewProxy(cache, dnsClient, logger, sqlLogger)
+ proxy, err := dns.NewProxy(dnsCache, dnsClient, logger, sqlLogger)
fatal(err)
sigHandler.OnClose(proxy)
@@ -114,7 +127,7 @@ func newCli(out io.Writer, args []string, configFile string, sig chan os.Signal)
// HTTP server
if config.DNS.ListenHTTP != "" {
- httpSrv := http.NewServer(cache, sqlLogger, logger, config.DNS.ListenHTTP)
+ httpSrv := http.NewServer(dnsCache, sqlLogger, logger, config.DNS.ListenHTTP)
sigHandler.OnClose(httpSrv)
servers = append(servers, httpSrv)
}
diff --git a/config.go b/config.go
index 8f78b17..2bee622 100644
--- a/config.go
+++ b/config.go
@@ -26,6 +26,7 @@ type DNSOptions struct {
Protocol string `toml:"protocol"`
CacheSize int `toml:"cache_size"`
CachePrefetch bool `toml:"cache_prefetch"`
+ CachePersist bool `toml:"cache_persist"`
HijackMode string `toml:"hijack_mode"`
hijackMode int
RefreshInterval string `toml:"hosts_refresh_interval"`
@@ -88,6 +89,9 @@ func (c *Config) load() error {
if c.DNS.CacheSize < 0 {
return fmt.Errorf("cache size must be >= 0")
}
+ if c.DNS.CachePersist && c.DNS.Database == "" {
+ return fmt.Errorf("cache_persist = %t requires 'database' to be set", c.DNS.CachePersist)
+ }
switch c.DNS.HijackMode {
case "", "zero":
c.DNS.hijackMode = HijackZero
diff --git a/config_test.go b/config_test.go
index 8d04e00..f18873b 100644
--- a/config_test.go
+++ b/config_test.go
@@ -169,6 +169,9 @@ resolvers = ["http://example.com"]
[resolver]
protocol = "https"
`
+ conf15 := baseConf + `
+cache_persist = true
+`
var tests = []struct {
in string
err string
@@ -189,6 +192,7 @@ protocol = "https"
{conf12, "invalid log mode: foo"},
{conf13, `log_mode = "hijacked" requires 'database' to be set`},
{conf14, "protocol https requires https scheme for resolver http://example.com"},
+ {conf15, "cache_persist = true requires 'database' to be set"},
}
for i, tt := range tests {
var got string
diff --git a/zdnsrc b/zdnsrc
index b3cdde3..95e9906 100644
--- a/zdnsrc
+++ b/zdnsrc
@@ -22,6 +22,13 @@
#
# cache_prefetch = false
+# Cache persistence.
+#
+# If enabled, cache contents is periodically written to disk. The persisted
+# content will then be used to pre-populate the cache on startup.
+#
+# cache_persist = false
+
# Upstream DNS servers to use when answering queries.
#
# The default is Cloudflare DNS servers, which support DNS-over-TLS.