Add reverse zones
							parent
							
								
									bd9a7ef4e9
								
							
						
					
					
						commit
						450be99ada
					
				| 
						 | 
				
			
			@ -13,6 +13,7 @@ import requests
 | 
			
		|||
import stat
 | 
			
		||||
import json
 | 
			
		||||
import collections
 | 
			
		||||
import netaddr
 | 
			
		||||
from configparser import ConfigParser
 | 
			
		||||
 | 
			
		||||
from ansible.module_utils._text import to_native
 | 
			
		||||
| 
						 | 
				
			
			@ -312,6 +313,9 @@ class LookupModule(LookupBase):
 | 
			
		|||
       - dnszones: Queries the re2o API and returns the list of all dns zones
 | 
			
		||||
                   nicely formatted to be rendered in a template.
 | 
			
		||||
 | 
			
		||||
       - dnsreverse: Queries the re2o API and returns the list of all reverse
 | 
			
		||||
                     dns zones, formatted to be rendered in a template.
 | 
			
		||||
 | 
			
		||||
       - get_role, role_name: Works in pair. Fails if role_name not provided.
 | 
			
		||||
                              Queries the re2o API and returns the list of
 | 
			
		||||
                              all machines whose role_type is role_name.
 | 
			
		||||
| 
						 | 
				
			
			@ -402,6 +406,8 @@ class LookupModule(LookupBase):
 | 
			
		|||
            display.v("\nLookup for {} \n".format(term))
 | 
			
		||||
            if term == 'dnszones':
 | 
			
		||||
                res.append(self._getzones(api_client))
 | 
			
		||||
            elif term == 'dnsreverse':
 | 
			
		||||
                res.append(self._getreverse(api_client))
 | 
			
		||||
            elif term == 'get_role':
 | 
			
		||||
                try:
 | 
			
		||||
                    role_name = dterms.popleft()
 | 
			
		||||
| 
						 | 
				
			
			@ -429,6 +435,47 @@ class LookupModule(LookupBase):
 | 
			
		|||
        zones_name = [zone["name"][1:] for zone in zones]
 | 
			
		||||
        return zones_name
 | 
			
		||||
 | 
			
		||||
    def _getreverse(self, api_client):
 | 
			
		||||
        display.v("Getting dns reverse zones")
 | 
			
		||||
        display.vvv("Contacting the API, endpoint dns/reverse-zones...")
 | 
			
		||||
        zones = api_client.list('dns/reverse-zones')
 | 
			
		||||
        display.vvv("...Done")
 | 
			
		||||
        res = []
 | 
			
		||||
        for zone in zones:
 | 
			
		||||
            if zone['ptr_records']:
 | 
			
		||||
                display.vvv('Found PTR records')
 | 
			
		||||
                subnets = []
 | 
			
		||||
                for net in zone['cidrs']:
 | 
			
		||||
                    net = netaddr.IPNetwork(net)
 | 
			
		||||
                    if net.prefixlen > 24:
 | 
			
		||||
                        subnets.extend(net.subnet(32))
 | 
			
		||||
                    elif net.prefixlen > 16:
 | 
			
		||||
                        subnets.extend(net.subnet(24))
 | 
			
		||||
                    elif net.prefixlen > 8:
 | 
			
		||||
                        subnets.extend(net.subnet(16))
 | 
			
		||||
                    else:
 | 
			
		||||
                        subnets.extend(net.subnet(8))
 | 
			
		||||
                for subnet in subnets:
 | 
			
		||||
                    _address = netaddr.IPAddress(subnet.first)
 | 
			
		||||
                    rev_dns_a = _address.reverse_dns.split('.')[:-1]
 | 
			
		||||
                    if subnet.prefixlen == 8:
 | 
			
		||||
                        zone_name = '.'.join(rev_dns_a[3:])
 | 
			
		||||
                    elif subnet.prefixlen == 16:
 | 
			
		||||
                        zone_name = '.'.join(rev_dns_a[2:])
 | 
			
		||||
                    elif subnet.prefixlen == 24:
 | 
			
		||||
                        zone_name = '.'.join(rev_dns_a[1:])
 | 
			
		||||
                    res.append(zone_name)
 | 
			
		||||
                    display.vvv("Found reverse zone {}".format(zone_name))
 | 
			
		||||
                if zone['ptr_v6_records']:
 | 
			
		||||
                    display.vvv("Found PTR v6 record")
 | 
			
		||||
                    net = netaddr.IPNetwork(zone['prefix_v6']+'/'+str(zone['prefix_v6_length']))
 | 
			
		||||
                    net_class = max(((net.prefixlen -1) // 4) +1, 1)
 | 
			
		||||
                    zone6_name = ".".join(
 | 
			
		||||
                        netaddr.IPAddress(net.first).reverse_dns.split('.')[32 - net_class:])[:-1]
 | 
			
		||||
                    res.append(zone6_name)
 | 
			
		||||
                    display.vvv("Found reverse zone {}".format(zone6_name))
 | 
			
		||||
        return res
 | 
			
		||||
 | 
			
		||||
    def _rawquery(self, api_client, endpoint):
 | 
			
		||||
        display.v("Make a raw query to endpoint {}".format(endpoint))
 | 
			
		||||
        return api_client.list(endpoint)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,6 +44,7 @@
 | 
			
		|||
      masters: "{{ lookup('re2oapi', 'get_role', 'dns-authoritary-master')[0] }}"
 | 
			
		||||
      slaves: "{{ lookup('re2oapi', 'get_role', 'dns-authoritary-slave')[0] }}"
 | 
			
		||||
      zones: "{{ lookup('re2oapi', 'dnszones') }}"
 | 
			
		||||
      reverse: "{{ lookup('re2oapi', 'dnsreverse') }}"
 | 
			
		||||
  roles:
 | 
			
		||||
    - bind-authoritative
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,3 +77,37 @@ zone "{{ zone }}" {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
{% endfor %}
 | 
			
		||||
 | 
			
		||||
// Crans reverse zones
 | 
			
		||||
{% for zone in bind.reverse %}
 | 
			
		||||
zone "{{ zone }}" {
 | 
			
		||||
	{% if is_master -%}
 | 
			
		||||
	type master;
 | 
			
		||||
	// Apparmor: Need to ln -s /var/cache/bind/generated /var/local/re2o-services/dns/generated
 | 
			
		||||
	file "generated/dns.{{ zone }}.zone";
 | 
			
		||||
	allow-transfer {
 | 
			
		||||
		{% for ip in slaves_ipv4 -%}
 | 
			
		||||
		{{ ip }};
 | 
			
		||||
		{% endfor -%}
 | 
			
		||||
		{% for ip in slaves_ipv6 -%}
 | 
			
		||||
		{{ ip }};
 | 
			
		||||
	{% endfor -%}
 | 
			
		||||
	};
 | 
			
		||||
	notify yes;
 | 
			
		||||
	{% else -%}
 | 
			
		||||
	type slave;
 | 
			
		||||
	file "bak.{{ zone }}";
 | 
			
		||||
	masters {
 | 
			
		||||
		{% for ip in masters_ipv4 -%}
 | 
			
		||||
		{{ ip }};
 | 
			
		||||
		{% endfor -%}
 | 
			
		||||
		{% for ip in masters_ipv6 -%}
 | 
			
		||||
		{{ ip }};
 | 
			
		||||
	{% endfor -%}
 | 
			
		||||
	};
 | 
			
		||||
	allow-transfer { "none"; };
 | 
			
		||||
	notify no;
 | 
			
		||||
{% endif -%}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
{% endfor %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue