mirror of
https://github.com/coredns/coredns.git
synced 2025-10-28 00:34:24 -04:00
plugin/view: Advanced routing interface and new 'view' plugin (#5538)
* introduce new interface "dnsserver.Viewer", that allows a plugin implementing it to decide if a query should be routed into its server block. * add new plugin "view", that uses the new interface to enable a user to define expression based conditions that must be met for a query to be routed to its server block. Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
This commit is contained in:
47
plugin/pkg/expression/expression.go
Normal file
47
plugin/pkg/expression/expression.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package expression
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"net"
|
||||
|
||||
"github.com/coredns/coredns/plugin/metadata"
|
||||
"github.com/coredns/coredns/request"
|
||||
)
|
||||
|
||||
// DefaultEnv returns the default set of custom state variables and functions available to for use in expression evaluation.
|
||||
func DefaultEnv(ctx context.Context, state *request.Request) map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"incidr": func(ipStr, cidrStr string) (bool, error) {
|
||||
ip := net.ParseIP(ipStr)
|
||||
if ip == nil {
|
||||
return false, errors.New("first argument is not an IP address")
|
||||
}
|
||||
_, cidr, err := net.ParseCIDR(cidrStr)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
return cidr.Contains(ip), nil
|
||||
},
|
||||
"metadata": func(label string) string {
|
||||
f := metadata.ValueFunc(ctx, label)
|
||||
if f == nil {
|
||||
return ""
|
||||
}
|
||||
return f()
|
||||
},
|
||||
"type": state.Type,
|
||||
"name": state.Name,
|
||||
"class": state.Class,
|
||||
"proto": state.Proto,
|
||||
"size": state.Len,
|
||||
"client_ip": state.IP,
|
||||
"port": state.Port,
|
||||
"id": func() int { return int(state.Req.Id) },
|
||||
"opcode": func() int { return state.Req.Opcode },
|
||||
"do": state.Do,
|
||||
"bufsize": state.Size,
|
||||
"server_ip": state.LocalIP,
|
||||
"server_port": state.LocalPort,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user