wip
This commit is contained in:
		
							parent
							
								
									f6dce9adab
								
							
						
					
					
						commit
						ee09e81a22
					
				
					 6 changed files with 82 additions and 7 deletions
				
			
		|  | @ -27,7 +27,10 @@ view "${view['name']}" { | ||||||
| 
 | 
 | ||||||
|   % for zone in zones: |   % for zone in zones: | ||||||
|   zone "${zone}" { |   zone "${zone}" { | ||||||
|     type master; |     type ${type}; | ||||||
|  | % if type == 'slave': | ||||||
|  |     masters { ${master_ip}; }; | ||||||
|  | % endif | ||||||
|     file "/var/lib/bind/${view['name']}/db.${zone}"; |     file "/var/lib/bind/${view['name']}/db.${zone}"; | ||||||
|   }; |   }; | ||||||
|   % endfor |   % endfor | ||||||
|  |  | ||||||
|  | @ -7,4 +7,10 @@ options { | ||||||
| 
 | 
 | ||||||
|   max-cache-size 30%; |   max-cache-size 30%; | ||||||
|   querylog yes; |   querylog yes; | ||||||
|  | 
 | ||||||
|  | % if type == 'master': | ||||||
|  |   notify yes; | ||||||
|  |   also-notify { ${' '.join([f'{ip};' for ip in slave_ips])} }; | ||||||
|  |   allow-transfer { ${' '.join([f'{ip};' for ip in slave_ips])} }; | ||||||
|  | % endif | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -1,6 +1,18 @@ | ||||||
| from ipaddress import ip_address | from ipaddress import ip_address, ip_interface | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
| 
 | 
 | ||||||
|  | if node.metadata.get('bind/type') == 'master': | ||||||
|  |     zones = node.metadata.get('bind/zones') | ||||||
|  |     master_ip = None | ||||||
|  |     slave_ips = [ | ||||||
|  |         ip_interface(repo.get_node(slave).metadata.get('network/external/ipv4')).ip | ||||||
|  |             for slave in node.metadata.get('bind/slaves') | ||||||
|  |     ] | ||||||
|  | else: | ||||||
|  |     zones = repo.get_node(node.metadata.get('bind/master_node')).metadata.get('bind/zones') | ||||||
|  |     master_ip = ip_interface(repo.get_node(node.metadata.get('bind/master_node')).metadata.get('network/external/ipv4')).ip | ||||||
|  |     slave_ips = [] | ||||||
|  | 
 | ||||||
| directories[f'/var/lib/bind'] = { | directories[f'/var/lib/bind'] = { | ||||||
|     'purge': True, |     'purge': True, | ||||||
|     'needed_by': [ |     'needed_by': [ | ||||||
|  | @ -35,6 +47,11 @@ files['/etc/bind/named.conf'] = { | ||||||
|     ], |     ], | ||||||
| } | } | ||||||
| files['/etc/bind/named.conf.options'] = { | files['/etc/bind/named.conf.options'] = { | ||||||
|  |     'content_type': 'mako', | ||||||
|  |     'context': { | ||||||
|  |         'type': node.metadata.get('bind/type'), | ||||||
|  |         'slave_ips': sorted(slave_ips), | ||||||
|  |     }, | ||||||
|     'owner': 'root', |     'owner': 'root', | ||||||
|     'group': 'bind', |     'group': 'bind', | ||||||
|     'needs': [ |     'needs': [ | ||||||
|  | @ -72,8 +89,10 @@ views = [ | ||||||
| files['/etc/bind/named.conf.local'] = { | files['/etc/bind/named.conf.local'] = { | ||||||
|     'content_type': 'mako', |     'content_type': 'mako', | ||||||
|     'context': { |     'context': { | ||||||
|  |         'type': node.metadata.get('bind/type'), | ||||||
|  |         'master_ip': master_ip, | ||||||
|         'views': views, |         'views': views, | ||||||
|         'zones': sorted(node.metadata.get('bind/zones')), |         'zones': sorted(zones), | ||||||
|     }, |     }, | ||||||
|     'owner': 'root', |     'owner': 'root', | ||||||
|     'group': 'bind', |     'group': 'bind', | ||||||
|  | @ -117,7 +136,7 @@ for view in views: | ||||||
|         ], |         ], | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     for zone, records in node.metadata.get('bind/zones').items(): |     for zone, records in zones.items(): | ||||||
|         files[f"/var/lib/bind/{view['name']}/db.{zone}"] = { |         files[f"/var/lib/bind/{view['name']}/db.{zone}"] = { | ||||||
|             'group': 'bind', |             'group': 'bind', | ||||||
|             'source': 'db', |             'source': 'db', | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ defaults = { | ||||||
|     }, |     }, | ||||||
|     'bind': { |     'bind': { | ||||||
|         'zones': {}, |         'zones': {}, | ||||||
|  |         'slaves': {}, | ||||||
|     }, |     }, | ||||||
|     'telegraf': { |     'telegraf': { | ||||||
|         'config': { |         'config': { | ||||||
|  | @ -24,6 +25,17 @@ defaults = { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @metadata_reactor.provides( | ||||||
|  |     'bind/type', | ||||||
|  | ) | ||||||
|  | def type(metadata): | ||||||
|  |     return { | ||||||
|  |         'bind': { | ||||||
|  |             'type': 'slave' if metadata.get('bind/master_node', None) else 'master', | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| @metadata_reactor.provides( | @metadata_reactor.provides( | ||||||
|     'dns', |     'dns', | ||||||
| ) | ) | ||||||
|  | @ -39,6 +51,9 @@ def dns(metadata): | ||||||
|     'bind/zones', |     'bind/zones', | ||||||
| ) | ) | ||||||
| def collect_records(metadata): | def collect_records(metadata): | ||||||
|  |     if metadata.get('bind/type') == 'slave': | ||||||
|  |         return {} | ||||||
|  |      | ||||||
|     zones = {} |     zones = {} | ||||||
|      |      | ||||||
|     for other_node in repo.nodes: |     for other_node in repo.nodes: | ||||||
|  | @ -76,13 +91,41 @@ def collect_records(metadata): | ||||||
|     'bind/zones', |     'bind/zones', | ||||||
| ) | ) | ||||||
| def ns_records(metadata): | def ns_records(metadata): | ||||||
|  |     if metadata.get('bind/type') == 'slave': | ||||||
|  |         return {} | ||||||
|  | 
 | ||||||
|  |     nameservers = [ | ||||||
|  |         node.metadata.get('bind/hostname'), | ||||||
|  |         *[ | ||||||
|  |             repo.get_node(slave).metadata.get('bind/hostname') | ||||||
|  |                 for slave in node.metadata.get('bind/slaves') | ||||||
|  |         ] | ||||||
|  |     ] | ||||||
|     return { |     return { | ||||||
|         'bind': { |         'bind': { | ||||||
|             'zones': { |             'zones': { | ||||||
|                 zone: [ |                 zone: [ | ||||||
|                     {'name': '@', 'type': 'NS', 'value': f"{metadata.get('bind/hostname')}."}, |                     {'name': '@', 'type': 'NS', 'value': f"{nameserver}."} | ||||||
|                     {'name': '@', 'type': 'NS', 'value': f"{metadata.get('bind/secondary_hostname')}."}, |                         for nameserver in nameservers | ||||||
|                 ] for zone in metadata.get('bind/zones').keys() |                 ] for zone in metadata.get('bind/zones').keys() | ||||||
|             }, |             }, | ||||||
|         }, |         }, | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @metadata_reactor.provides( | ||||||
|  |     'bind/slaves', | ||||||
|  | ) | ||||||
|  | def slaves(metadata): | ||||||
|  |     if metadata.get('bind/type') == 'slave': | ||||||
|  |         return {} | ||||||
|  |      | ||||||
|  |     return { | ||||||
|  |         'bind': { | ||||||
|  |             'slaves': [ | ||||||
|  |                 other_node.name | ||||||
|  |                     for other_node in repo.nodes | ||||||
|  |                     if other_node.has_bundle('bind') and other_node.metadata.get('bind/master_node', None) == node.name | ||||||
|  |             ], | ||||||
|  |         }, | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | @ -18,7 +18,6 @@ | ||||||
|         'id': 'ea29bdf0-0b47-4bf4-8346-67d60c9dc4ae', |         'id': 'ea29bdf0-0b47-4bf4-8346-67d60c9dc4ae', | ||||||
|         'bind': { |         'bind': { | ||||||
|             'hostname': 'resolver.name', |             'hostname': 'resolver.name', | ||||||
|             'secondary_hostname': 'second.resolver.name', |  | ||||||
|             'zones': { |             'zones': { | ||||||
|                 'sublimity.de': [], |                 'sublimity.de': [], | ||||||
|                 'freibrief.net': [], |                 'freibrief.net': [], | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|     'hostname': '46.38.240.85', |     'hostname': '46.38.240.85', | ||||||
|     'groups': [ |     'groups': [ | ||||||
|         'debian-10', |         'debian-10', | ||||||
|  |         'dnsserver', | ||||||
|     ], |     ], | ||||||
|     'bundles': [ |     'bundles': [ | ||||||
|         'wireguard', |         'wireguard', | ||||||
|  | @ -21,6 +22,10 @@ | ||||||
|                 'ipv4': '10.0.11.2/24', |                 'ipv4': '10.0.11.2/24', | ||||||
|             }, |             }, | ||||||
|         }, |         }, | ||||||
|  |         'bind': { | ||||||
|  |             'master_node': 'htz.mails', | ||||||
|  |             'hostname': 'second.resolver.name', | ||||||
|  |         }, | ||||||
|         'wireguard': { |         'wireguard': { | ||||||
|             'my_ip': '172.30.0.3/24', |             'my_ip': '172.30.0.3/24', | ||||||
|             'peers': { |             'peers': { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 mwiegand
						mwiegand