aboutsummaryrefslogtreecommitdiff
path: root/plugin/pkg/expression/expression.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/pkg/expression/expression.go')
-rw-r--r--plugin/pkg/expression/expression.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/plugin/pkg/expression/expression.go b/plugin/pkg/expression/expression.go
new file mode 100644
index 000000000..dad38fefd
--- /dev/null
+++ b/plugin/pkg/expression/expression.go
@@ -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,
+ }
+}