wip
This commit is contained in:
		
							parent
							
								
									5400df94ed
								
							
						
					
					
						commit
						02bd0b6511
					
				
					 4 changed files with 63 additions and 37 deletions
				
			
		| 
						 | 
					@ -9,7 +9,6 @@ defaults = {
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    'bind': {
 | 
					    'bind': {
 | 
				
			||||||
        'zones': {},
 | 
					 | 
				
			||||||
        'slaves': {},
 | 
					        'slaves': {},
 | 
				
			||||||
        'views': {
 | 
					        'views': {
 | 
				
			||||||
            'internal': {
 | 
					            'internal': {
 | 
				
			||||||
| 
						 | 
					@ -22,6 +21,7 @@ defaults = {
 | 
				
			||||||
                    '192.168.0.0/16',
 | 
					                    '192.168.0.0/16',
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
                'keys': {},
 | 
					                'keys': {},
 | 
				
			||||||
 | 
					                'zones': {},
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            'external': {
 | 
					            'external': {
 | 
				
			||||||
                'default': True,
 | 
					                'default': True,
 | 
				
			||||||
| 
						 | 
					@ -31,6 +31,7 @@ defaults = {
 | 
				
			||||||
                    'any',
 | 
					                    'any',
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
                'keys': {},
 | 
					                'keys': {},
 | 
				
			||||||
 | 
					                'zones': {},
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        'keys': {
 | 
					        'keys': {
 | 
				
			||||||
| 
						 | 
					@ -81,36 +82,40 @@ def collect_records(metadata):
 | 
				
			||||||
    if metadata.get('bind/type') == 'slave':
 | 
					    if metadata.get('bind/type') == 'slave':
 | 
				
			||||||
        return {}
 | 
					        return {}
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    zones = {}
 | 
					    views = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for other_node in repo.nodes:
 | 
					    for view_name, view_conf in metadata.get('bind/views').items():
 | 
				
			||||||
        for fqdn, records in other_node.metadata.get('dns', {}).items():
 | 
					        for other_node in repo.nodes:
 | 
				
			||||||
            matching_zones = sorted(
 | 
					            for fqdn, records in other_node.metadata.get('dns', {}).items():
 | 
				
			||||||
                filter(
 | 
					                matching_zones = sorted(
 | 
				
			||||||
                    lambda potential_zone: fqdn.endswith(potential_zone),
 | 
					                    filter(
 | 
				
			||||||
                    metadata.get('bind/zones').keys()
 | 
					                        lambda potential_zone: fqdn.endswith(potential_zone),
 | 
				
			||||||
                ),
 | 
					                        metadata.get('bind/zones').keys()
 | 
				
			||||||
                key=len,
 | 
					                    ),
 | 
				
			||||||
            )
 | 
					                    key=len,
 | 
				
			||||||
            if matching_zones:
 | 
					                )
 | 
				
			||||||
                zone = matching_zones[-1]
 | 
					                if matching_zones:
 | 
				
			||||||
            else:
 | 
					                    zone = matching_zones[-1]
 | 
				
			||||||
                continue
 | 
					                else:
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            name = fqdn[0:-len(zone) - 1]
 | 
					                name = fqdn[0:-len(zone) - 1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for type, values in records.items():
 | 
					                for type, values in records.items():                    
 | 
				
			||||||
                for value in values:
 | 
					                    for value in values:
 | 
				
			||||||
                    zones\
 | 
					                        if repo.libs.bind.record_matches_view(value, type, name, zone, view_name, metadata, repo):
 | 
				
			||||||
                        .setdefault(zone, {})\
 | 
					                            views\
 | 
				
			||||||
                        .setdefault('records', set())\
 | 
					                                .setdefault(view_name, {})\
 | 
				
			||||||
                        .add(
 | 
					                                .setdefault('zones', {})\
 | 
				
			||||||
                            h({'name': name, 'type': type, 'value': value})
 | 
					                                .setdefault(zone, {})\
 | 
				
			||||||
                        )
 | 
					                                .setdefault('records', set())\
 | 
				
			||||||
 | 
					                                .add(
 | 
				
			||||||
 | 
					                                    h({'name': name, 'type': type, 'value': value})
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
        'bind': {
 | 
					        'bind': {
 | 
				
			||||||
            'zones': zones,
 | 
					            'views': views,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										32
									
								
								libs/bind.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								libs/bind.py
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					from ipaddress import ip_address
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def record_matches_view(value, type, name, zone, view, metadata, repo):
 | 
				
			||||||
 | 
					    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,
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                other_value
 | 
				
			||||||
 | 
					                    for other_node in repo.nodes
 | 
				
			||||||
 | 
					                    if other_node.metadata.get(f'dns/{name}.{zone}/{type}', [])
 | 
				
			||||||
 | 
					                    for other_value in other_node.metadata.get(f'dns/{name}.{zone}/{type}')
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        )):
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        if ip_address(value).is_global:
 | 
				
			||||||
 | 
					            if value == "10.0.0.17" and view == 'external': print(333)
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
 | 
					        elif not list(filter(
 | 
				
			||||||
 | 
					            lambda other_value: ip_address(other_value).is_global,
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                other_value
 | 
				
			||||||
 | 
					                    for other_node in repo.nodes
 | 
				
			||||||
 | 
					                    if other_node.metadata.get(f'dns/{name}.{zone}/{type}', [])
 | 
				
			||||||
 | 
					                    for other_value in other_node.metadata.get(f'dns/{name}.{zone}/{type}')
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        )):
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
| 
						 | 
					@ -40,11 +40,6 @@
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        'letsencrypt': {
 | 
					 | 
				
			||||||
            'domains': {
 | 
					 | 
				
			||||||
                'test11.ckn.li': {},
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        'java': {
 | 
					        'java': {
 | 
				
			||||||
            'version': 11,
 | 
					            'version': 11,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,12 +64,6 @@
 | 
				
			||||||
        'letsencrypt': {
 | 
					        'letsencrypt': {
 | 
				
			||||||
            'domains': {
 | 
					            'domains': {
 | 
				
			||||||
                'ckn.li': {},
 | 
					                'ckn.li': {},
 | 
				
			||||||
                'test6.ckn.li': {
 | 
					 | 
				
			||||||
                    'aliases': {'www.test6.ckn.li'},
 | 
					 | 
				
			||||||
                    'location': '/root/temp',
 | 
					 | 
				
			||||||
                    'owner': 'telegraf',
 | 
					 | 
				
			||||||
                    'reload': {'telegraf'},
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                'sublimity.de': {},
 | 
					                'sublimity.de': {},
 | 
				
			||||||
                'freibrief.net': {},
 | 
					                'freibrief.net': {},
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue