diff options
author | 2020-08-10 10:38:18 +0200 | |
---|---|---|
committer | 2020-08-10 10:38:18 +0200 | |
commit | b3d08f9b2140f3c6e54c05368319404472e1a431 (patch) | |
tree | d1e097d47ec22f9b9f8e138456f8bcf7ea21754d /plugin | |
parent | 7d5f5b87a4fb310d442f7ef0d52e3fead0e10d39 (diff) | |
download | coredns-b3d08f9b2140f3c6e54c05368319404472e1a431.tar.gz coredns-b3d08f9b2140f3c6e54c05368319404472e1a431.tar.zst coredns-b3d08f9b2140f3c6e54c05368319404472e1a431.zip |
plugin/template: Add client IP data (#4034)
Signed-off-by: Maxime Guyot <maxime@root314.com>
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/template/README.md | 1 | ||||
-rw-r--r-- | plugin/template/template.go | 3 | ||||
-rw-r--r-- | plugin/template/template_test.go | 27 |
3 files changed, 30 insertions, 1 deletions
diff --git a/plugin/template/README.md b/plugin/template/README.md index 654de86c9..6d0d3b27e 100644 --- a/plugin/template/README.md +++ b/plugin/template/README.md @@ -48,6 +48,7 @@ Each resource record is a full-featured [Go template](https://golang.org/pkg/tex * `.Group` a map of the named capture groups. * `.Message` the complete incoming DNS message. * `.Question` the matched question section. +* `.Remote` client’s IP address * `.Meta` a function that takes a metadata name and returns the value, if the metadata plugin is enabled. For example, `.Meta "kubernetes/client-namespace"` diff --git a/plugin/template/template.go b/plugin/template/template.go index 4940dc9f4..7f26349d5 100644 --- a/plugin/template/template.go +++ b/plugin/template/template.go @@ -48,6 +48,7 @@ type templateData struct { Type string Message *dns.Msg Question *dns.Question + Remote string md map[string]metadata.Func } @@ -145,7 +146,7 @@ func executeRRTemplate(server, section string, template *gotmpl.Template, data * func (t template) match(ctx context.Context, state request.Request) (*templateData, bool, bool) { q := state.Req.Question[0] - data := &templateData{md: metadata.ValueFuncs(ctx)} + data := &templateData{md: metadata.ValueFuncs(ctx), Remote: state.IP()} zone := plugin.Zones(t.zones).Matches(state.Name()) if zone == "" { diff --git a/plugin/template/template_test.go b/plugin/template/template_test.go index 7e8f988f2..d26012298 100644 --- a/plugin/template/template_test.go +++ b/plugin/template/template_test.go @@ -25,6 +25,14 @@ func TestHandler(t *testing.T) { fall: fall.Root, zones: []string{"."}, } + exampleDomainIPATemplate := template{ + regex: []*regexp.Regexp{regexp.MustCompile(".*")}, + answer: []*gotmpl.Template{gotmpl.Must(gotmpl.New("answer").Parse("{{ .Name }} 60 IN A {{ .Remote }}"))}, + qclass: dns.ClassINET, + qtype: dns.TypeA, + fall: fall.Root, + zones: []string{"."}, + } exampleDomainANSTemplate := template{ regex: []*regexp.Regexp{regexp.MustCompile("(^|[.])ip-10-(?P<b>[0-9]*)-(?P<c>[0-9]*)-(?P<d>[0-9]*)[.]example[.]$")}, answer: []*gotmpl.Template{gotmpl.Must(gotmpl.New("answer").Parse("{{ .Name }} 60 IN A 10.{{ .Group.b }}.{{ .Group.c }}.{{ .Group.d }}"))}, @@ -197,6 +205,25 @@ func TestHandler(t *testing.T) { }, }, { + name: "ExampleIPMatch", + tmpl: exampleDomainIPATemplate, + qclass: dns.ClassINET, + qtype: dns.TypeA, + qname: "test.example.", + verifyResponse: func(r *dns.Msg) error { + if len(r.Answer) != 1 { + return fmt.Errorf("expected 1 answer, got %v", len(r.Answer)) + } + if r.Answer[0].Header().Rrtype != dns.TypeA { + return fmt.Errorf("expected an A record answer, got %v", dns.TypeToString[r.Answer[0].Header().Rrtype]) + } + if r.Answer[0].(*dns.A).A.String() != "10.240.0.1" { + return fmt.Errorf("expected an A record for 10.95.12.8, got %v", r.Answer[0].String()) + } + return nil + }, + }, + { name: "ExampleDomainMatch", tmpl: exampleDomainATemplate, qclass: dns.ClassINET, |