summaryrefslogtreecommitdiff
path: root/rescached.go
diff options
context:
space:
mode:
Diffstat (limited to 'rescached.go')
-rw-r--r--rescached.go54
1 files changed, 53 insertions, 1 deletions
diff --git a/rescached.go b/rescached.go
index 6d6464f..c990b77 100644
--- a/rescached.go
+++ b/rescached.go
@@ -10,6 +10,7 @@ import (
"fmt"
"log"
"os"
+ "path/filepath"
"sync"
"github.com/shuLhan/share/lib/debug"
@@ -18,6 +19,11 @@ import (
libio "github.com/shuLhan/share/lib/io"
)
+const (
+ cachesDir = "/var/cache/rescached/"
+ cachesFile = "rescached.gob"
+)
+
// Server implement caching DNS server.
type Server struct {
fileConfig string
@@ -57,11 +63,31 @@ func New(fileConfig string) (srv *Server, err error) {
// it.
//
func (srv *Server) Start() (err error) {
+ logp := "Start"
+
srv.dns, err = dns.NewServer(&srv.env.ServerOptions)
if err != nil {
return err
}
+ cachesPath := filepath.Join(cachesDir, cachesFile)
+
+ fcaches, err := os.Open(cachesPath)
+ if err == nil {
+ // Load stored caches from file.
+ answers, err := srv.dns.CachesLoad(fcaches)
+ if err != nil {
+ log.Printf("%s: %s", logp, err)
+ } else {
+ fmt.Printf("%s: %d caches loaded from %s\n", logp, len(answers), cachesPath)
+ }
+
+ err = fcaches.Close()
+ if err != nil {
+ log.Printf("%s: %s", logp, err)
+ }
+ }
+
systemHostsFile, err := dns.ParseHostsFile(dns.GetSystemHosts())
if err != nil {
return err
@@ -134,10 +160,36 @@ func (srv *Server) run() {
// Stop the server.
//
func (srv *Server) Stop() {
+ logp := "Stop"
+
if srv.rcWatcher != nil {
srv.rcWatcher.Stop()
}
srv.dns.Stop()
+
+ cachesPath := filepath.Join(cachesDir, cachesFile)
+
+ // Stores caches to file for next start.
+ err := os.MkdirAll(cachesDir, 0700)
+ if err != nil {
+ log.Printf("%s: %s", logp, err)
+ return
+ }
+ fcaches, err := os.Create(cachesPath)
+ if err != nil {
+ log.Printf("%s: %s", logp, err)
+ return
+ }
+ n, err := srv.dns.CachesSave(fcaches)
+ if err != nil {
+ log.Printf("%s: %s", logp, err)
+ // fall-through for Close.
+ }
+ err = fcaches.Close()
+ if err != nil {
+ log.Printf("%s: %s", logp, err)
+ }
+ fmt.Printf("%s: %d caches stored to %s\n", logp, n, cachesPath)
}
func (srv *Server) watchResolvConf(ns *libio.NodeState) {
@@ -155,6 +207,6 @@ func (srv *Server) watchResolvConf(ns *libio.NodeState) {
break
}
- srv.dns.RestartForwarders(srv.env.NameServers, srv.env.FallbackNS)
+ srv.dns.RestartForwarders(srv.env.NameServers)
}
}