mirror of
https://github.com/github/octodns.git
synced 2024-05-11 05:55:00 +00:00
62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
#
|
|
#
|
|
#
|
|
|
|
from logging import getLogger
|
|
|
|
from .base import BaseProcessor
|
|
|
|
|
|
class AcmeMangingProcessor(BaseProcessor):
|
|
log = getLogger('AcmeMangingProcessor')
|
|
|
|
def __init__(self, name):
|
|
'''
|
|
processors:
|
|
acme:
|
|
class: octodns.processor.acme.AcmeMangingProcessor
|
|
|
|
...
|
|
|
|
zones:
|
|
something.com.:
|
|
...
|
|
processors:
|
|
- acme
|
|
...
|
|
'''
|
|
super().__init__(name)
|
|
|
|
self._owned = set()
|
|
|
|
def process_source_zone(self, desired, *args, **kwargs):
|
|
for record in desired.records:
|
|
if record._type == 'TXT' and record.name.startswith(
|
|
'_acme-challenge'
|
|
):
|
|
# We have a managed acme challenge record (owned by octoDNS) so
|
|
# we should mark it as such
|
|
record = record.copy()
|
|
record.values.append('*octoDNS*')
|
|
record.values.sort()
|
|
# This assumes we'll see things as sources before targets,
|
|
# which is the case...
|
|
self._owned.add(record)
|
|
desired.add_record(record, replace=True)
|
|
return desired
|
|
|
|
def process_target_zone(self, existing, *args, **kwargs):
|
|
for record in existing.records:
|
|
# Uses a startswith rather than == to ignore subdomain challenges,
|
|
# e.g. _acme-challenge.foo.domain.com when managing domain.com
|
|
if (
|
|
record._type == 'TXT'
|
|
and record.name.startswith('_acme-challenge')
|
|
and '*octoDNS*' not in record.values
|
|
and record not in self._owned
|
|
):
|
|
self.log.info('_process: ignoring %s', record.fqdn)
|
|
existing.remove_record(record)
|
|
|
|
return existing
|