* 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>
47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
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,
|
|
}
|
|
}
|