mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	* 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>
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package dnsserver
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"regexp"
 | |
| 	"sort"
 | |
| 
 | |
| 	"github.com/coredns/coredns/plugin/pkg/dnsutil"
 | |
| )
 | |
| 
 | |
| // checkZoneSyntax() checks whether the given string match 1035 Preferred Syntax or not.
 | |
| // The root zone, and all reverse zones always return true even though they technically don't meet 1035 Preferred Syntax
 | |
| func checkZoneSyntax(zone string) bool {
 | |
| 	if zone == "." || dnsutil.IsReverse(zone) != 0 {
 | |
| 		return true
 | |
| 	}
 | |
| 	regex1035PreferredSyntax, _ := regexp.MatchString(`^(([A-Za-z]([A-Za-z0-9-]*[A-Za-z0-9])?)\.)+$`, zone)
 | |
| 	return regex1035PreferredSyntax
 | |
| }
 | |
| 
 | |
| // startUpZones creates the text that we show when starting up:
 | |
| // grpc://example.com.:1055
 | |
| // example.com.:1053 on 127.0.0.1
 | |
| func startUpZones(protocol, addr string, zones map[string][]*Config) string {
 | |
| 	s := ""
 | |
| 
 | |
| 	keys := make([]string, len(zones))
 | |
| 	i := 0
 | |
| 
 | |
| 	for k := range zones {
 | |
| 		keys[i] = k
 | |
| 		i++
 | |
| 	}
 | |
| 	sort.Strings(keys)
 | |
| 
 | |
| 	for _, zone := range keys {
 | |
| 		if !checkZoneSyntax(zone) {
 | |
| 			s += fmt.Sprintf("Warning: Domain %q does not follow RFC1035 preferred syntax\n", zone)
 | |
| 		}
 | |
| 		// split addr into protocol, IP and Port
 | |
| 		_, ip, port, err := SplitProtocolHostPort(addr)
 | |
| 
 | |
| 		if err != nil {
 | |
| 			// this should not happen, but we need to take care of it anyway
 | |
| 			s += fmt.Sprintln(protocol + zone + ":" + addr)
 | |
| 			continue
 | |
| 		}
 | |
| 		if ip == "" {
 | |
| 			s += fmt.Sprintln(protocol + zone + ":" + port)
 | |
| 			continue
 | |
| 		}
 | |
| 		// if the server is listening on a specific address let's make it visible in the log,
 | |
| 		// so one can differentiate between all active listeners
 | |
| 		s += fmt.Sprintln(protocol + zone + ":" + port + " on " + ip)
 | |
| 	}
 | |
| 	return s
 | |
| }
 |