Greetings DNS fans!
v5.0.0 is released! This was a big community effort!
Thanks to all the people that helped test and fix bugs including @labrown @fm @cafferata @chicks @androw @AsifNawaz-cnic @blackshadev @bytemain @chicks-net @cylonchau @das7pad @dnscale-ops @DustyRah @eliheady @haylinmoore @huihuimoe @huskyistaken @imlonghao @jbelien @jochristian @kallsyms @KlettIT @kordianbruck @labrown @masterzen @meghanakudua02 @morozov-alexey @mtmn @patschi @pgaskin @ppmathis @rblenkinsopp @riku22 @riyadhalnur @SimenBai @SukkaW @ttkzw @vojtad @willpower232 @xddxdd @yzqzss @zupolgec (it's impossible to make such a list without forgetting someone. Apologies in advance to anyone I missed!) A special thanks to my new employer, CoreWeave, for their support!
v5.0.0 is all about EXTENSIBILITY!
- When IETF standarizes a new record type: DNS Support is automatic!
- When they appear in codeberg.org/miekg/dns, DNS control supports them (almost) automatically!
- Individual provider support requires very little work, often none!
- Non-standard record types like R53_ALIAS act just like standard types!
- We no longer need to special-case them all over the code. They even appear in zonefiles!
- “Builders” are easier to create, less brittle!
- Builder can now be written in Go, which has much better testing facilities.
- Legacy providers (SPF_BUILDER, DKIM_BUILDER, DMARC_BUILDER) are still brittle, but will soon be upgraded.
- And…
- Better internationalized domain name (IDN) support. Fields are now consistently processed at input, not later in the pipeline. This simplifies code and reduces potential errors. As a result, all providers now have 100% IDN support “for free”.
- DNSControl should use significantly less memory for large DNS zones.
- Writing new providers is significantly easier.
- Processing large zones is faster, with new potential optimizations coming!
- Zero compatibility issues. Your old
dnsconfig.jsshould “just work”.
How did this happen? We upgraded from github.com/miekg/dns to codeberg.org/miekg/dns (a.k.a. “DNS version 2”) and took advantage of the new features. Specifically, models.RecordConfig no longer contains fields for each record type, most of which go unused. Instead it stores a DNS version 2 RDATA interface that contains the fields needed for that specific record type. This also allowed us to create new factories (NewRecordConfig() and NewRecordConfigParse()) which replace many lines of code in providers. As a result, every file that touches models.RecordConfig had to change. Thanks to @miekg for collaborating on the RDATA features which make much of this possible.
What does this mean to you?
IGNORE()is now reliable for all providers!SOArecords are no longer special. They work like all other records.DSordering works: A DS record is created after its target NS exists, and deleted only after its target NS is removeddnscontrol foonow errors “command not found” instead of carping that no help for “foo” exists.- Documentation bugfix: Parameters for various types and builders now in sync with code.
- VULTR now supports concurrency and AUTODNSSEC
- Custom record types for
ADGUARDHOME,AKAMAIDNS,AZURE_DNS,ROUTE52,BUNNYDNS,CLOUDFLAREAPI,CLOUDNS,LUADNS,MIKROTIK,NETLIFY, andPORKBUNhave been converted to the new custom record type system. They are no longer special and even appear in zonefile backups.
Some potential regressions: (These record types may not have worked previously.)
- deSEC no longer supports DS records
- Exoscale no longer supports PTR records
- Tencent no longer supports ALIAS or PTR records
Dev notes:
Developers might be interested in the code changes, which are described here in modernizingproviders.md
- Code for standard record types (
models/record_astype.go) and custom types (pkg/privatetypes/) are generated. - Record type is stored as an integer, because string comparisons are slow. (.Type is still available for now but please use .TypeNum)
- Go 1.27 is now the minimum Go compiler version. The struct literal change is particularly helpful.
- “Golden files” record API input/outputs for off-line testing, eliminating the need for API access in many cases.
- All providers have been upgraded to “diff2”. The diff1 compatibility code has been removed.
There is a new “cookbook” which explains common code patterns: Cookbook. - It is now significantly easier to write providers. The translation from native to models.RecordConfig is much easier thanks to new factory functions.
- I'm now maintaining a list of REFACTORING PROJECTS in case anyone wants to grab one. It's a good way to learn the code base or get more experience with the Go language.
- You may be interested that during the development of this release, both the old and new
RecordConfigwere supported with a very slick bidirectional conversion process. As the legacy fields were eliminated, the conversionn process got closer and closer to being a no-op until suddenly the and n
Stats:
- 467 files changed!
- 283 new files added!
- 34 files deleted! (my favorite statistic!)
Testing notes
The following providers received extensive testing:
AKAMAIEDGEDNS ALIDNS AXFRDDNS AZUREDNS AZUREPRIVATEDNS BIND CLOUDFLARE CLOUDNS
CNR DESEC DIGITALOCEAN DNSCALE DNSIMPLE DOMAINNAMESHOP DYNU GANDIV5 GCLOUD
GIDINET HEDNS HUAWEICLOUD INFOMANIAK INWX LINODE LUADNS MYTHICBEASTS NAMECHEAP
NAMEDOTCOM NETBIRD NETLIFY NETNOD NEXDNS NS1 OPENWRT ORACLE OVH PORKBUN POWERDNS
ROUTE53 SAKURACLOUD TRANSIP UNIFI VERCEL VULTR WEBSUPPORT
The following providers lacked testing. Please use with caution:
ADGUARDHOME AUTODNS BUNNYDNS CSCGLOBAL DNSMADEEASY EXOSCALE FORTIGATE GCORE
GIGAHOST HETZNERV2 HOSTINGDE JOKER LOOPIA MIKROTIK NETCUP PACKETFRAME
REALTIMEREGISTER RWTH SCALEWAY SOFTLAYER TENCENTDNS
Users of the IMPORT_TRANSFORM() and IMPORT_TRANSFORM_STRIP() functions should test carefully before using in production.
Changes
The list is too long to include all commits, but here are the highlights:
- Add factory for models.DomainConfig:
models.NewDomainConfig(zone). - Add factories for models.RecordConfig, replace old code where we can.
- Down-casing, canonicalization, IDN conversion, stutter checking, and normalizing fields is now done when making the RecordConfig, not at the validation/normalization step later in the pipeline. As a result, errors are reported sooner and more accurately.
pkg/normalize/validate.gostill exists and is used, but is slowly being deprecated. - Remove the
rtypecontrolmodule. In the few places it was used, replace with the new RDATA functionality. - DNS types
RPandDSwere reimplemented using the new RDATA system. - Replace RecordConfig.Comparable with RecordConfig.ComparableV3 (name change to find stragglers).
- Custom types are now described in YAML with code generated automatically (pkg/privatetypes/types_generate.yaml)
- TLSA comparison is now done on ToUpper, not ToLower, strings.
- Added a "cookbook" of how to use new factories: Cookbook.
- Integration tests: Test cfworkers and cfredirect by default.
- Integration tests: Improve SVCB/HTTPS tests, especially for ech=IGNORE
- LOC() is now a "builder" that outputs LOC records.
- LOC floating point rounding error fixed
- Builders are registered using
models.RegisterBuilder() - No longer store the "Raw" domain names (the name as the user input them). They were never used.
- D_EXTEND() refactored. Implementation is simplier and faster.
- RecordConfig now stores .TypeNum which is the numeric value for the type. Eventually we'll remove .Type.
- Change github.com/miekg/dns to codeberg.org/miekg/dns (and related packages) where possible, including new helper functions in
pkg/dnsrr/dnsrr.goto help migrate away from dnsv1 pkg/js/helpers.js: Improved rawRecordBuilder() to be feature-compatible with recordBuilder()pkg/js/helpers.js: Convert to "the new way" for all record types.pkg/js/parse_testsupdate fixtures due to new JSON fields. .json files no longer have Unicode chars.- Zonefiles now include "real" data for custom types instead of comments.
- New package:
mustbefor converting raw data to the types we need. - BIND: Zonefile generator produces better files.
- BIND: Refactor SOA serial number handling.
- CLOUDFLAREAPI: Update SINGLE_REDIRECT, CF_REDIRECT, CF_TMP_REDIRECT, CF_WORKER_ROUTE to comply with the new way to do custom record types.
- New functions ZoneifyQuoted, Zoneify, etc. are standard ways to create zonefile-compatible strings.
Sincerely,
--Tom Limoncelli
Monthly video call!
Everyone is invited to the Monthly DNSControl Community Video Conference Call on the 2nd Tuesday of each month. Join whether you are a new user with questions or an experienced developer that wants to discuss DNSControl internals... or anything in between! Meeting details on
GitHub Discussions.
Changelog
Major features:
- 6fcc3de: FEATURE: updated DMARC_BUILDER for RFC 9989 (#4794) (@ElliottCepin)
Provider-specific changes:
- 1826646: ADGUARDHOME: Modernize record conversion (#4536) (@TomOnTime)
- 7950089: AKAMAIEDGEDNS: Add Akamai Edge DNS golden tests (#4717) (@TomOnTime)
- 337f115: AKAMAIEDGEDNS: Fix bugs mentioned in Issue (#4466) while running integration tests (#4421) (#4487) (@meghanakudua02)
- a9ff22f: AKAMAIEDGEDNS: Modernize record conversion (#4537) (@TomOnTime)
- 3da2033: AKAMAIEDGEDNS: Move AnswerType out of RecordConfig (#4709) (@TomOnTime)
- dbbba21: ALIDNS: Modernize field access (#4657) (@TomOnTime)
- 218b565: ALIDNS: Modernize record conversion (#4538) (@TomOnTime)
- 5401afe: ALIDNS: audit punycoded CNAME targets (#4424) (@bytemain)
- 9899adb: ALIDNS: decode punycode labels before IDNA validation (#4787) (@bytemain)
- f1efd81: AUTODNS: Modernize field access (#4660) (@TomOnTime)
- 8950faa: AUTODNS: Modernize record conversion (#4539) (@TomOnTime)
- 93f655c: AXFRDDNS: Adopt dnsv2 (partial) (#4529) (@TomOnTime)
- 7b13af9: AXFRDDNS: Modernize field access (#4661) (@TomOnTime)
- 108cf31: AXFRDDNS: convert to codeberg.org/miekg/dns (dnsv2) (#4658) (@shuvamk)
- cb37dcb: BIND: Refactor to use modern constructs (#4423) (@TomOnTime)
- 7128ea7: BUNNYDNS: Modernize code (#4647) (@TomOnTime)
- 4ccaa21: BUNNYDNS: Modernize field access (#4662) (@TomOnTime)
- 4e4da9c: BUNNYDNS: Modernize record conversion (#4540) (@TomOnTime)
- 94b973e: CLOUDFLAREAPI: Modernize field access (#4625) (@TomOnTime)
- f530e0e: CLOUDFLAREAPI: Reduce use of legacy functions (#4480) (@TomOnTime)
- d9bbd73: CLOUDNS: Modernize field access (#4663) (@TomOnTime)
- ab531a1: CLOUDNS: Modernize record conversion (#4541) (@TomOnTime)
- c27f98b: CNR: Modernize field access (#4620) (@TomOnTime)
- 38a2273: CNR: Use diff2.ByRecord instead of diff.NewCompat (#4604) (@TomOnTime)
- f92f03a: CSCGLOBAL: Modernize record conversion (#4542) (@TomOnTime)
- 4e7b3cc: CSCGLOBAL: Use diff2.ByRecord instead of diff.NewCompat (#4605) (@TomOnTime)
- 0084086: DESEC, POWERDNS: Add audit rules for DNSKEY records (#4705) (@androw)
- 97cddcd: DESEC: Fix TXT records quote, disable TTL tests (#4677) (@androw)
- d5b2424: DESEC: Update DNSSEC capabilities (#4692) (@androw)
- 698b06f: DNSCALE: Modernize field access (#4664) (@TomOnTime)
- 8f694d8: DNSCALE: fix regression in PR#4664 (#4763) (@dnscale-ops)
- 7d3fc44: DNSIMPLE: Modernize field access (#4648) (@TomOnTime)
- 0af29d7: DNSIMPLE: Modernize field access (#4656) (@TomOnTime)
- da6f97c: DNSMADEEASY: Cover label conversion in types_test.go (#4696) (@vojtad)
- 0b97c68: DNSMADEEASY: Unify how labels are made (#4679) (@TomOnTime)
- b017a1d: DNSMADEEASY: fix TXT ≥256-byte round-trip and ALIAS/ANAME diff loop; document sandbox testing (#4469) (@vojtad)
- 5a0362a: DOMAINNAMESHOP: Improve label creation (@TomOnTime)
- d75427a: DOMAINNAMESHOP: Reject NS records at apex (#4702) (@SimenBai)
- 851a7bc: DYNU: Fix NAPTR replacement field, and RP trailing dot (#4785) (@DustyRah)
- 11f67ba: DYNU: Modernize field access (#4665) (@TomOnTime)
- 3b254c4: EXOSCALE: Document that PTR records not supported (#4779) (@TomOnTime)
- fd4dffb: FORTIGATE: Debug failing IGNORE tests (#4621) (@TomOnTime)
- ca08787: FORTIGATE: Modernize field access (#4666) (@TomOnTime)
- 5d41d71: FORTIGATE: Skip TXT test (#4766) (@TomOnTime)
- 6f0dc26: GIDINET: v5 test fixes and modernize record conversion (#4451) (@zupolgec)
- c39ac7f: INFOMANIAK: Disable tests for features that do not exist (#4613) (@TomOnTime)
- abf7228: INFOMANIAK: Fix TXT records (#4800) (@TomOnTime)
- dbda6b2: JOKER: Modernize field access (#4673) (@TomOnTime)
- c73196c: NAMEDOTCOM: Fix ALIAS regression (#4746) (@TomOnTime)
- f56aafd: NAMEDOTCOM: Upgrade to diff2 (#4565) (@TomOnTime)
- cf54521: NETBIRD: Add apiurl creds argument (#4486) (@3l0w)
- 5b761f3: NETCUP: Modernize field access (#4667) (@TomOnTime)
- f486bdc: NETCUP: fixup provider to make it pass the latest integration test suite (#4706) (@kordianbruck)
- b9823fb: NETLIFY: toRC should not mutate native record (#4671) (@TomOnTime)
- 97f6a9c: NETNOD: Fix typo (#4530) (@TomOnTime)
- e755fc9: NETNOD: Modernize field access (#4668) (@TomOnTime)
- 3661095: NEXDNS: Modernize for v5 (@TomOnTime)
- 69d4d88: OVH: Add the ability to disable ListZones() for testing / Fix TXT record handling (#4791) (@TomOnTime)
- 349405a: OVH: Modernize field access (#4669) (@TomOnTime)
- ed58476: PACKETFRAME: No longer has maintainer (#4788) (@TomOnTime)
- b3d616f: PORKBUN: Modernize field access for SVCB records (#4649) (@TomOnTime)
- 07058de: POWERDNS: Fix SVCB bug (#4778) (@TomOnTime)
- 5cbd56e: POWERDNS: Update access to SVCB fields (#4639) (@TomOnTime)
- c571cc8: ROUTE53: Fix R53_ALIAS and R53_EVALUATE_TARGET_HEALTH bugs (#4797) (@TomOnTime)
- 2d57bb7: ROUTE53: Modernize (#4481) (@TomOnTime)
- a9374d8: SAKURACLOUD: Modernize field access (#4670) (@TomOnTime)
- 430d2c6: SOFTLAYER: Use diff2.ByRecord instead of diff.NewCompat (#4606) (@TomOnTime)
- e55b628: TENCENTDNS: integration tests fix (#4775) (@cylonchau)
- 233e37f: TRANSIP: Fix TXT bug (#4592) (@TomOnTime)
- 5d6e508: TRANSIP: Fix TXT records (#4597) (@TomOnTime)
- c683ca3: UNIFI: new API compatibility fixes + tests (#4452) (@zupolgec)
- b56dfd3: VERCEL: Modernize fields (#4619) (@TomOnTime)
- 92c9530: VERCEL: Skip NullMX tests (#4773) (@SukkaW)
- 6259760: VULTR: convert fields (#4618) (@TomOnTime)
- 25e4f81: WEBSUPPORT: fix MX/SRV empty priority and v5 preparation (#4732) (@mtmn)
- 4873383: desec: Modernize record conversion (#4543) (@TomOnTime)
- a3d31ee: dnscale: Modernize record conversion (#4544) (@TomOnTime)
- 5c24a8d: dnsimple: Modernize record conversion (#4545) (@TomOnTime)
- c6af85d: dnsmadeeasy: Modernize record conversion (#4546) (@TomOnTime)
- 0f1f821: domainnameshop: Modernize record conversion (#4547) (@TomOnTime)
- 8453715: dynu: Modernize record conversion (#4548) (@TomOnTime)
- ab2e50b: exoscale: Modernize record conversion (#4549) (@TomOnTime)
- 41b6cc6: fortigate: Modernize record conversion (#4550) (@TomOnTime)
- fb07524: gcore: Modernize record conversion (#4551) (@TomOnTime)
- d076712: gidinet: Modernize record conversion (#4552) (@TomOnTime)
- 70425d2: gigahost: Modernize record conversion (#4553) (@TomOnTime)
- cecd5ea: hostingde: Modernize record conversion (#4555) (@TomOnTime)
- 33d8f21: huaweicloud: Modernize record conversion (#4556) (@TomOnTime)
- 4c07681: infomaniak: Modernize record conversion (#4557) (@TomOnTime)
- 32ecb35: inwx: Modernize record conversion (#4558) (@TomOnTime)
- 620a04f: joker: Modernize record conversion (#4559) (@TomOnTime)
- fa27836: linode: Modernize record conversion (#4560) (@TomOnTime)
- 5af75bd: loopia: Modernize record conversion (#4561) (@TomOnTime)
- a862f2b: luadns: Modernize record conversion (#4562) (@TomOnTime)
- 3ed414a: mikrotik: Modernize record conversion (#4563) (@TomOnTime)
- fe93b0b: namecheap: Modernize record conversion (#4566) (@TomOnTime)
- ff88d92: netbird: Modernize record conversion (#4567) (@TomOnTime)
- 990e72f: netcup: Modernize record conversion (#4568) (@TomOnTime)
- 259b4b7: netlify: Modernize record conversion (#4569) (@TomOnTime)
- 40ad888: ns1: Modernize record conversion (#4570) (@TomOnTime)
- a5894e8: openwrt: Modernize record conversion (#4571) (@TomOnTime)
- 348304e: oracle: Modernize record conversion (#4572) (@TomOnTime)
- 62031d9: packetframe: Modernize record conversion (#4573) (@TomOnTime)
- 7a40210: porkbun: Modernize record conversion (#4574) (@TomOnTime)
- a974a34: powerdns: exclude from DS and DNSKEY record tests (#4614) (@jpbede)
- 9a2e03b: realtimeregister: Modernize record conversion (#4575) (@TomOnTime)
- 1f7ad07: rwth: Modernize record conversion (#4577) (@TomOnTime)
- c813ead: sakuracloud: Modernize record conversion (#4578) (@TomOnTime)
- eb5b16f: scaleway: Modernize record conversion (#4579) (@TomOnTime)
- cde24d1: softlayer: Modernize record conversion (#4580) (BLIND MERGE) (@TomOnTime)
- ba1463d: tencentdns: Modernize record conversion (#4581) (@TomOnTime)
- 4a76fbf: unifi: Modernize record conversion (#4582) (@TomOnTime)
- 823586c: vultr: Modernize record conversion (#4583) (@TomOnTime)
- d66b241: websupport: Modernize record conversion (#4584) (@TomOnTime)
Documentation:
- 7f6139a: DOCS: Document RecordConfig V3 best practices (#4464) (@TomOnTime)
- 91a0428: DOCS: Fix many comments (#4783) (@TomOnTime)
- 62a6b52: DOCS: Update link to the official GHA (#4764) (@TomOnTime)
- f9aa09a: DOCS: Verify parameters match across code, docs, and dnscontrol.d.ts (#4805) (@TomOnTime)
- 2765ef1: docs(README): Add GHA, update RFC4183 change, etc. (#4774) (@TomOnTime)
CI/CD:
- f56dd36: BUILD: Upgrade to Go 1.27 (#4803) (@TomOnTime)
- b0583a4: CI: Add "golden" data files for most providers (@TomOnTime)
- 95c47d7: CI: Lint, add all env variables, improve gotestsum usage (#4727) (@TomOnTime)
- 957f17c: CI: Optimize cache use for faster builds (#4733) (@TomOnTime)
- b7c1605: ci(cache): Cache go modules (#4731) (@TomOnTime)
- 243ed15: ci(codeql): Enable CodeQL advanced mode (@TomOnTime)
Dependencies:
- bf2efad: CHORE: Update dependencies (#4813) (@TomOnTime)
- 9901840: Update deps (@TomOnTime)
Other changes and improvements:
- 1007860: AKAMAI: Refactor how to change .Type (#4755) (@TomOnTime)
- 4a058a0: Add provider conversion golden tests (#4716) (@TomOnTime)
- 0de7521: BENCHMARK: Compare TypeNum and RDATA type switches (#4719) (@TomOnTime)
- 5134406: BUGFIX: Activate single-dot policy (#4739) (@TomOnTime)
- ce21768: BUGFIX: Fix dnssort issue not resolving all records in certain edge cases (#4786) (@blackshadev)
- fcb93e9: BUGFIX: IsPrivateType has an off-by-one error (@TomOnTime)
- f365b0b: BUGFIX: PrettySort not working with PTR-like short names (#4420) (@TomOnTime)
- 9c8625b: BUGFIX: Unknown commands should print better error (#4769) (@TomOnTime)
- cd0c9f6: BUGFIX: integration tests audited the harness's own delegation NS records (#4758) (@SimenBai)
- 5729f28: BUGFIX: rejectif.NsAtApex never matched the apex label (#4707) (@SimenBai)
- 68bd3d1: CHORE: "vet -fix" (#4465) (@TomOnTime)
- bfa8067: CHORE: Add Must* equivs of RecordConfig factories (#4461) (@TomOnTime)
- 0df590a: CHORE: Adopt models.MustNewDomainConfig where appropriate (@TomOnTime)
- 5bb24d3: CHORE: ChangeType() -> ChangeTypeToCNAME() (#4754) (@TomOnTime)
- d38ac06: CHORE: Cleanups to make merging with v5 easier (#4444) (@TomOnTime)
- 51c0dc7: CHORE: Delete obsolete comments (#4455) (@TomOnTime)
- cb6e7ae: CHORE: Eliminate legacy SOA fields (#4615) (@TomOnTime)
- 641d744: CHORE: Fix ALIAS and modernize BIND, CLOUDFLAREAPI, GANDI_V5 (#4468) (@TomOnTime)
- fa6403c: CHORE: Fix GoReleaser to skip release candidates (#4485) (@TomOnTime)
- b3f12e6: CHORE: Fix comments (#4483) (@TomOnTime)
- a52926c: CHORE: Fix comments (#4756) (@TomOnTime)
- 4227b12: CHORE: Fix merge error (#4528) (@TomOnTime)
- 50000e0: CHORE: Generated files should have a comment indicating so (#4476) (@TomOnTime)
- 5ddee18: CHORE: Merge from base (#4527) (@TomOnTime)
- 30925b1: CHORE: Modernize pkg (#4674) (@TomOnTime)
- 58cd91d: CHORE: Remove unused SetTarget*() functions, improve warnings (#4672) (@TomOnTime)
- cae316b: CHORE: Sync with main (#4589) (@TomOnTime)
- 306a54e: CHORE: Upgrade umbrelladocs/linkspector (#4752) (@TomOnTime)
- 8a7aaa7: CHORE: Upgrade umbrelladocs/linkspector (#4753) (@TomOnTime)
- 8445416: CLEANUP: Use errors.New instead of fmt.Errorf when there is no format verb (#4802) (@TomOnTime)
- d782d96: CORE: Remove legacy conversion code (#4735) (@TomOnTime)
- c1d31c9: CORE: Upgrade OVH to RecordConfig v3 functions (#4503) (@TomOnTime)
- 7428911: Change Feature Flags to Feature Summary (@tlimoncelli26)
- abb50c3: Cleanups (@TomOnTime)
- b6a4992: Cleanups (@TomOnTime)
- 8c77f74: Complete merge (@TomOnTime)
- 7f6f7c5: FIX: porkbun url/url301/porkbun_urlfwd (#4440) (@imlonghao)
- 41c6744: Fix comments (@TomOnTime)
- 127e3a7: MYTHICBEATS: Convert to dnsv2 (#4682) (@TomOnTime)
- fffcf8d: Misc fixes: CLOUDFLAREAPI, TRANSIP, and nrc.Flags (#4627) (@TomOnTime)
- 1005c87: Modernize Azure DNS provider (#4490) (@TomOnTime)
- b02462c: Modernize Azure Private DNS provider (#4491) (@TomOnTime)
- 1e2fa8b: Modernize CNR provider (#4493) (@TomOnTime)
- b6da8d8: Modernize DYNU's access to SVCB records (#4650) (@TomOnTime)
- 70585b2: Modernize DigitalOcean provider (#4494) (@TomOnTime)
- 92588ce: Modernize Gandi v5 provider (#4495) (@TomOnTime)
- c00ada9: Modernize HE.net DNS provider (#4496) (@TomOnTime)
- 7e2673f: Modernize Name.com provider (#4497) (@TomOnTime)
- f518593: Modernize Netnod provider (#4498) (@TomOnTime)
- 927041e: Modernize PowerDNS provider (#4501) (@TomOnTime)
- c7324b3: Modernize TransIP provider (#4499) (@TomOnTime)
- f98aa65: Modernize Vercel provider (#4500) (@TomOnTime)
- c6bc4e0: REFACTOR: Convert .GetRDATA().(type) to .AsTYPE (#4602) (@TomOnTime)
- 97da255: REFACTOR: Add flags to NewRecordConfig() (#4603) (@TomOnTime)
- ca96ca8: REFACTOR: CAA/DNSKEY/DS/PopulateFromString and others now use modern methods (#4426) (@TomOnTime)
- 8ebbb1f: REFACTOR: Cleanups (#4811) (@TomOnTime)
- 5b31ed7: REFACTOR: Compute DomainNameVarieties() as part of dnsconfig.js processing, not after (#4425) (@TomOnTime)
- ad65eb1: REFACTOR: Convert more GetTargetField()s (#4694) (@TomOnTime)
- f38ac46: REFACTOR: Eliminate GetTargetCombined*() / modernize CF_WORKER_ROUTE (#4691) (@TomOnTime)
- c881690: REFACTOR: Eliminate legacy MxPreference field (#4701) (@TomOnTime)
- bdc97e1: REFACTOR: Eliminate pkg/diff, fix CLOUDNS ordering natively (#4751) (@TomOnTime)
- d7c6ed3: REFACTOR: Eliminate rc.ZonefilePartial (#4446) (@TomOnTime)
- 24d8ee2: REFACTOR: Fix V3 fields in SetRDATA() rather than catching them later (#4435) (@TomOnTime)
- 4dfcf0c: REFACTOR: Modernize AZURE_ALIAS and others (#4473) (@TomOnTime)
- da02ca0: REFACTOR: Modernize CF_SINGLE_REDIRECT FRAME URL URL301 (#4484) (@TomOnTime)
- e5e5c10: REFACTOR: Modernize CLOUDFLAREAPI and AZURE_DNS (partial). Add docs. (#4489) (@TomOnTime)
- 82202ee: REFACTOR: Modernize GCLOUD. New TXT type handling maintains segments inernally (#4479) (@TomOnTime)
- 33058f3: REFACTOR: Modernize LOC, MX, NAPTR, SMIMEA, SOA, SRV, SSHFP, TLSA (#4437) (@TomOnTime)
- 689149a: REFACTOR: Modernize t_svcb.go (#4438) (@TomOnTime)
- 286f15e: REFACTOR: Modernize t_txt.go (#4439) (@TomOnTime)
- 843c6ec: REFACTOR: Modernize the "commands/" files (#4684) (@TomOnTime)
- b507c06: REFACTOR: More cleanups and modernization (#4741) (@TomOnTime)
- 8f1283c: REFACTOR: More efficient SVCB/HTTPS parsing (#4432) (@TomOnTime)
- 0434d5a: REFACTOR: Optimize switch on .Type to be .TypeNum (#4718) (@TomOnTime)
- 95f4b92: REFACTOR: Reduce the use of GetTargetField() (#4714) (@TomOnTime)
- 6d96e27: REFACTOR: Reduce use of SetTarget(), GetTargetField() and .target (#4708) (@TomOnTime)
- 143376a: REFACTOR: Remove .target from RecordConfig, fix related SetTarget/GetTargets (#4730) (@TomOnTime)
- 1668c0f: REFACTOR: Remove RC.DnsKey* .Loc* .Smimea* (#4686) (@TomOnTime)
- b694126: REFACTOR: Remove legacy fields for SRV and NAPTR (#4703) (@TomOnTime)
- ec4e9b0: REFACTOR: Remove models.Records.String() (#4631) (@TomOnTime)
- 25ecc21: REFACTOR: Remove more RecordConfig fields (#4711) (@TomOnTime)
- 1d051bc: REFACTOR: Simplify Zonify() functions (#4448) (@TomOnTime)
- 175b6e1: REFACTOR: Simplify boolean returns, hoist regexps, tidy error paths (#4801) (@TomOnTime)
- a94f7e3: REFACTOR: Switch on RDATA types where safe (#4720) (@TomOnTime)
- 79647b6: REFACTOR: TargetHost is never @, add TargetHostSRV (#4478) (@TomOnTime)
- be51387: REFACTOR: Upgrade from dnsv1 to dnsv2 (#4683) (@TomOnTime)
- de81cff: REFACTOR: Use RDATA instead of individual fields (@TomOnTime)
- fc02655: REFACTOR: Use models.Records, not []*models.RecordConfig (#4750) (@TomOnTime)
- 088a11f: Release v4.44.1 (#4599) (@TomOnTime)
- 82916f1: Release v5.0.0 (#4814) (@TomOnTime)
- d3c7a48: Release v5.0.0-rc1 (#4521) (@TomOnTime)
- 153c0d6: Release v5.0.0-rc2 (#4591) (@TomOnTime)
- 1c629cf: Release v5.0.0-rc3 (#4651) (@TomOnTime)
- e5dc8f6: Release v5.0.0-rc4 (#4689) (@TomOnTime)
- c3d1163: Release v5.0.0-rc5 (#4726) (@TomOnTime)
- 6ceb82d: Release v5.0.0-rc6 (#4736) (@TomOnTime)
- 542bab3: Release v5.0.0-rc7 (#4744) (@TomOnTime)
- 09d026c: Release v5.0.0-rc8 (#4747) (@TomOnTime)
- d8b9c48: Release v5.0.0-rc9 (#4789) (@TomOnTime)
- 562a904: Replace dnsutilv1 functions AddOrigin and TrimDomainName (#4504) (@TomOnTime)
- b537261: Revert "Release v5.0.0-rc6 (#4736)" (#4740) (@TomOnTime)
- b2e068b: Revert "TEST: providergolden: Add -record and -update to specific tests (#4713)" (@TomOnTime)
- af11e01: Squashed commit of the following: (@tlimoncelli26)
- 9bd72ab: Switch to dnspatched (@tlimoncelli26)
- 646156c: Sync with main branch (#4533) (@TomOnTime)
- 948395e: TEST: providergolden: Add -record and -update to specific tests (#4713) (@TomOnTime)
- b4ef8a9: adopt newest dnspatched (@TomOnTime)
- 612870c: chore: Linting (#4798) (@TomOnTime)
- 06e21a7: dc copies mutex (@TomOnTime)
- 8fbde16: delete .bak files (@TomOnTime)
- d982ff0: empty (@TomOnTime)
- 0a4ccfc: empty (@TomOnTime)
- 7a4bfbd: empty (@TomOnTime)
- d5b1176: empty (@TomOnTime)
- 01ceae1: fix blackslash problem (@tlimoncelli26)
- 053d842: go mod tidy (@TomOnTime)
- 2ea8402: hetznerv2: Modernize record conversion (#4554) (@TomOnTime)
- 12f5bc1: linting (@TomOnTime)
- 9b68b96: linting (@tlimoncelli26)
- ceb642a: update dnspatched (#4737) (@TomOnTime)
- 8f51939: update is_modern.sh to include dnsv1 (#4535) (@TomOnTime)
- d39bc03: updated go.mod (@tlimoncelli26)
- e32fa9c: use dc.LabelFromShort() even when not required for safety. (#4681) (@TomOnTime)
- fe4e7f2: v5 - add non-porkbun compatibility to url301 (#4427) (@willpower232)
- ef14a1c: wip! (@tlimoncelli26)
- 1f3c702: wip! (@TomOnTime)
Deprecation warnings
Warning
- REV() will switch from RFC2317 to RFC4183 sometime after v5.0 is released. This is a breaking change. Warnings are output if your configuration is affected. See https://docs.dnscontrol.org/language-reference/top-level-functions/revcompat
- NAMEDOTCOM, OPENSRS and SOFTLAYER need maintainers! These providers have no maintainer. Maintainers respond to PRs and fix bugs in a timely manner, and try to stay on top of protocol changes.
Install
macOS and Linux
Install with Homebrew (recommended)
brew trust --formula dnscontrol/tap/dnscontrol
brew install DNSControl/tap/dnscontrolUsing with Docker
You can use the Docker image from Docker hub or GitHub Container Registry.
docker run --rm -it -v "$(pwd):/dns" ghcr.io/dnscontrol/dnscontrol previewAnywhere else
Alternatively, you can install the latest binary (or the apt/rpm/deb/archlinux package) from this page.
Or, if you have Go installed, you can install the latest version of DNSControl with the following command:
go install github.com/DNSControl/dnscontrol/v4@mainUpdate
Update to the latest version depends on how you choose to install dnscontrol on your machine.
Update with Homebrew
brew upgrade DNSControl/tap/dnscontrolAlternatively, you can grab the latest binary (or the apt/rpm/deb package) from this page.