1
0
mirror of https://github.com/github/octodns.git synced 2024-05-11 05:55:00 +00:00

auto-arpa support for ptrs with multiple values

This commit is contained in:
Ross McFarland
2023-01-22 07:10:36 -08:00
parent 5a1e3fcb88
commit cfa7918f35
2 changed files with 50 additions and 20 deletions

View File

@@ -2,6 +2,7 @@
#
#
from collections import defaultdict
from ipaddress import ip_address
from logging import getLogger
@@ -14,7 +15,7 @@ class AutoArpa(BaseProcessor):
super().__init__(name)
self.log = getLogger(f'AutoArpa[{name}]')
self.ttl = ttl
self._records = {}
self._records = defaultdict(set)
def process_source_zone(self, desired, sources):
for record in desired.records:
@@ -30,7 +31,7 @@ class AutoArpa(BaseProcessor):
for ip in ips:
ptr = ip_address(ip).reverse_pointer
self._records[f'{ptr}.'] = record.fqdn
self._records[f'{ptr}.'].add(record.fqdn)
return desired
@@ -46,11 +47,14 @@ class AutoArpa(BaseProcessor):
zone_name = zone.name
n = len(zone_name) + 1
for arpa, fqdn in self._records.items():
for arpa, fqdns in self._records.items():
if arpa.endswith(zone_name):
name = arpa[:-n]
fqdns = sorted(fqdns)
record = Record.new(
zone, name, {'ttl': self.ttl, 'type': 'PTR', 'value': fqdn}
zone,
name,
{'ttl': self.ttl, 'type': 'PTR', 'values': fqdns},
)
zone.add_record(record)

View File

@@ -27,7 +27,7 @@ class TestAutoArpa(TestCase):
aa = AutoArpa('auto-arpa')
aa.process_source_zone(zone, [])
self.assertEqual(
{'4.3.2.1.in-addr.arpa.': 'a.unit.tests.'}, aa._records
{'4.3.2.1.in-addr.arpa.': {'a.unit.tests.'}}, aa._records
)
# matching zone
@@ -56,8 +56,8 @@ class TestAutoArpa(TestCase):
aa.process_source_zone(zone, [])
self.assertEqual(
{
'4.3.2.1.in-addr.arpa.': 'a.unit.tests.',
'5.3.2.1.in-addr.arpa.': 'a.unit.tests.',
'4.3.2.1.in-addr.arpa.': {'a.unit.tests.'},
'5.3.2.1.in-addr.arpa.': {'a.unit.tests.'},
},
aa._records,
)
@@ -81,7 +81,7 @@ class TestAutoArpa(TestCase):
aa = AutoArpa('auto-arpa')
aa.process_source_zone(zone, [])
ip6_arpa = '2.0.0.0.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.c.0.0.0.f.f.0.0.ip6.arpa.'
self.assertEqual({ip6_arpa: 'aaaa.unit.tests.'}, aa._records)
self.assertEqual({ip6_arpa: {'aaaa.unit.tests.'}}, aa._records)
# matching zone
arpa = Zone('c.0.0.0.f.f.0.0.ip6.arpa.', [])
@@ -117,13 +117,13 @@ class TestAutoArpa(TestCase):
aa.process_source_zone(zone, [])
self.assertEqual(
{
'1.1.1.1.in-addr.arpa.': 'geo.unit.tests.',
'2.2.2.2.in-addr.arpa.': 'geo.unit.tests.',
'3.3.3.3.in-addr.arpa.': 'geo.unit.tests.',
'4.4.4.4.in-addr.arpa.': 'geo.unit.tests.',
'5.5.5.5.in-addr.arpa.': 'geo.unit.tests.',
'4.3.2.1.in-addr.arpa.': 'geo.unit.tests.',
'5.3.2.1.in-addr.arpa.': 'geo.unit.tests.',
'1.1.1.1.in-addr.arpa.': {'geo.unit.tests.'},
'2.2.2.2.in-addr.arpa.': {'geo.unit.tests.'},
'3.3.3.3.in-addr.arpa.': {'geo.unit.tests.'},
'4.4.4.4.in-addr.arpa.': {'geo.unit.tests.'},
'5.5.5.5.in-addr.arpa.': {'geo.unit.tests.'},
'4.3.2.1.in-addr.arpa.': {'geo.unit.tests.'},
'5.3.2.1.in-addr.arpa.': {'geo.unit.tests.'},
},
aa._records,
)
@@ -167,11 +167,37 @@ class TestAutoArpa(TestCase):
aa.process_source_zone(zone, [])
self.assertEqual(
{
'3.3.3.3.in-addr.arpa.': 'dynamic.unit.tests.',
'4.4.4.4.in-addr.arpa.': 'dynamic.unit.tests.',
'5.5.5.5.in-addr.arpa.': 'dynamic.unit.tests.',
'4.3.2.1.in-addr.arpa.': 'dynamic.unit.tests.',
'5.3.2.1.in-addr.arpa.': 'dynamic.unit.tests.',
'3.3.3.3.in-addr.arpa.': {'dynamic.unit.tests.'},
'4.4.4.4.in-addr.arpa.': {'dynamic.unit.tests.'},
'5.5.5.5.in-addr.arpa.': {'dynamic.unit.tests.'},
'4.3.2.1.in-addr.arpa.': {'dynamic.unit.tests.'},
'5.3.2.1.in-addr.arpa.': {'dynamic.unit.tests.'},
},
aa._records,
)
def test_multiple_names(self):
zone = Zone('unit.tests.', [])
record1 = Record.new(
zone, 'a1', {'ttl': 32, 'type': 'A', 'value': '1.2.3.4'}
)
zone.add_record(record1)
record2 = Record.new(
zone, 'a2', {'ttl': 32, 'type': 'A', 'value': '1.2.3.4'}
)
zone.add_record(record2)
aa = AutoArpa('auto-arpa')
aa.process_source_zone(zone, [])
self.assertEqual(
{'4.3.2.1.in-addr.arpa.': {'a1.unit.tests.', 'a2.unit.tests.'}},
aa._records,
)
# matching zone
arpa = Zone('3.2.1.in-addr.arpa.', [])
aa.populate(arpa)
self.assertEqual(1, len(arpa.records))
(ptr,) = arpa.records
self.assertEqual('4.3.2.1.in-addr.arpa.', ptr.fqdn)
self.assertEqual([record1.fqdn, record2.fqdn], ptr.values)
self.assertEqual(3600, ptr.ttl)