Browse Source

Merge c0d4290d40 into 1a0055eedb

pull/125/merge
Nicolas Karolak 8 years ago
committed by GitHub
parent
commit
b8bd2ca054
6 changed files with 68 additions and 35 deletions
  1. +1
    -1
      README.md
  2. +1
    -0
      docs/records.md
  3. +10
    -3
      octodns/provider/ovh.py
  4. +2
    -2
      octodns/provider/yaml.py
  5. +34
    -29
      octodns/record.py
  6. +20
    -0
      tests/test_octodns_provider_ovh.py

+ 1
- 1
README.md View File

@ -155,7 +155,7 @@ The above command pulled the existing data out of Route53 and placed the results
| [DynProvider](/octodns/provider/dyn.py) | All | Yes | |
| [GoogleCloudProvider](/octodns/provider/googlecloud.py) | A, AAAA, CAA, CNAME, MX, NAPTR, NS, PTR, SPF, SRV, TXT | No | |
| [Ns1Provider](/octodns/provider/ns1.py) | All | No | |
| [OVH](/octodns/provider/ovh.py) | A, AAAA, CNAME, MX, NAPTR, NS, PTR, SPF, SRV, SSHFP, TXT | No | |
| [OVH](/octodns/provider/ovh.py) | A, AAAA, CNAME, DKIM, MX, NAPTR, NS, PTR, SPF, SRV, SSHFP, TXT | No | |
| [PowerDnsProvider](/octodns/provider/powerdns.py) | All | No | |
| [Route53](/octodns/provider/route53.py) | A, AAAA, CAA, CNAME, MX, NAPTR, NS, PTR, SPF, SRV, TXT | Yes | |
| [TinyDNSSource](/octodns/source/tinydns.py) | A, CNAME, MX, NS, PTR | No | read-only |


+ 1
- 0
docs/records.md View File

@ -7,6 +7,7 @@ OctoDNS supports the following record types:
* `A`
* `AAAA`
* `CNAME`
* `DKIM`
* `MX`
* `NAPTR`
* `NS`


+ 10
- 3
octodns/provider/ovh.py View File

