mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-04 03:03:14 -05: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,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |