diff options
Diffstat (limited to 'rescached.go')
| -rw-r--r-- | rescached.go | 54 |
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) } } |