@ -7,12 +7,15 @@ from __future__ import absolute_import, division, print_function, \
import logging
from collections import defaultdict
import re
import ovh
from octodns.record import Record
from .base import BaseProvider
_fix_semicolons = re.compile(r'(?<!\\);')
class OvhProvider(BaseProvider):
"""
@ -32,8 +35,8 @@ class OvhProvider(BaseProvider):
SUPPORTS_GEO = False
SUPPORTS = set(('A', 'AAAA', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR', 'SPF',
'SRV', 'SSHFP', 'TXT'))
SUPPORTS = set(('A', 'AAAA', 'CNAME', 'DKIM', 'MX', 'NAPTR', 'NS', 'PTR',
'SPF', 'SRV', 'SSHFP', 'TXT'))
def __init__(self, id, endpoint, application_key, application_secret,
consumer_key, *args, **kwargs):
@ -103,7 +106,8 @@ class OvhProvider(BaseProvider):
return {
'ttl': records[0]['ttl'],
'type': _type,
'values': [record['target'] for record in records]
'values': [_fix_semicolons.sub('\;', record['target'])
for record in records]
}
@staticmethod
@ -189,6 +193,8 @@ class OvhProvider(BaseProvider):
_data_for_NS = _data_for_multiple
_data_for_TXT = _data_for_multiple
_data_for_SPF = _data_for_multiple
_data_for_DKIM = _data_for_multiple
_data_for_PTR = _data_for_single
_data_for_CNAME = _data_for_single
@ -263,6 +269,7 @@ class OvhProvider(BaseProvider):
_params_for_NS = _params_for_multiple
_params_for_SPF = _params_for_multiple
_params_for_TXT = _params_for_multiple
_params_for_DKIM = _params_for_multiple
_params_for_CNAME = _params_for_single
_params_for_PTR = _params_for_single


+ 2
- 2
octodns/provider/yaml.py View File

@ -31,8 +31,8 @@ class YamlProvider(BaseProvider):
enforce_order: True
'''
SUPPORTS_GEO = True
SUPPORTS = set(('A', 'AAAA', 'ALIAS', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR',
'SSHFP', 'SPF', 'SRV', 'TXT'))
SUPPORTS = set(('A', 'AAAA', 'ALIAS', 'CNAME', 'DKIM', 'MX', 'NAPTR', 'NS',
'PTR', 'SSHFP', 'SPF', 'SRV', 'TXT'))
def __init__(self, id, directory, default_ttl=3600, enforce_order=True,
*args, **kwargs):


+ 34
- 29
octodns/record.py View File

@ -83,6 +83,7 @@ class Record(object):
'ALIAS': AliasRecord,
'CAA': CaaRecord,
'CNAME': CnameRecord,
'DKIM': DkimRecord,
'MX': MxRecord,
'NAPTR': NaptrRecord,
'NS': NsRecord,
@ -462,6 +463,39 @@ class CnameRecord(_ValueMixin, Record):
return value
class _ChunkedValuesMixin(_ValuesMixin):
CHUNK_SIZE = 255
@classmethod
def _validate_value(cls, value):
if _unescaped_semicolon_re.search(value):
return ['unescaped ;']
return []
def _process_values(self, values):
ret = []
for v in values:
if v and v[0] == '"':
v = v[1:-1]
ret.append(v.replace('" "', ''))
return ret
@property
def chunked_values(self):
values = []
for v in self.values:
v = v.replace('"', '\\"')
vs = [v[i:i + self.CHUNK_SIZE]
for i in range(0, len(v), self.CHUNK_SIZE)]
vs = '" "'.join(vs)
values.append('"{}"'.format(vs))
return values
class DkimRecord(_ChunkedValuesMixin, Record):
_type = 'DKIM'
class MxValue(object):
@classmethod
@ -704,35 +738,6 @@ class SshfpRecord(_ValuesMixin, Record):
_unescaped_semicolon_re = re.compile(r'\w;')
class _ChunkedValuesMixin(_ValuesMixin):
CHUNK_SIZE = 255
@classmethod
def _validate_value(cls, value):
if _unescaped_semicolon_re.search(value):
return ['unescaped ;']
return []
def _process_values(self, values):
ret = []
for v in values:
if v and v[0] == '"':
v = v[1:-1]
ret.append(v.replace('" "', ''))
return ret
@property
def chunked_values(self):
values = []
for v in self.values:
v = v.replace('"', '\\"')
vs = [v[i:i + self.CHUNK_SIZE]
for i in range(0, len(v), self.CHUNK_SIZE)]
vs = '" "'.join(vs)
values.append('"{}"'.format(vs))
return values
class SpfRecord(_ChunkedValuesMixin, Record):
_type = 'SPF'


+ 20
- 0
tests/test_octodns_provider_ovh.py View File

@ -233,6 +233,20 @@ class TestOvhProvider(TestCase):
'value': '1:1ec:1::1',
}))
# DKIM
api_record.append({
'fieldType': 'DKIM',
'ttl': 1300,
'target': 'v=spf1 include:unit.texts.rerirect ~all',
'subDomain': 'default._domainkey',
'id': 16
})
expected.add(Record.new(zone, 'default._domainkey', {
'ttl': 1300,
'type': 'DKIM',
'value': 'v=DKIM1\;k=rsa\;t=s\;p=MIB22IjANB3zRgkqhkiG9w0BcAQEFAAOCAQ8A'
}))
@patch('ovh.Client')
def test_populate(self, client_mock):
provider = OvhProvider('test', 'endpoint', 'application_key',
@ -333,6 +347,12 @@ class TestOvhProvider(TestCase):
target=u'v=spf1 include:unit.texts.'
u'rerirect ~all',
ttl=1000),
call(u'/domain/zone/unit.tests/record',
fieldType=u'DKIM',
subDomain=u'default._domainkey',
target=u'v=DKIM1\;k=rsa\;t=s\;p=MIB22IjANB3zR'
u'gkqhkiG9w0BcAQEFAAOCAQ8A',
ttl=1300),
call(u'/domain/zone/unit.tests/record',
fieldType=u'A',
subDomain='sub', target=u'1.2.3.4', ttl=200),


Loading…
Cancel
Save