29 lines
		
	
	
	
		
			943 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			29 lines
		
	
	
	
		
			943 B
		
	
	
	
		
			Python
		
	
	
	
	
	
from ipaddress import ip_address
 | 
						|
 | 
						|
def _values_from_all_nodes(type, name, zone):
 | 
						|
    return {
 | 
						|
        value
 | 
						|
            for node in repo.nodes
 | 
						|
            for value in node.metadata.get(f'dns/{name}{"." if name else ""}{zone}/{type}', [])
 | 
						|
    }
 | 
						|
 | 
						|
def record_matches_view(value, type, name, zone, view, metadata):
 | 
						|
    if type not in ['A', 'AAAA']:
 | 
						|
        return True
 | 
						|
 | 
						|
    if metadata.get(f'bind/views/{view}/is_internal'):        
 | 
						|
        if ip_address(value).is_private:
 | 
						|
            return True
 | 
						|
        elif not list(filter(
 | 
						|
            lambda other_value: ip_address(other_value).is_private,
 | 
						|
            _values_from_all_nodes(type, name, zone),
 | 
						|
        )):
 | 
						|
            return True
 | 
						|
    else:
 | 
						|
        if ip_address(value).is_global:
 | 
						|
            return True
 | 
						|
        elif not list(filter(
 | 
						|
            lambda other_value: ip_address(other_value).is_global,
 | 
						|
            _values_from_all_nodes(type, name, zone),
 | 
						|
        )):
 | 
						|
            return True
 |