69 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from ipaddress import ip_interface
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'dns',
 | 
						|
)
 | 
						|
def acme_records(metadata):
 | 
						|
    domains = set()
 | 
						|
    
 | 
						|
    for other_node in repo.nodes:
 | 
						|
        for domain, conf in other_node.metadata.get('letsencrypt/domains', {}).items():
 | 
						|
            domains.add(domain)
 | 
						|
            domains.update(conf.get('aliases', []))
 | 
						|
    
 | 
						|
    return {
 | 
						|
        'dns': {
 | 
						|
            f'_acme-challenge.{domain}': {
 | 
						|
                'CNAME': {f"{domain}.{metadata.get('bind/acme_zone')}."},
 | 
						|
            }
 | 
						|
                for domain in domains
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
@metadata_reactor.provides(
 | 
						|
    'bind/acls/acme',
 | 
						|
    'bind/views/external/keys/acme',
 | 
						|
    'bind/views/external/zones',
 | 
						|
)
 | 
						|
def acme_zone(metadata):
 | 
						|
    allowed_ips = {
 | 
						|
        *{
 | 
						|
            str(ip_interface(other_node.metadata.get('network/internal/ipv4')).ip)
 | 
						|
                for other_node in repo.nodes
 | 
						|
                if other_node.metadata.get('letsencrypt/domains', {})
 | 
						|
        },
 | 
						|
        *{
 | 
						|
            str(ip_interface(other_node.metadata.get('wireguard/my_ip')).ip)
 | 
						|
                for other_node in repo.nodes
 | 
						|
                if other_node.has_bundle('wireguard')
 | 
						|
        },
 | 
						|
    }
 | 
						|
    
 | 
						|
    return {
 | 
						|
        'bind': {
 | 
						|
            'acls': {
 | 
						|
                'acme': {
 | 
						|
                    'key acme',
 | 
						|
                    '!{ !{' + ' '.join(f'{ip};' for ip in sorted(allowed_ips)) + '}; any;}',
 | 
						|
                },
 | 
						|
            },
 | 
						|
            'views': {
 | 
						|
                'external': {
 | 
						|
                    'keys': {
 | 
						|
                        'acme': {},
 | 
						|
                    },
 | 
						|
                    'zones': {
 | 
						|
                        metadata.get('bind/acme_zone'): {
 | 
						|
                            'allow_update': {
 | 
						|
                                'acme',
 | 
						|
                            },
 | 
						|
                        },
 | 
						|
                    },
 | 
						|
                },
 | 
						|
            },
 | 
						|
        },
 | 
						|
    }
 | 
						|
 | 
						|
#https://lists.isc.org/pipermail/bind-users/2006-January/061051.html
 |