Commit graph

477 commits

Author SHA1 Message Date
Simen Bai
e9510da434
Domainnameshop provider (#1625)
* Added basic structure for domain name shop

* Finished proof of concept for domainnameshop

* Fixed handeling of IDNA for CNAME records

* Updated documentation notes

* Added docs

* Ran linter and vet

* Removed proxy config used for debugging

* Ran go generate

* Fixed issue with TTLs being restricted to a multiple of 60

* Ran tests, vet and linting and fixed flaws

* Fixed typo in docs

* Improved code based on feedback

* Fixed issues with TXT records not working properly

* Refactored according to new file layout proposed

* Updated documentation matrix

* Suggestions and corrections

* Corrected according to suggestions

Co-authored-by: Simen Bai <git@simenbai.no>
Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-08-01 12:01:37 -04:00
Amelia Aronsohn
befb52be86
DNSIMPLE: Fix TXT Handling, Second Edition (#1624)
* Fix typo and add sandbox information

* Use SetTargetTXT in GetZoneRecords

This fixes the behavior documented in #1622

Also apply cleanup to GetZoneRecords

* Remove SetTargetTXT, does not work in all tests

* Set The most correct TXT handling

* Well, There's your problem

* Add an audit and test for unpaired quotes

* Add some commentary

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-07-22 09:36:28 -04:00
Tom Limoncelli
15e6c95042
CSCGLOBAL: Lazy-check API results, saving 5-7 minutes per domain (#1638) 2022-07-21 14:35:37 -04:00
Tom Limoncelli
b2bef175e0
GANDI_V5: better error handling (#1639)
* GANDI_V5: better error handling

* use newer parsers

* fixup!
2022-07-21 14:30:26 -04:00
Tom Limoncelli
4d768afc3d
CSCGLOBAL: Support TXT records that are long or include double-quotes (#1631)
* Remove TXT restrictions around length

* Improve get-zones "js" format.

New:

```
$ dnscontrol get-zone --format js providercredkey - stackoverflow.co.il
var DSP_PROVIDERCREDKEY = NewDnsProvider("providercredkey");
var REG_CHANGEME = NewRegistrar("none");
D("stackoverflow.co.il", REG_CHANGEME,
	DnsProvider(DSP_PROVIDERCREDKEY),
	DefaultTTL(14400),
	A('www', '165.160.15.20'),
	...
	...
	...
	...
	//NAMESERVER('dns1.cscdns.net.'),
	//NAMESERVER('dns2.cscdns.net.')
)
```

* Update test data
2022-07-19 17:48:15 -04:00
Tom Limoncelli
c7d3667d87
NAMEDOTCOM: Better estimate TXT length restrictions (#1627) 2022-07-18 10:30:19 -04:00
Tom Limoncelli
a0a917266f
MSDNS: Add missing newline to PS warning (#1614) 2022-07-12 14:48:01 -04:00
Amelia Aronsohn
b0d80ae498
DNSIMPLE: do not support unpaired double quotes in TXT (#1610)
* DNSIMPLE: do not support unpaired double quotes in TXT

DNSimple supports multiple double-quotes strings in a TXT record, but does not correctly support unpaired or escaped double-quotes currently.

IE the following are valid
```
asdf
"asdf"
"asdf" "asdf"
!@#$ %^&*()([][{}{<></'`:;-_=+\
```

however `as\"df` and `as"df` are not

This removes the extra string processing in getTargetRecordPriority as all tests pass without it and currently only double-quotes cause problems in our TXT validations.

I added another test to prove additional quoting is not needed. We can remove it if undesired.

Also applied small lint changes to make my editor happy.

* Use backticks to prevent escaping

* Set TXT target record content to GetTargetRFC1035Quoted()

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-07-11 14:52:18 -04:00
Amelia Aronsohn
72ae22fd54
DNSIMPLE: do not support DS records (#1608)
DNSimple does not support adding your own DS records at this time.

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-07-09 01:12:46 -04:00
Markus Enander
0f04639891
Enable ADC for Gcloud provider (#1583)
Fallback to using Application Default Credentials if no
private_key is available in the creds.json-file.

This allows usage with various short lived credentials, for example
GCE-instances, gcloud auth application-default login, OIDC Workload
Identity etc

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-07-05 15:53:51 -04:00
Jan-Philipp Benecke
e9bf00f581
POWERDNS: Cleanup and fix parsing of TXT records (#1569)
* POWERDNS: Cleanup and fix parsing of TXT records

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>

* Add unit tests for convert functions

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
2022-06-20 14:35:13 -04:00
Jan-Philipp Benecke
e5de7b5359
MAINT: Restructuring of the PowerDNS DSP based on the layout of CSCGlobal (#1549)
* Restructure PowerDNS DSP based on layout for CSCGlobal

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>

* Rename api to dsp and make initializer function private

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-06-20 12:27:05 -04:00
Tom Limoncelli
959f721c04
MAINT: Update TXT docs, suggest not using TxtNoLen255 (#1548)
* suggest not using TxtNoLen255

* Rename functions

* wip!

* fixing!
2022-06-20 11:34:05 -04:00
Tom Limoncelli
dad4115a55
CLOUDFLAREAPI: Fix TXT quoting bug (#1543)
* Cleanup

* wip!

* Fix cloudflare quote bug

* wip!

* cleanup

* go generate
2022-06-18 09:58:55 -04:00
Jan-Philipp Benecke
bcb968411a
MAINT: Unify provider outputs to pkg/printer (#1546)
* Unify provider outputs to pkg/printer

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>

* No need for custom Errorf

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>

* Add missing import for activedir

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>

* Add missing fmt import for activedir

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
2022-06-18 09:01:02 -04:00
Jan-Philipp Benecke
ba2c7f9c0e
MAINT: Enforcing formatted code (#1544)
* Enforcing formatted code

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>

* Show lines

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>

* Run check after deps are installed

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
2022-06-18 08:56:04 -04:00
Tom Limoncelli
cbf5ebd64c
CLOUDFLAREAPI: Fix quoted TXT bug (#1538)
* Cleanup

* add GetTargetQuotedRFC1038

* wip!

* The RFC is 1035
2022-06-16 17:16:29 -04:00
Tom Limoncelli
cc0fecf1f7 Revert "CLOUDFLAREAPI: Fix TXT records with quotes"
This reverts commit c3f52d228a.
2022-06-16 15:21:45 -04:00
Tom Limoncelli
c3f52d228a CLOUDFLAREAPI: Fix TXT records with quotes 2022-06-16 15:19:44 -04:00
Tom Limoncelli
7826c23cfa
CSCGLOBAL: Enable CAA records (#1536)
* Enable CAA

* Another API oddity

* Disable debug output
2022-06-14 07:16:01 -04:00
Tom Limoncelli
752e25471d
NEW PROVIDER: CSCGLOBAL as DNS Service Provider (#1516)
* Move the registrar features to a separate file

* Prepare the testing framework

* Roughed out functions

* Fix up structs

* WIP!

* First tests pass

* wip!

* Flesh out remaining rTypes, get nameservers, etc

* Fix TXT records

* Clean up code

* More cleanups. Fix CAA/SRV

* Linting

* Cleanups/linting

* Fix CAA [more] and more cleanups

* CSC does not like very long txt records

* Use timer only when interactive

* Disable CAA for now

* Update docs

* Remove debug printf

* add go-isatty

* cleanups
2022-06-12 16:01:08 -04:00
Jan-Philipp Benecke
60324bc4f5
CLOUDFLAREAPI: FIX: Preventing segfault when Cloudflare API limit is reached (#1530)
* Preventing segfault when Cloudflare API limit is reached

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>

* Add comment for future me

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
2022-06-09 11:26:46 -04:00
Jan-Philipp Benecke
c0450223c2
Create non-existing zones while push or print warning while preview (#1528)
* Create non-existing zones while push. While preview print a warning

Signed-off-by: Jan-Philipp Benecke <jan-philipp.benecke@jpbe.de>

* Ooops, remove testing lines

Signed-off-by: Jan-Philipp Benecke <jan-philipp.benecke@jpbe.de>

* Renaming flag

Signed-off-by: Jan-Philipp Benecke <jan-philipp.benecke@jpbe.de>

* Change flag description

Signed-off-by: Jan-Philipp Benecke <jan-philipp.benecke@jpbe.de>

* Reverse flag logic

Signed-off-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
2022-06-08 14:53:16 -04:00
Nicolas Lorin
1e8e449160
VULTR: Enable long TXT (#1518) 2022-06-01 12:15:29 -04:00
Olivetti
c80cfbb7ae
Autosplit long TXT records disabled (#1481)
providers-test-netcup.log appended:

=== RUN   TestDNSProviders
=== RUN   TestDNSProviders/oXXX.de
=== RUN   TestDNSProviders/oXXX.de/Clean_Slate:Empty
    integration_test.go:220: DELETE A test.oXXX.de 1.2.3.4 ttl=0, Netcup ID: 50790741
=== RUN   TestDNSProviders/oXXX.de/00:GeneralACD:Create_an_A_record
    integration_test.go:220: CREATE A oXXX.de 1.1.1.1 ttl=0
=== RUN   TestDNSProviders/oXXX.de/00:GeneralACD:Change_it
    integration_test.go:220: MODIFY A oXXX.de: (1.1.1.1 ttl=0) -> (1.2.3.4 ttl=0), Netcup ID: 50825306: 
=== RUN   TestDNSProviders/oXXX.de/00:GeneralACD:Add_another
    integration_test.go:220: CREATE A www.oXXX.de 1.2.3.4 ttl=0
=== RUN   TestDNSProviders/oXXX.de/00:GeneralACD:Add_another(same_name)
    integration_test.go:220: CREATE A www.oXXX.de 5.6.7.8 ttl=0
=== RUN   TestDNSProviders/oXXX.de/00:GeneralACD:Change_a_ttl
    integration_test.go:216: Expected changes, but got none
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty
    integration_test.go:220: DELETE A oXXX.de 1.2.3.4 ttl=0, Netcup ID: 50825306
    integration_test.go:220: DELETE A www.oXXX.de 1.2.3.4 ttl=0, Netcup ID: 50825307
    integration_test.go:220: DELETE A www.oXXX.de 5.6.7.8 ttl=0, Netcup ID: 50825308
=== RUN   TestDNSProviders/oXXX.de/01:WildcardACD:Create_wildcard
    integration_test.go:220: CREATE A *.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A www.oXXX.de 1.1.1.1 ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#01
    integration_test.go:220: DELETE A *.oXXX.de 1.2.3.4 ttl=0, Netcup ID: 50825309
    integration_test.go:220: DELETE A www.oXXX.de 1.1.1.1 ttl=0, Netcup ID: 50825310
=== RUN   TestDNSProviders/oXXX.de/02:CNAME:Create_a_CNAME
    integration_test.go:220: CREATE CNAME foo.oXXX.de google.com. ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#02
    integration_test.go:220: DELETE CNAME foo.oXXX.de google.com. ttl=0, Netcup ID: 50825311
=== RUN   TestDNSProviders/oXXX.de/03:MX:MX_record
    integration_test.go:220: CREATE MX oXXX.de 5 foo.com. ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#03
    integration_test.go:220: DELETE MX oXXX.de 5 foo.com. ttl=0, Netcup ID: 50825312
=== RUN   TestDNSProviders/oXXX.de/04:Null_MX_***SKIPPED(excluded_by_not("NETCUP"))***:Empty
=== RUN   TestDNSProviders/oXXX.de/05:NS_***SKIPPED(excluded_by_not("NETCUP"))***:Empty
=== RUN   TestDNSProviders/oXXX.de/06:IGNORE_NAME_function:Create_some_records
    integration_test.go:220: CREATE TXT foo.oXXX.de "simple" ttl=0
    integration_test.go:220: CREATE A foo.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE TXT foo.oXXX.de "simple" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#04
    integration_test.go:220: DELETE A foo.oXXX.de 1.2.3.4 ttl=0, Netcup ID: 50825313
=== RUN   TestDNSProviders/oXXX.de/07:IGNORE_NAME_apex:Create_some_records
    integration_test.go:220: CREATE TXT bar.oXXX.de "stringbar" ttl=0
    integration_test.go:220: CREATE A bar.oXXX.de 2.4.6.8 ttl=0
    integration_test.go:220: CREATE A oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE TXT oXXX.de "simple" ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 2.
    integration_test.go:241: UNEXPECTED #0: CREATE TXT bar.oXXX.de "stringbar" ttl=0
    integration_test.go:241: UNEXPECTED #1: CREATE TXT oXXX.de "simple" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#05
    integration_test.go:220: DELETE A bar.oXXX.de 2.4.6.8 ttl=0, Netcup ID: 50825314
    integration_test.go:220: DELETE A oXXX.de 1.2.3.4 ttl=0, Netcup ID: 50825315
=== RUN   TestDNSProviders/oXXX.de/08:IGNORE_TARGET_function:Create_some_records
    integration_test.go:220: CREATE CNAME bar.oXXX.de test.bar.com. ttl=0
    integration_test.go:220: CREATE CNAME foo.oXXX.de test.foo.com. ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#06
    integration_test.go:220: DELETE CNAME bar.oXXX.de test.bar.com. ttl=0, Netcup ID: 50825316
    integration_test.go:220: DELETE CNAME foo.oXXX.de test.foo.com. ttl=0, Netcup ID: 50825317
=== RUN   TestDNSProviders/oXXX.de/09:simple_TXT:Create_a_TXT
    integration_test.go:220: CREATE TXT foo.oXXX.de "simple" ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE TXT foo.oXXX.de "simple" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#07
=== RUN   TestDNSProviders/oXXX.de/10:simple_TXT-spf1:Create_a_TXT/SPF
    integration_test.go:220: CREATE TXT foo.oXXX.de "v=spf1 ip4:99.99.99.99 -all" ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE TXT foo.oXXX.de "v=spf1 ip4:99.99.99.99 -all" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#08
=== RUN   TestDNSProviders/oXXX.de/11:long_TXT:Create_long_TXT
    integration_test.go:220: CREATE TXT foo.oXXX.de "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE TXT foo.oXXX.de "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#09
=== RUN   TestDNSProviders/oXXX.de/12:complex_TXT:TXT_with_0-octel_string
    integration_test.go:206: ***SKIPPED(PROVIDER DOES NOT SUPPORT 'txtstring is empty' ::"12:complex TXT")
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#10
=== RUN   TestDNSProviders/oXXX.de/13:long_TXT:Create_a_505_TXT
    integration_test.go:220: CREATE TXT foo257.oXXX.de "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE TXT foo257.oXXX.de "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#11
=== RUN   TestDNSProviders/oXXX.de/14:TXTMulti:Create_TXTMulti_1
    integration_test.go:220: CREATE TXT foo1.oXXX.de "simple" ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE TXT foo1.oXXX.de "simple" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#12
=== RUN   TestDNSProviders/oXXX.de/15:TXTMulti-same:Create_TXTMulti_1
    integration_test.go:220: CREATE TXT foo.oXXX.de "simple" ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE TXT foo.oXXX.de "simple" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#13
=== RUN   TestDNSProviders/oXXX.de/16:TypeChange:Create_a_CNAME
    integration_test.go:220: CREATE CNAME foo.oXXX.de google.com. ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#14
    integration_test.go:220: DELETE CNAME foo.oXXX.de google.com. ttl=0, Netcup ID: 50825318
=== RUN   TestDNSProviders/oXXX.de/17:Case_Sensitivity:Create_CAPS
    integration_test.go:220: CREATE MX bar.oXXX.de 5 bar.com. ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#15
    integration_test.go:220: DELETE MX bar.oXXX.de 5 bar.com. ttl=0, Netcup ID: 50825319
=== RUN   TestDNSProviders/oXXX.de/18:IDNA:Internationalized_name
    integration_test.go:220: CREATE A xn--ndaaa.oXXX.de 1.2.3.4 ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#16
    integration_test.go:220: DELETE A xn--ndaaa.oXXX.de 1.2.3.4 ttl=0, Netcup ID: 50825320
=== RUN   TestDNSProviders/oXXX.de/19:IDNAs_in_CNAME_targets:IDN_CNAME_AND_Target
    integration_test.go:220: CREATE CNAME xn--o-0gab.oXXX.de xn--ndaaa.xn--vhquv. ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#17
    integration_test.go:220: DELETE CNAME xn--o-0gab.oXXX.de xn--ndaaa.xn--vhquv. ttl=0, Netcup ID: 50825321
=== RUN   TestDNSProviders/oXXX.de/20:pager101:99_records
    integration_test.go:220: CREATE A rec0000.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0001.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0002.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0003.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0004.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0005.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0006.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0007.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0008.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0009.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0010.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0011.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0012.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0013.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0014.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0015.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0016.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0017.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0018.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0019.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0020.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0021.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0022.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0023.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0024.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0025.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0026.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0027.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0028.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0029.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0030.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0031.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0032.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0033.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0034.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0035.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0036.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0037.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0038.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0039.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0040.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0041.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0042.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0043.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0044.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0045.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0046.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0047.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0048.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0049.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0050.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0051.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0052.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0053.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0054.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0055.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0056.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0057.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0058.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0059.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0060.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0061.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0062.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0063.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0064.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0065.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0066.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0067.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0068.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0069.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0070.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0071.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0072.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0073.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0074.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0075.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0076.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0077.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0078.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0079.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0080.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0081.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0082.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0083.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0084.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0085.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0086.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0087.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0088.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0089.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0090.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0091.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0092.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0093.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0094.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0095.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0096.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0097.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:220: CREATE A rec0098.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 99.
    integration_test.go:241: UNEXPECTED #0: CREATE A rec0000.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #1: CREATE A rec0001.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #2: CREATE A rec0002.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #3: CREATE A rec0003.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #4: CREATE A rec0004.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #5: CREATE A rec0005.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #6: CREATE A rec0006.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #7: CREATE A rec0007.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #8: CREATE A rec0008.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #9: CREATE A rec0009.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #10: CREATE A rec0010.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #11: CREATE A rec0011.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #12: CREATE A rec0012.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #13: CREATE A rec0013.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #14: CREATE A rec0014.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #15: CREATE A rec0015.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #16: CREATE A rec0016.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #17: CREATE A rec0017.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #18: CREATE A rec0018.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #19: CREATE A rec0019.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #20: CREATE A rec0020.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #21: CREATE A rec0021.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #22: CREATE A rec0022.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #23: CREATE A rec0023.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #24: CREATE A rec0024.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #25: CREATE A rec0025.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #26: CREATE A rec0026.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #27: CREATE A rec0027.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #28: CREATE A rec0028.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #29: CREATE A rec0029.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #30: CREATE A rec0030.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #31: CREATE A rec0031.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #32: CREATE A rec0032.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #33: CREATE A rec0033.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #34: CREATE A rec0034.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #35: CREATE A rec0035.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #36: CREATE A rec0036.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #37: CREATE A rec0037.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #38: CREATE A rec0038.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #39: CREATE A rec0039.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #40: CREATE A rec0040.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #41: CREATE A rec0041.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #42: CREATE A rec0042.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #43: CREATE A rec0043.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #44: CREATE A rec0044.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #45: CREATE A rec0045.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #46: CREATE A rec0046.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #47: CREATE A rec0047.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #48: CREATE A rec0048.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #49: CREATE A rec0049.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #50: CREATE A rec0050.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #51: CREATE A rec0051.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #52: CREATE A rec0052.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #53: CREATE A rec0053.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #54: CREATE A rec0054.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #55: CREATE A rec0055.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #56: CREATE A rec0056.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #57: CREATE A rec0057.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #58: CREATE A rec0058.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #59: CREATE A rec0059.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #60: CREATE A rec0060.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #61: CREATE A rec0061.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #62: CREATE A rec0062.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #63: CREATE A rec0063.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #64: CREATE A rec0064.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #65: CREATE A rec0065.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #66: CREATE A rec0066.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #67: CREATE A rec0067.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #68: CREATE A rec0068.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #69: CREATE A rec0069.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #70: CREATE A rec0070.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #71: CREATE A rec0071.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #72: CREATE A rec0072.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #73: CREATE A rec0073.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #74: CREATE A rec0074.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #75: CREATE A rec0075.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #76: CREATE A rec0076.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #77: CREATE A rec0077.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #78: CREATE A rec0078.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #79: CREATE A rec0079.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #80: CREATE A rec0080.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #81: CREATE A rec0081.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #82: CREATE A rec0082.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #83: CREATE A rec0083.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #84: CREATE A rec0084.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #85: CREATE A rec0085.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #86: CREATE A rec0086.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #87: CREATE A rec0087.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #88: CREATE A rec0088.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #89: CREATE A rec0089.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #90: CREATE A rec0090.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #91: CREATE A rec0091.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #92: CREATE A rec0092.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #93: CREATE A rec0093.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #94: CREATE A rec0094.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #95: CREATE A rec0095.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #96: CREATE A rec0096.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #97: CREATE A rec0097.oXXX.de 1.2.3.4 ttl=0
    integration_test.go:241: UNEXPECTED #98: CREATE A rec0098.oXXX.de 1.2.3.4 ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#18
=== RUN   TestDNSProviders/oXXX.de/21:pager601_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/oXXX.de/22:pager1201_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/oXXX.de/23:CAA:CAA_record
    integration_test.go:220: CREATE CAA oXXX.de 0 issue "letsencrypt.org" ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE CAA oXXX.de 0 issue "letsencrypt.org" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#19
=== RUN   TestDNSProviders/oXXX.de/24:CAA_with_;:CAA_many_records
    integration_test.go:220: CREATE CAA oXXX.de 0 issuewild ";" ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE CAA oXXX.de 0 issuewild ";" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#20
=== RUN   TestDNSProviders/oXXX.de/25:Issue_1374:CAA_spaces
    integration_test.go:220: CREATE CAA oXXX.de 0 issue "letsencrypt.org; validationmethods=dns-01; accounturi=https://acme-v02.api.letsencrypt.org/acme/acct/1234" ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE CAA oXXX.de 0 issue "letsencrypt.org; validationmethods=dns-01; accounturi=https://acme-v02.api.letsencrypt.org/acme/acct/1234" ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#21
=== RUN   TestDNSProviders/oXXX.de/26:NAPTR_***SKIPPED(CanUseNAPTR_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/27:PTR_***SKIPPED(CanUsePTR_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/28:SOA_***SKIPPED(CanUseSOA_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/29:SRV:SRV_record
    integration_test.go:220: CREATE SRV _sip._tcp.oXXX.de 5 6 7 foo.com. ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 1.
    integration_test.go:241: UNEXPECTED #0: CREATE SRV _sip._tcp.oXXX.de 5 6 7 foo.com. ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#22
=== RUN   TestDNSProviders/oXXX.de/30:SRV_w/_null_target:Null_Target
    integration_test.go:220: CREATE SRV _sip._tcp.oXXX.de 52 62 72 foo.com. ttl=0
    integration_test.go:220: CREATE SRV _sip._tcp.oXXX.de 15 65 75 . ttl=0
    integration_test.go:239: Expected 0 corrections on second run, but found 2.
    integration_test.go:241: UNEXPECTED #0: CREATE SRV _sip._tcp.oXXX.de 52 62 72 foo.com. ttl=0
    integration_test.go:241: UNEXPECTED #1: CREATE SRV _sip._tcp.oXXX.de 15 65 75 . ttl=0
=== RUN   TestDNSProviders/oXXX.de/Post_cleanup:Empty#23
=== RUN   TestDNSProviders/oXXX.de/31:SSHFP_***SKIPPED(CanUseSSHFP_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/32:TLSA_***SKIPPED(CanUseTLSA_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/33:DS_***SKIPPED(CanUseDS_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/34:DS_(children_only)_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/35:DS_(children_only)_CLOUDNS_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/36:ALIAS_***SKIPPED(CanUseAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/37:AZURE_ALIAS_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/38:R53_ALIAS2_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/39:R53_ALIAS_ORDER_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/oXXX.de/40:CF_REDIRECT_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/oXXX.de/41:CF_PROXY_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/oXXX.de/42:CF_WORKER_ROUTE_***SKIPPED(disabled_by_only)***:Empty
--- FAIL: TestDNSProviders (25.84s)
    --- FAIL: TestDNSProviders/oXXX.de (24.98s)
        --- PASS: TestDNSProviders/oXXX.de/Clean_Slate:Empty (0.25s)
        --- PASS: TestDNSProviders/oXXX.de/00:GeneralACD:Create_an_A_record (0.33s)
        --- PASS: TestDNSProviders/oXXX.de/00:GeneralACD:Change_it (0.32s)
        --- PASS: TestDNSProviders/oXXX.de/00:GeneralACD:Add_another (0.34s)
        --- PASS: TestDNSProviders/oXXX.de/00:GeneralACD:Add_another(same_name) (0.38s)
        --- FAIL: TestDNSProviders/oXXX.de/00:GeneralACD:Change_a_ttl (0.11s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty (0.59s)
        --- PASS: TestDNSProviders/oXXX.de/01:WildcardACD:Create_wildcard (0.46s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#01 (0.37s)
        --- PASS: TestDNSProviders/oXXX.de/02:CNAME:Create_a_CNAME (0.31s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#02 (0.23s)
        --- PASS: TestDNSProviders/oXXX.de/03:MX:MX_record (0.31s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#03 (0.21s)
        --- PASS: TestDNSProviders/oXXX.de/04:Null_MX_***SKIPPED(excluded_by_not("NETCUP"))***:Empty (0.10s)
        --- PASS: TestDNSProviders/oXXX.de/05:NS_***SKIPPED(excluded_by_not("NETCUP"))***:Empty (0.08s)
        --- FAIL: TestDNSProviders/oXXX.de/06:IGNORE_NAME_function:Create_some_records (0.36s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#04 (0.24s)
        --- FAIL: TestDNSProviders/oXXX.de/07:IGNORE_NAME_apex:Create_some_records (0.57s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#05 (0.35s)
        --- PASS: TestDNSProviders/oXXX.de/08:IGNORE_TARGET_function:Create_some_records (0.45s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#06 (0.38s)
        --- FAIL: TestDNSProviders/oXXX.de/09:simple_TXT:Create_a_TXT (0.25s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#07 (0.08s)
        --- FAIL: TestDNSProviders/oXXX.de/10:simple_TXT-spf1:Create_a_TXT/SPF (0.28s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#08 (0.12s)
        --- FAIL: TestDNSProviders/oXXX.de/11:long_TXT:Create_long_TXT (0.25s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#09 (0.11s)
        --- SKIP: TestDNSProviders/oXXX.de/12:complex_TXT:TXT_with_0-octel_string (0.00s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#10 (0.10s)
        --- FAIL: TestDNSProviders/oXXX.de/13:long_TXT:Create_a_505_TXT (0.25s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#11 (0.08s)
        --- FAIL: TestDNSProviders/oXXX.de/14:TXTMulti:Create_TXTMulti_1 (0.26s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#12 (0.09s)
        --- FAIL: TestDNSProviders/oXXX.de/15:TXTMulti-same:Create_TXTMulti_1 (0.24s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#13 (0.10s)
        --- PASS: TestDNSProviders/oXXX.de/16:TypeChange:Create_a_CNAME (0.34s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#14 (0.23s)
        --- PASS: TestDNSProviders/oXXX.de/17:Case_Sensitivity:Create_CAPS (0.33s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#15 (0.22s)
        --- PASS: TestDNSProviders/oXXX.de/18:IDNA:Internationalized_name (0.34s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#16 (0.21s)
        --- PASS: TestDNSProviders/oXXX.de/19:IDNAs_in_CNAME_targets:IDN_CNAME_AND_Target (0.29s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#17 (0.24s)
        --- FAIL: TestDNSProviders/oXXX.de/20:pager101:99_records (11.55s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#18 (0.05s)
        --- PASS: TestDNSProviders/oXXX.de/21:pager601_***SKIPPED(disabled_by_only)***:Empty (0.05s)
        --- PASS: TestDNSProviders/oXXX.de/22:pager1201_***SKIPPED(disabled_by_only)***:Empty (0.05s)
        --- FAIL: TestDNSProviders/oXXX.de/23:CAA:CAA_record (0.20s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#19 (0.05s)
        --- FAIL: TestDNSProviders/oXXX.de/24:CAA_with_;:CAA_many_records (0.19s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#20 (0.06s)
        --- FAIL: TestDNSProviders/oXXX.de/25:Issue_1374:CAA_spaces (0.17s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#21 (0.07s)
        --- PASS: TestDNSProviders/oXXX.de/26:NAPTR_***SKIPPED(CanUseNAPTR_not_supported)***:Empty (0.05s)
        --- PASS: TestDNSProviders/oXXX.de/27:PTR_***SKIPPED(CanUsePTR_not_supported)***:Empty (0.06s)
        --- PASS: TestDNSProviders/oXXX.de/28:SOA_***SKIPPED(CanUseSOA_not_supported)***:Empty (0.06s)
        --- FAIL: TestDNSProviders/oXXX.de/29:SRV:SRV_record (0.17s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#22 (0.06s)
        --- FAIL: TestDNSProviders/oXXX.de/30:SRV_w/_null_target:Null_Target (0.25s)
        --- PASS: TestDNSProviders/oXXX.de/Post_cleanup:Empty#23 (0.08s)
        --- PASS: TestDNSProviders/oXXX.de/31:SSHFP_***SKIPPED(CanUseSSHFP_not_supported)***:Empty (0.06s)
        --- PASS: TestDNSProviders/oXXX.de/32:TLSA_***SKIPPED(CanUseTLSA_not_supported)***:Empty (0.06s)
        --- PASS: TestDNSProviders/oXXX.de/33:DS_***SKIPPED(CanUseDS_not_supported)***:Empty (0.05s)
        --- PASS: TestDNSProviders/oXXX.de/34:DS_(children_only)_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty (0.05s)
        --- PASS: TestDNSProviders/oXXX.de/35:DS_(children_only)_CLOUDNS_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty (0.06s)
        --- PASS: TestDNSProviders/oXXX.de/36:ALIAS_***SKIPPED(CanUseAlias_not_supported)***:Empty (0.06s)
        --- PASS: TestDNSProviders/oXXX.de/37:AZURE_ALIAS_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty (0.05s)
        --- PASS: TestDNSProviders/oXXX.de/38:R53_ALIAS2_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.05s)
        --- PASS: TestDNSProviders/oXXX.de/39:R53_ALIAS_ORDER_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.06s)
        --- PASS: TestDNSProviders/oXXX.de/40:CF_REDIRECT_***SKIPPED(disabled_by_only)***:Empty (0.05s)
        --- PASS: TestDNSProviders/oXXX.de/41:CF_PROXY_***SKIPPED(disabled_by_only)***:Empty (0.05s)
        --- PASS: TestDNSProviders/oXXX.de/42:CF_WORKER_ROUTE_***SKIPPED(disabled_by_only)***:Empty (0.06s)
=== RUN   TestDualProviders
    integration_test.go:312: Skipping.  DocDualHost == Cannot
--- SKIP: TestDualProviders (0.06s)
FAIL
exit status 1
FAIL	github.com/StackExchange/dnscontrol/v3/integrationTest	25.942s

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-05-08 14:50:40 -04:00
Tom Limoncelli
9e6d642e35
NEW FEATURE: Moving provider TYPE from dnsconfig.js to creds.json (#1500)
Fixes https://github.com/StackExchange/dnscontrol/issues/1457

* New-style creds.json implememented backwards compatible

* Update tests

* Update docs

* Assume new-style TYPE
2022-05-08 14:23:45 -04:00
adrian-hoasted
013a059dc7
CLOUDFLARE: Add support for PTR records (#1496) 2022-05-03 06:07:49 -04:00
Tom Limoncelli
19550aeed9
Refactor: Rename providers/config to pkg/credsfile (#1494) 2022-05-02 20:12:30 -04:00
Tom Limoncelli
e2536ad406
In preparation of #1457, warn if cred-names contain colon (#1480) 2022-04-04 15:33:59 -04:00
Pascal Mathis
144adfd632
CLOUDNS: Fix creation of intra-zone NS records (see #1263) (#1469) 2022-03-31 14:38:42 -04:00
Phil Pennock
4a185909a8
DNSIMPLE: bug-fix, allow non-apex NS records (#1468) 2022-03-28 15:28:40 -04:00
Tom Limoncelli
73de17adc2 Revert "_PROVIDER flag phase 1: generate warnings"
This reverts commit 26c632e05f.
2022-03-27 15:56:57 -04:00
Tom Limoncelli
26c632e05f _PROVIDER flag phase 1: generate warnings 2022-03-27 15:54:16 -04:00
arnoschoon
caedb9a7a6
NEW PROVIDER: AutoDNS (#1336)
* Implement AutoDNS provider to manage existing zones

* Moved AuditRecords() in to separate file to ease automatic updating

* S1011 - Use a single append to concatenate two slices

* Set list of available record types as returned by the system

* Fixed style, clarify code and add some extra comments

* Documented simple configuration and usage example of AutoDNS

* Convert MX and SRV record properly from string to actual structs and back

* Add support for integration tests of AutoDNS

* Return error message from update request instead of invoking panic()

* Skip AUTODNS in test for RFC 7505 (null MX)

* Update providers/autodns/autoDnsProvider.go

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-03-25 15:22:59 -04:00
Koen Vlaswinkel
02d76affc0
LINODE: Add support for CAA records and implement get-zones (#1454)
* LINODE: Add support for CAA records

* LINODE: Implement get-zones

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-03-25 15:22:20 -04:00
Tom Limoncelli
ffe21c6e6d
creds.json should not be executable under Windows (#1456)
* Skip CAA flag test for LINODE

* Require go 1.18

* Update CCI to use go 1.18

* go mod tidy

* working

* Update creds.json docs

* go generate
2022-03-25 15:20:30 -04:00
Tom Limoncelli
cc428ca9e1
HEXONET: Fix error format string (#1462)
Fixes https://github.com/StackExchange/dnscontrol/issues/1461
2022-03-24 15:43:37 -04:00
Costas Drogos
2b40f6fa70
ns1: enable autoDNSSEC capability (#1450)
* ns1: enable autoDNSSEC capability

NS1's API has support for enabling or disabling DNSSEC on zones under
DNSSEC-enabled accounts.

This commit enables support for detecting a zone's DNSSEC state and,
given the autoDNSSEC setting, pushing the right domain corrections
to our corrections stack.

Fixes #1444

* ns1: better comments

* ns1: Handle a forgotten error

* ns1: style: spacing between functions

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-03-11 10:12:45 -05:00
Tom Limoncelli
4d125fca5f
Guard against nil (#1452) 2022-03-09 15:20:45 -05:00
Tom Limoncelli
9db12e4730
GANDI: Bump go-gandi/go-gandi v0.0.0-20211124085723 => v0.1.0 (#1439)
* GANDI: Bump go-gandi/go-gandi v0.0.0-20211124085723-a737785a1af0 => v0.1.0

* Use new NewDomainClient signature

* go mod tidy
2022-03-07 13:00:39 -05:00
Costas Drogos
e300a8e9ca
NS1: Enable DS & DSForChildren support (#1446)
Enable support for DS and DSForChildren sets of records in NS1.

Fixes #1445
2022-03-07 11:31:55 -05:00
Costas Drogos
b8a70d7556
ns1: ignore DNSKEY & RRSIG entries (#1443)
These entries are autoconfigured by NS1 when a zone is enabled for DNSSEC and can't be
modified via the API, producing a 405 API error on modification attempts.

While unmodifiable, these records are returned by the API, so we have to ignore them.

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-03-07 10:43:48 -05:00
Tom Limoncelli
619487738f
CLOUDFLARE: Bug: crash when SRV is missing target (#1437)
* CLOUDFLARE: Bug: crash when SRV is missing target

* fixup!
2022-03-03 16:53:54 -05:00
Tom Limoncelli
444b893e1b
MAINT: Sort various lists (#1433)
* maint: sort lists in build/generate/featureMatrix.go

* maint: sort lists in docs/byo-secrets.md

* maint: sort lists in models/record.go

* maint: sort lists in pkg/normalize/validate.go

* maint: sort lists in providers/activedir/activedirProvider.go

* maint: sort lists in providers/akamaiedgedns/akamaiEdgeDnsProvider.go

* maint: sort lists in providers/axfrddns/axfrddnsProvider.go

* maint: sort lists in providers/azuredns/azureDnsProvider.go

* maint: sort lists in providers/cloudflare/cloudflareProvider.go

* maint: sort lists in providers/cloudns/cloudnsProvider.go

* maint: sort lists in providers/desec/desecProvider.go

* maint: sort lists in providers/digitalocean/digitaloceanProvider.go

* maint: sort lists in providers/dnsimple/dnsimpleProvider.go

* maint: sort lists in providers/dnsmadeeasy/dnsMadeEasyProvider.go

* maint: sort lists in providers/exoscale/exoscaleProvider.go

* maint: sort lists in providers/gandiv5/gandi_v5Provider.go

* maint: sort lists in providers/hedns/hednsProvider.go

* maint: sort lists in providers/hetzner/hetznerProvider.go

* maint: sort lists in providers/hexonet/hexonetProvider.go

* maint: sort lists in providers/inwx/inwxProvider.go

* maint: sort lists in providers/linode/linodeProvider.go

* maint: sort lists in providers/namecheap/namecheapProvider.go

* maint: sort lists in providers/namedotcom/namedotcomProvider.go

* maint: sort lists in providers/netcup/netcupProvider.go

* maint: sort lists in providers/ns1/ns1Provider.go

* maint: sort lists in providers/octodns/octodnsProvider.go

* maint: sort lists in providers/oracle/oracleProvider.go

* maint: sort lists in providers/ovh/ovhProvider.go

* maint: sort lists in providers/packetframe/packetframeProvider.go

* maint: sort lists in providers/powerdns/powerdnsProvider.go

* maint: sort lists in providers/route53/route53Provider.go

* maint: sort lists in providers/vultr/vultrProvider.go

* Update go:build pragmas for windows

* More sorting

* go generate
2022-03-02 11:19:15 -05:00
tpdn
fc75f89271
ClouDNS: Add CLOUDNS_WR (Web Redirects) (#1421)
Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-03-02 09:21:51 -05:00
Tom Limoncelli
363558f369
EASYNAME: Source filename should conform to standard (#1422) 2022-03-01 09:53:20 -05:00
Tom Limoncelli
1f237b2c92
ROUTE53: Fix shortname bug for get-zones (#1418) 2022-02-28 11:35:17 -05:00
Tom Limoncelli
8b74b7c470
AZURE_DNS: GetZones error should report subscription id (#1415)
* BIND: Bug: DefaultNS strips last char

* fixup!

* Report Subscription ID when Azure can't get zones
2022-02-22 13:34:57 -05:00
Julius Rickert
d5665ceaf6
Documentation: Customizing nameservers for hosting.de provider (#1396)
* Add support for default nameservers

Uses provider metadata with default_ns key.

Fixes #1401.

* Fix formatting

* Add documentation on custom nameservers

* Rework hosting.de documentation

Separate usage with hosting.de and usage with compatible providers.

Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2022-02-22 10:54:02 -05:00
Benjamin Rechsteiner
45e8622c0a
POWERDNS: Add support for DS records (#1414) 2022-02-17 17:16:15 -05:00