Add any plugin (#2801)

* Add any plugin

This adds the any plugin, a plain copy of coredns/any documented here
https://coredns.io/explugins/any/ as an external plugin.

Fixes: #2785

Signed-off-by: Miek Gieben <miek@miek.nl>

* Stickler bot nit

Signed-off-by: Miek Gieben <miek@miek.nl>
This commit is contained in:
Miek Gieben 2019-04-28 11:46:45 +01:00 committed by GitHub
parent 4f7fb98284
commit 39bc2af509
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 129 additions and 0 deletions

View file

@ -26,6 +26,7 @@ var Directives = []string{
"errors",
"log",
"dnstap",
"any",
"chaos",
"loadbalance",
"cache",

View file

@ -4,6 +4,7 @@ package plugin
import (
// Include all plugins.
_ "github.com/coredns/coredns/plugin/any"
_ "github.com/coredns/coredns/plugin/auto"
_ "github.com/coredns/coredns/plugin/autopath"
_ "github.com/coredns/coredns/plugin/bind"

View file

@ -35,6 +35,7 @@ prometheus:metrics
errors:errors
log:log
dnstap:dnstap
any:any
chaos:chaos
loadbalance:loadbalance
cache:cache

4
plugin/any/OWNERS Normal file
View file

@ -0,0 +1,4 @@
reviewers:
- miekg
approvers:
- miekg

36
plugin/any/README.md Normal file
View file

@ -0,0 +1,36 @@
# any
## Name
*any* - give a minimal response to ANY queries.
## Description
*any* basically blocks ANY queries by responding to them with a short HINFO reply. See [RFC
8482](https://tools.ietf.org/html/rfc8482) for details.
## Syntax
~~~ txt
any
~~~
## Examples
~~~ corefile
example.org {
whoami
any
}
~~~
A `dig +nocmd ANY example.org +noall +answer` now returns:
~~~ txt
example.org. 8482 IN HINFO "ANY obsoleted" "See RFC 8482"
~~~
## Also See
[RFC 8482](https://tools.ietf.org/html/rfc8482).

32
plugin/any/any.go Normal file
View file

@ -0,0 +1,32 @@
package any
import (
"context"
"github.com/coredns/coredns/plugin"
"github.com/miekg/dns"
)
// Any is a plugin that returns a HINFO reply to ANY queries.
type Any struct {
Next plugin.Handler
}
// ServeDNS implements the plugin.Handler interface.
func (a Any) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
if r.Question[0].Qtype != dns.TypeANY {
return plugin.NextOrFailure(a.Name(), a.Next, ctx, w, r)
}
m := new(dns.Msg)
m.SetReply(r)
hdr := dns.RR_Header{Name: r.Question[0].Name, Ttl: 8482, Class: dns.ClassINET, Rrtype: dns.TypeHINFO}
m.Answer = []dns.RR{&dns.HINFO{Hdr: hdr, Cpu: "ANY obsoleted", Os: "See RFC 8482"}}
w.WriteMsg(m)
return 0, nil
}
// Name implements the Handler interface.
func (a Any) Name() string { return "any" }

28
plugin/any/any_test.go Normal file
View file

@ -0,0 +1,28 @@
package any
import (
"context"
"testing"
"github.com/coredns/coredns/plugin/pkg/dnstest"
"github.com/coredns/coredns/plugin/test"
"github.com/miekg/dns"
)
func TestAny(t *testing.T) {
req := new(dns.Msg)
req.SetQuestion("example.org.", dns.TypeANY)
a := &Any{}
rec := dnstest.NewRecorder(&test.ResponseWriter{})
_, err := a.ServeDNS(context.TODO(), rec, req)
if err != nil {
t.Errorf("Expected no error, but got %q", err)
}
if rec.Msg.Answer[0].(*dns.HINFO).Cpu != "ANY obsoleted" {
t.Errorf("Expected HINFO, but got %q", rec.Msg.Answer[0].(*dns.HINFO).Cpu)
}
}

26
plugin/any/setup.go Normal file
View file

@ -0,0 +1,26 @@
package any
import (
"github.com/coredns/coredns/core/dnsserver"
"github.com/coredns/coredns/plugin"
"github.com/mholt/caddy"
)
func init() {
caddy.RegisterPlugin("any", caddy.Plugin{
ServerType: "dns",
Action: setup,
})
}
func setup(c *caddy.Controller) error {
a := Any{}
dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler {
a.Next = next
return a
})
return nil
}