diff options
Diffstat (limited to 'middleware/dnstap/setup.go')
-rw-r--r-- | middleware/dnstap/setup.go | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/middleware/dnstap/setup.go b/middleware/dnstap/setup.go new file mode 100644 index 000000000..5c74bd346 --- /dev/null +++ b/middleware/dnstap/setup.go @@ -0,0 +1,70 @@ +package dnstap + +import ( + "fmt" + "log" + + "github.com/coredns/coredns/core/dnsserver" + "github.com/coredns/coredns/middleware" + "github.com/coredns/coredns/middleware/dnstap/out" + + "github.com/mholt/caddy" + "github.com/mholt/caddy/caddyfile" +) + +func init() { + caddy.RegisterPlugin("dnstap", caddy.Plugin{ + ServerType: "dns", + Action: wrapSetup, + }) +} + +func wrapSetup(c *caddy.Controller) error { + if err := setup(c); err != nil { + return middleware.Error("dnstap", err) + } + return nil +} + +func parseConfig(c *caddyfile.Dispenser) (path string, full bool, err error) { + c.Next() // directive name + + if !c.Args(&path) { + err = c.ArgErr() + return + } + + full = c.NextArg() && c.Val() == "full" + + return +} + +func setup(c *caddy.Controller) error { + path, full, err := parseConfig(&c.Dispenser) + if err != nil { + return err + } + + dnstap := Dnstap{Pack: full} + + o, err := out.NewSocket(path) + if err != nil { + log.Printf("[WARN] Can't connect to %s at the moment", path) + } + dnstap.Out = o + + c.OnShutdown(func() error { + if err := o.Close(); err != nil { + return fmt.Errorf("output: %s", err) + } + return nil + }) + + dnsserver.GetConfig(c).AddMiddleware( + func(next middleware.Handler) middleware.Handler { + dnstap.Next = next + return dnstap + }) + + return nil +} |