mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-03 18:53:13 -05:00 
			
		
		
		
	Make normalize return multiple "hosts" (= reverse zones) when a non-octet boundary cidr is given. Added pkg/cidr package that holds the cidr calculation routines; felt they didn't really fit dnsutil. This change means the IPNet return parameter isn't needed, the hosts are all correct. The tests that tests this is also removed: TestSplitHostPortReverse The fallout was that zoneAddr _also_ doesn't need the IPNet member, that in turn make it visible that zoneAddr in address.go duplicated a bunch of stuff from register.go; removed/refactored that too. Created a plugin.OriginsFromArgsOrServerBlock to help plugins do the right things, by consuming ZONE arguments; this now expands reverse zones correctly. This is mostly mechanical. Remove the reverse test in plugin/kubernetes which is a copy-paste from a core test (which has since been fixed). Remove MustNormalize as it has no plugin users. This change is not backwards compatible to plugins that have a ZONE argument that they parse in the setup util. All in-tree plugins have been updated. Signed-off-by: Miek Gieben <miek@miek.nl>
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package dnsserver
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"net"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
type zoneAddr struct {
 | 
						|
	Zone      string
 | 
						|
	Port      string
 | 
						|
	Transport string // dns, tls or grpc
 | 
						|
	Address   string // used for bound zoneAddr - validation of overlapping
 | 
						|
}
 | 
						|
 | 
						|
// String returns the string representation of z.
 | 
						|
func (z zoneAddr) String() string {
 | 
						|
	s := z.Transport + "://" + z.Zone + ":" + z.Port
 | 
						|
	if z.Address != "" {
 | 
						|
		s += " on " + z.Address
 | 
						|
	}
 | 
						|
	return s
 | 
						|
}
 | 
						|
 | 
						|
// SplitProtocolHostPort splits a full formed address like "dns://[::1]:53" into parts.
 | 
						|
func SplitProtocolHostPort(address string) (protocol string, ip string, port string, err error) {
 | 
						|
	parts := strings.Split(address, "://")
 | 
						|
	switch len(parts) {
 | 
						|
	case 1:
 | 
						|
		ip, port, err := net.SplitHostPort(parts[0])
 | 
						|
		return "", ip, port, err
 | 
						|
	case 2:
 | 
						|
		ip, port, err := net.SplitHostPort(parts[1])
 | 
						|
		return parts[0], ip, port, err
 | 
						|
	default:
 | 
						|
		return "", "", "", fmt.Errorf("provided value is not in an address format : %s", address)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
type zoneOverlap struct {
 | 
						|
	registeredAddr map[zoneAddr]zoneAddr // each zoneAddr is registered once by its key
 | 
						|
	unboundOverlap map[zoneAddr]zoneAddr // the "no bind" equiv ZoneAddr is registered by its original key
 | 
						|
}
 | 
						|
 | 
						|
func newOverlapZone() *zoneOverlap {
 | 
						|
	return &zoneOverlap{registeredAddr: make(map[zoneAddr]zoneAddr), unboundOverlap: make(map[zoneAddr]zoneAddr)}
 | 
						|
}
 | 
						|
 | 
						|
// registerAndCheck adds a new zoneAddr for validation, it returns information about existing or overlapping with already registered
 | 
						|
// we consider that an unbound address is overlapping all bound addresses for same zone, same port
 | 
						|
func (zo *zoneOverlap) registerAndCheck(z zoneAddr) (existingZone *zoneAddr, overlappingZone *zoneAddr) {
 | 
						|
 | 
						|
	if exist, ok := zo.registeredAddr[z]; ok {
 | 
						|
		// exact same zone already registered
 | 
						|
		return &exist, nil
 | 
						|
	}
 | 
						|
	uz := zoneAddr{Zone: z.Zone, Address: "", Port: z.Port, Transport: z.Transport}
 | 
						|
	if already, ok := zo.unboundOverlap[uz]; ok {
 | 
						|
		if z.Address == "" {
 | 
						|
			// current is not bound to an address, but there is already another zone with a bind address registered
 | 
						|
			return nil, &already
 | 
						|
		}
 | 
						|
		if _, ok := zo.registeredAddr[uz]; ok {
 | 
						|
			// current zone is bound to an address, but there is already an overlapping zone+port with no bind address
 | 
						|
			return nil, &uz
 | 
						|
		}
 | 
						|
	}
 | 
						|
	// there is no overlap, keep the current zoneAddr for future checks
 | 
						|
	zo.registeredAddr[z] = z
 | 
						|
	zo.unboundOverlap[uz] = z
 | 
						|
	return nil, nil
 | 
						|
}
 |