coredns/plugin/pkg/expression/expression.go
Chris O'Haver b56b080a7c
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>
2022-09-08 14:56:27 -04:00

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,
}
}