diff --git a/octodns/provider/yaml.py b/octodns/provider/yaml.py index 1a2a512..4c704ac 100644 --- a/octodns/provider/yaml.py +++ b/octodns/provider/yaml.py @@ -73,6 +73,10 @@ class YamlProvider(BaseProvider): # (optional, default False) disable_zonefile: false + # Whether or not ; in values, e.g. TXT, are escaped \\; + # (optional, default True) + escaped_semicolons: True + Note ---- @@ -192,13 +196,14 @@ class YamlProvider(BaseProvider): split_catchall=True, shared_filename=False, disable_zonefile=False, + escaped_semicolons=True, *args, **kwargs, ): klass = self.__class__.__name__ self.log = logging.getLogger(f'{klass}[{id}]') self.log.debug( - '__init__: id=%s, directory=%s, default_ttl=%d, enforce_order=%d, order_mode=%s, populate_should_replace=%s, supports_root_ns=%s, split_extension=%s, split_catchall=%s, shared_filename=%s, disable_zonefile=%s', + '__init__: id=%s, directory=%s, default_ttl=%d, enforce_order=%d, order_mode=%s, populate_should_replace=%s, supports_root_ns=%s, split_extension=%s, split_catchall=%s, shared_filename=%s, disable_zonefile=%s, escaped_semicolons=%s', id, directory, default_ttl, @@ -210,6 +215,7 @@ class YamlProvider(BaseProvider): split_catchall, shared_filename, disable_zonefile, + escaped_semicolons, ) super().__init__(id, *args, **kwargs) self.directory = directory @@ -222,6 +228,7 @@ class YamlProvider(BaseProvider): self.split_catchall = split_catchall self.shared_filename = shared_filename self.disable_zonefile = disable_zonefile + self.escaped_semicolons = escaped_semicolons def copy(self): kwargs = dict(self.__dict__) @@ -326,6 +333,12 @@ class YamlProvider(BaseProvider): if not isinstance(data, list): data = [data] for d in data: + _type = d.get('type') + if not self.escaped_semicolons and _type in ('SPF', 'TXT'): + if 'value' in d: + d['value'] = d[''].replace(';', '\\;') + if 'values' in d: + d['values'] = [v.replace(';', '\\;') for v in d['values']] if 'ttl' not in d: d['ttl'] = self.default_ttl record = Record.new(