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
 | 
