feat: add logging
This commit is contained in:
parent
f0c0cbc16b
commit
ae06278ec4
2 changed files with 49 additions and 1 deletions
1
go.mod
1
go.mod
|
|
@ -6,6 +6,7 @@ require (
|
||||||
github.com/caddyserver/caddy/v2 v2.6.4
|
github.com/caddyserver/caddy/v2 v2.6.4
|
||||||
github.com/mholt/acmez v1.1.0
|
github.com/mholt/acmez v1.1.0
|
||||||
github.com/miekg/dns v1.1.50
|
github.com/miekg/dns v1.1.50
|
||||||
|
go.uber.org/zap v1.24.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
|
|
||||||
49
stub.go
49
stub.go
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
|
"go.uber.org/zap"
|
||||||
"github.com/mholt/acmez"
|
"github.com/mholt/acmez"
|
||||||
"github.com/mholt/acmez/acme"
|
"github.com/mholt/acmez/acme"
|
||||||
"github.com/caddyserver/caddy/v2"
|
"github.com/caddyserver/caddy/v2"
|
||||||
|
|
@ -19,6 +20,7 @@ type StubDNS struct {
|
||||||
Address string `json:"address,omitempty"`
|
Address string `json:"address,omitempty"`
|
||||||
|
|
||||||
server *dns.Server // set in Present()
|
server *dns.Server // set in Present()
|
||||||
|
logger *zap.Logger // set in Provision()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -36,8 +38,15 @@ func (StubDNS) CaddyModule() caddy.ModuleInfo {
|
||||||
|
|
||||||
// Provision sets up the module. Implements caddy.Provisioner.
|
// Provision sets up the module. Implements caddy.Provisioner.
|
||||||
func (p *StubDNS) Provision(ctx caddy.Context) error {
|
func (p *StubDNS) Provision(ctx caddy.Context) error {
|
||||||
|
p.logger = ctx.Logger()
|
||||||
repl := caddy.NewReplacer()
|
repl := caddy.NewReplacer()
|
||||||
|
before := p.Address
|
||||||
p.Address = repl.ReplaceAll(p.Address, "")
|
p.Address = repl.ReplaceAll(p.Address, "")
|
||||||
|
p.logger.Debug(
|
||||||
|
"provisioned",
|
||||||
|
zap.String("address", p.Address),
|
||||||
|
zap.String("address_before_replace", before),
|
||||||
|
)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -84,18 +93,31 @@ func (s *StubDNS) Present(ctx context.Context, challenge acme.Challenge) error {
|
||||||
fqdn := dns.Fqdn(challenge.DNS01TXTRecordName())
|
fqdn := dns.Fqdn(challenge.DNS01TXTRecordName())
|
||||||
content := challenge.DNS01KeyAuthorization()
|
content := challenge.DNS01KeyAuthorization()
|
||||||
|
|
||||||
|
s.logger.Debug(
|
||||||
|
"presenting record",
|
||||||
|
zap.String("name", fqdn),
|
||||||
|
zap.String("content", content),
|
||||||
|
zap.String("address", s.Address),
|
||||||
|
)
|
||||||
|
|
||||||
// dns.Server.ListenAndServe blocks when it binds successfully,
|
// dns.Server.ListenAndServe blocks when it binds successfully,
|
||||||
// so it has to run in a separate task and can't return errors directly
|
// so it has to run in a separate task and can't return errors directly
|
||||||
|
|
||||||
if err := try_bind(ctx, s.Address); err != nil {
|
if err := try_bind(ctx, s.Address); err != nil {
|
||||||
|
s.logger.Error(
|
||||||
|
"failed to bind",
|
||||||
|
zap.String("address", s.Address),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// spawn the server
|
// spawn the server
|
||||||
handler := s.make_handler(fqdn, content)
|
handler := s.make_handler(fqdn, content)
|
||||||
|
// could also use fqdn as pattern, but "." allows logging invalid requests
|
||||||
dns.HandleFunc(".", handler)
|
dns.HandleFunc(".", handler)
|
||||||
server := &dns.Server{Addr: s.Address, Net: "udp", TsigSecret: nil,}
|
server := &dns.Server{Addr: s.Address, Net: "udp", TsigSecret: nil,}
|
||||||
go server.ListenAndServe()
|
go s.serve(server)
|
||||||
|
|
||||||
// store the server for shutdown later
|
// store the server for shutdown later
|
||||||
s.server = server
|
s.server = server
|
||||||
|
|
@ -104,8 +126,13 @@ func (s *StubDNS) Present(ctx context.Context, challenge acme.Challenge) error {
|
||||||
|
|
||||||
func (p *StubDNS) CleanUp(ctx context.Context, _ acme.Challenge) error {
|
func (p *StubDNS) CleanUp(ctx context.Context, _ acme.Challenge) error {
|
||||||
if p.server == nil {
|
if p.server == nil {
|
||||||
|
p.logger.Debug("server never started, nothing to clean up")
|
||||||
return nil
|
return nil
|
||||||
} else {
|
} else {
|
||||||
|
p.logger.Debug(
|
||||||
|
"shutting down DNS server",
|
||||||
|
zap.String("address", p.Address),
|
||||||
|
)
|
||||||
return p.server.ShutdownContext(ctx)
|
return p.server.ShutdownContext(ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -120,10 +147,28 @@ func try_bind(ctx context.Context, address string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *StubDNS) serve(server *dns.Server) {
|
||||||
|
err := server.ListenAndServe()
|
||||||
|
if err != nil {
|
||||||
|
s.logger.Error(
|
||||||
|
"DNS ListenAndServe returned an error!",
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
s.logger.Debug("server terminated successfully")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (s *StubDNS) make_handler(fqdn string, txt string) dns.HandlerFunc {
|
func (s *StubDNS) make_handler(fqdn string, txt string) dns.HandlerFunc {
|
||||||
|
logger := s.logger
|
||||||
handler := func(w dns.ResponseWriter, r *dns.Msg) {
|
handler := func(w dns.ResponseWriter, r *dns.Msg) {
|
||||||
m := new(dns.Msg)
|
m := new(dns.Msg)
|
||||||
m.SetReply(r)
|
m.SetReply(r)
|
||||||
|
|
||||||
|
logger.Debug(
|
||||||
|
"received DNS query",
|
||||||
|
zap.Stringer("address", w.RemoteAddr()),
|
||||||
|
)
|
||||||
if len(r.Question) != 1 {
|
if len(r.Question) != 1 {
|
||||||
m.Rcode = dns.RcodeRefused
|
m.Rcode = dns.RcodeRefused
|
||||||
m.Answer = []dns.RR{}
|
m.Answer = []dns.RR{}
|
||||||
|
|
@ -138,9 +183,11 @@ func (s *StubDNS) make_handler(fqdn string, txt string) dns.HandlerFunc {
|
||||||
(q.Qclass == dns.ClassINET || q.Qclass == dns.ClassANY) &&
|
(q.Qclass == dns.ClassINET || q.Qclass == dns.ClassANY) &&
|
||||||
q.Qtype == dns.TypeTXT
|
q.Qtype == dns.TypeTXT
|
||||||
if !valid {
|
if !valid {
|
||||||
|
logger.Debug("invalid request header")
|
||||||
m.Rcode = dns.RcodeNotImplemented
|
m.Rcode = dns.RcodeNotImplemented
|
||||||
m.Answer = []dns.RR{}
|
m.Answer = []dns.RR{}
|
||||||
} else if domain != fqdn {
|
} else if domain != fqdn {
|
||||||
|
logger.Debug("invalid domain")
|
||||||
m.Rcode = dns.RcodeNameError
|
m.Rcode = dns.RcodeNameError
|
||||||
m.Answer = []dns.RR{}
|
m.Answer = []dns.RR{}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue