mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-30 17:53:21 -04:00 
			
		
		
		
	
		
			
	
	
		
			48 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			48 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,
 | ||
|  | 	}
 | ||
|  | }
 |