mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	
		
			
	
	
		
			49 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			49 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package kubernetes
 | ||
|  | 
 | ||
|  | import (
 | ||
|  | 	"fmt"
 | ||
|  | 
 | ||
|  | 	"github.com/miekg/dns"
 | ||
|  | )
 | ||
|  | 
 | ||
|  | // NormalizeZoneList filters the zones argument to remove
 | ||
|  | // array items that conflict with other items in zones.
 | ||
|  | // For example, providing the following zones array:
 | ||
|  | //    [ "a.b.c", "b.c", "a", "e.d.f", "a.b" ]
 | ||
|  | // Returns:
 | ||
|  | //    [ "a.b.c", "a", "e.d.f", "a.b" ]
 | ||
|  | // Zones filted out:
 | ||
|  | //    - "b.c" because "a.b.c" and "b.c" share the common top
 | ||
|  | //      level "b.c". First listed zone wins if there is a conflict.
 | ||
|  | //
 | ||
|  | // Note: This may prove to be too restrictive in practice.
 | ||
|  | //       Need to find counter-example use-cases.
 | ||
|  | func NormalizeZoneList(zones []string) []string {
 | ||
|  | 	filteredZones := []string{}
 | ||
|  | 
 | ||
|  | 	for _, z := range zones {
 | ||
|  | 		zoneConflict, _ := subzoneConflict(filteredZones, z)
 | ||
|  | 		if zoneConflict {
 | ||
|  | 			fmt.Printf("[WARN] new zone '%v' from Corefile conflicts with existing zones: %v\n        Ignoring zone '%v'\n", z, filteredZones, z)
 | ||
|  | 		} else {
 | ||
|  | 			filteredZones = append(filteredZones, z)
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	return filteredZones
 | ||
|  | }
 | ||
|  | 
 | ||
|  | // subzoneConflict returns true if name is a child or parent zone of
 | ||
|  | // any element in zones. If conflicts exist, return the conflicting zones.
 | ||
|  | func subzoneConflict(zones []string, name string) (bool, []string) {
 | ||
|  | 	conflicts := []string{}
 | ||
|  | 
 | ||
|  | 	for _, z := range zones {
 | ||
|  | 		if dns.IsSubDomain(z, name) || dns.IsSubDomain(name, z) {
 | ||
|  | 			conflicts = append(conflicts, z)
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	return (len(conflicts) != 0), conflicts
 | ||
|  | }
 |