server.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package server
  2. import (
  3. "log"
  4. "github.com/abh/geodns/monitor"
  5. "github.com/abh/geodns/querylog"
  6. "github.com/abh/geodns/zones"
  7. "github.com/miekg/dns"
  8. )
  9. type Server struct {
  10. queryLogger querylog.QueryLogger
  11. mux *dns.ServeMux
  12. PublicDebugQueries bool
  13. info *monitor.ServerInfo
  14. }
  15. func NewServer(si *monitor.ServerInfo) *Server {
  16. mux := dns.NewServeMux()
  17. // todo: this should be in the monitor package, or somewhere else.
  18. // Also if we can stop the server later, need to stop the server too.
  19. metrics := NewMetrics()
  20. go metrics.Updater()
  21. return &Server{mux: mux, info: si}
  22. }
  23. // Setup the QueryLogger. For now it only supports writing to a file (and all
  24. // zones get logged to the same file).
  25. func (srv *Server) SetQueryLogger(logger querylog.QueryLogger) {
  26. srv.queryLogger = logger
  27. }
  28. func (srv *Server) Add(name string, zone *zones.Zone) {
  29. srv.mux.HandleFunc(name, srv.setupServerFunc(zone))
  30. }
  31. func (srv *Server) Remove(name string) {
  32. srv.mux.HandleRemove(name)
  33. }
  34. func (srv *Server) setupServerFunc(zone *zones.Zone) func(dns.ResponseWriter, *dns.Msg) {
  35. return func(w dns.ResponseWriter, r *dns.Msg) {
  36. srv.serve(w, r, zone)
  37. }
  38. }
  39. func (srv *Server) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
  40. srv.mux.ServeDNS(w, r)
  41. }
  42. func (srv *Server) ListenAndServe(ip string) {
  43. prots := []string{"udp", "tcp"}
  44. for _, prot := range prots {
  45. go func(p string) {
  46. server := &dns.Server{
  47. Addr: ip,
  48. Net: p,
  49. Handler: srv,
  50. }
  51. log.Printf("Opening on %s %s", ip, p)
  52. if err := server.ListenAndServe(); err != nil {
  53. log.Fatalf("geodns: failed to setup %s %s: %s", ip, p, err)
  54. }
  55. log.Fatalf("geodns: ListenAndServe unexpectedly returned")
  56. }(prot)
  57. }
  58. }