diff options
author | 2018-08-29 10:41:03 -0400 | |
---|---|---|
committer | 2018-08-29 10:41:03 -0400 | |
commit | 38051b90893b23cb90960b20095337dd4a4057aa (patch) | |
tree | df5d4019527f7631c15db35abb10ac618ebd6581 /plugin/rewrite/reverter.go | |
parent | 52147cd65702f45a5b973815536672eba04c6522 (diff) | |
download | coredns-38051b90893b23cb90960b20095337dd4a4057aa.tar.gz coredns-38051b90893b23cb90960b20095337dd4a4057aa.tar.zst coredns-38051b90893b23cb90960b20095337dd4a4057aa.zip |
plugin/rewrite: add handling of TTL field rewrites (#2048)
Resolves: #1981
Signed-off-by: Paul Greenberg <greenpau@outlook.com>
Diffstat (limited to 'plugin/rewrite/reverter.go')
-rw-r--r-- | plugin/rewrite/reverter.go | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/plugin/rewrite/reverter.go b/plugin/rewrite/reverter.go index 63e38708f..570b7d39e 100644 --- a/plugin/rewrite/reverter.go +++ b/plugin/rewrite/reverter.go @@ -1,18 +1,19 @@ package rewrite import ( + "github.com/miekg/dns" "regexp" "strconv" "strings" - - "github.com/miekg/dns" ) // ResponseRule contains a rule to rewrite a response with. type ResponseRule struct { Active bool + Type string Pattern *regexp.Regexp Replacement string + Ttl uint32 } // ResponseReverter reverses the operations done on the question section of a packet. @@ -38,22 +39,40 @@ func (r *ResponseReverter) WriteMsg(res *dns.Msg) error { res.Question[0] = r.originalQuestion if r.ResponseRewrite { for _, rr := range res.Answer { - name := rr.Header().Name + var isNameRewritten bool = false + var isTtlRewritten bool = false + var name string = rr.Header().Name + var ttl uint32 = rr.Header().Ttl for _, rule := range r.ResponseRules { - regexGroups := rule.Pattern.FindStringSubmatch(name) - if len(regexGroups) == 0 { - continue + if rule.Type == "" { + rule.Type = "name" } - s := rule.Replacement - for groupIndex, groupValue := range regexGroups { - groupIndexStr := "{" + strconv.Itoa(groupIndex) + "}" - if strings.Contains(s, groupIndexStr) { - s = strings.Replace(s, groupIndexStr, groupValue, -1) + switch rule.Type { + case "name": + regexGroups := rule.Pattern.FindStringSubmatch(name) + if len(regexGroups) == 0 { + continue } + s := rule.Replacement + for groupIndex, groupValue := range regexGroups { + groupIndexStr := "{" + strconv.Itoa(groupIndex) + "}" + if strings.Contains(s, groupIndexStr) { + s = strings.Replace(s, groupIndexStr, groupValue, -1) + } + } + name = s + isNameRewritten = true + case "ttl": + ttl = rule.Ttl + isTtlRewritten = true } - name = s } - rr.Header().Name = name + if isNameRewritten == true { + rr.Header().Name = name + } + if isTtlRewritten == true { + rr.Header().Ttl = ttl + } } } return r.ResponseWriter.WriteMsg(res) |