48 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from ipaddress import ip_address, ip_interface
 | |
| 
 | |
| 
 | |
| def get_a_records(metadata, internal=True, external=True):
 | |
|     networks = metadata.get('network')
 | |
| 
 | |
|     if not internal:
 | |
|         networks.pop('internal', None)
 | |
| 
 | |
|     if not external:
 | |
|         networks.pop('external', None)
 | |
| 
 | |
|     return {
 | |
|         'A': [
 | |
|             str(ip_interface(network['ipv4']).ip)
 | |
|                 for network in networks.values()
 | |
|                 if 'ipv4' in network
 | |
|         ],
 | |
|         'AAAA': [
 | |
|             str(ip_interface(network['ipv6']).ip)
 | |
|                 for network in networks.values()
 | |
|                 if 'ipv6' in network
 | |
|         ],
 | |
|     }
 | |
| 
 | |
| 
 | |
| def get_all_ips(nodes):
 | |
|     ips = set()
 | |
| 
 | |
|     for node in nodes:
 | |
|         try:
 | |
|             ip_address(node.hostname)
 | |
|         except ValueError:
 | |
|             pass
 | |
|         else:
 | |
|             ips.add(node.hostname)
 | |
| 
 | |
|         if node.has_bundle('network'):
 | |
|             for network in node.metadata.get('network').values():
 | |
|                 if 'ipv4' in network:
 | |
|                     ips.add(str(ip_interface(network['ipv4']).ip))
 | |
|                 if 'ipv6' in network:
 | |
|                     ips.add(str(ip_interface(network['ipv6']).ip))
 | |
| 
 | |
|         if node.has_bundle('wireguard'):
 | |
|             ips.add(str(ip_interface(node.metadata.get('wireguard/my_ip')).ip))
 | |
| 
 | |
|     return ips
 |