mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-09-20 14:56:20 +08:00
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>
This commit is contained in:
parent
45e8622c0a
commit
d5665ceaf6
|
@ -4,33 +4,26 @@ title: hosting.de Provider
|
||||||
layout: default
|
layout: default
|
||||||
jsId: hostingde
|
jsId: hostingde
|
||||||
---
|
---
|
||||||
|
|
||||||
# hosting.de Provider
|
# hosting.de Provider
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
In your credentials file, you must provide your [`authToken` and optionally an `ownerAccountId`](https://www.hosting.de/api/#requests-and-authentication).
|
In your credentials file, you must provide your [`authToken` and optionally an `ownerAccountId`](https://www.hosting.de/api/#requests-and-authentication).
|
||||||
|
|
||||||
**If you want to use this provider with http.net or a demo system you need to provide a custom `baseURL`.**
|
### Example `creds.json`
|
||||||
|
|
||||||
* hosting.de (default): `https://secure.hosting.de`
|
|
||||||
* http.net: `https://partner.http.net`
|
|
||||||
* Demo: `https://demo.routing.net`
|
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"hosting.de": {
|
"hosting.de": {
|
||||||
"authToken": "YOUR_API_KEY"
|
"authToken": "YOUR_API_KEY"
|
||||||
},
|
|
||||||
"http.net": {
|
|
||||||
"authToken": "YOUR_API_KEY",
|
|
||||||
"baseURL": "https://partner.http.net"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Example JavaScript:
|
### Example `dnsconfig.js`
|
||||||
|
|
||||||
```js
|
```js
|
||||||
var REG_HOSTINGDE = NewRegistrar('hosting.de', 'HOSTINGDE')
|
var REG_HOSTINGDE = NewRegistrar('hosting.de', 'HOSTINGDE')
|
||||||
|
@ -41,15 +34,29 @@ D('example.tld', REG_HOSTINGDE, DnsProvider(DNS_HOSTINGDE),
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
## Customize nameservers
|
## Using this provider with http.net and others
|
||||||
|
|
||||||
hosting.de has the concept of *nameserver sets* but this provider does not implement it.
|
http.net and other DNS service providers use an API that is compatible with hosting.de's API.
|
||||||
The `HOSTINGDE` provider **ignores the default nameserver set** defined in your account!
|
Using them requires setting the `baseURL` and (optionally) overriding the default nameservers.
|
||||||
Instead, it uses hosting.de's nameservers (`ns1.hosting.de.`, `ns2.hosting.de.`, and `ns3.hosting.de.`) by default, regardless of your account settings.
|
|
||||||
|
|
||||||
If you want to change this behaviour to, for example, use http.net's nameservers, you can do this by setting an array of strings called `default_ns` in the provider metadata:
|
### Example http.net configuration
|
||||||
|
|
||||||
|
#### Example `creds.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"http.net": {
|
||||||
|
"authToken": "YOUR_API_KEY",
|
||||||
|
"baseURL": "https://partner.http.net"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example `dnsconfig.js`
|
||||||
|
|
||||||
```js
|
```js
|
||||||
|
var REG_HTTPNET = NewRegistrar('http.net', 'HOSTINGDE');
|
||||||
|
|
||||||
var DNS_HTTPNET = NewDnsProvider('http.net', 'HOSTINGDE', {
|
var DNS_HTTPNET = NewDnsProvider('http.net', 'HOSTINGDE', {
|
||||||
default_ns: [
|
default_ns: [
|
||||||
'ns1.routing.net.',
|
'ns1.routing.net.',
|
||||||
|
@ -58,3 +65,10 @@ var DNS_HTTPNET = NewDnsProvider('http.net', 'HOSTINGDE', {
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Why this works
|
||||||
|
|
||||||
|
hosting.de has the concept of _nameserver sets_ but this provider does not implement it.
|
||||||
|
The `HOSTINGDE` provider **ignores the default nameserver set** defined in your account to avoid unintentional changes and consolidate the full configuration in DNSControl.
|
||||||
|
Instead, it uses hosting.de's nameservers (`ns1.hosting.de.`, `ns2.hosting.de.`, and `ns3.hosting.de.`) by default, regardless of your account settings.
|
||||||
|
Using the `default_ns` metadata, the default nameserver set can be overwritten.
|
||||||
|
|
|
@ -17,6 +17,7 @@ type hostingdeProvider struct {
|
||||||
authToken string
|
authToken string
|
||||||
ownerAccountID string
|
ownerAccountID string
|
||||||
baseURL string
|
baseURL string
|
||||||
|
nameservers []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hp *hostingdeProvider) getDomainConfig(domain string) (*domainConfig, error) {
|
func (hp *hostingdeProvider) getDomainConfig(domain string) (*domainConfig, error) {
|
||||||
|
@ -51,7 +52,7 @@ func (hp *hostingdeProvider) createZone(domain string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
records := []*record{}
|
records := []*record{}
|
||||||
for _, ns := range defaultNameservers {
|
for _, ns := range hp.nameservers {
|
||||||
records = append(records, &record{
|
records = append(records, &record{
|
||||||
Name: domain,
|
Name: domain,
|
||||||
Type: "NS",
|
Type: "NS",
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
"github.com/StackExchange/dnscontrol/v3/providers"
|
"github.com/StackExchange/dnscontrol/v3/providers"
|
||||||
)
|
)
|
||||||
|
|
||||||
var defaultNameservers = []string{"ns1.hosting.de", "ns2.hosting.de", "ns3.hosting.de"}
|
var defaultNameservers = []string{"ns1.hosting.de.", "ns2.hosting.de.", "ns3.hosting.de."}
|
||||||
|
|
||||||
var features = providers.DocumentationNotes{
|
var features = providers.DocumentationNotes{
|
||||||
providers.CanAutoDNSSEC: providers.Unimplemented("Supported but not implemented yet."),
|
providers.CanAutoDNSSEC: providers.Unimplemented("Supported but not implemented yet."),
|
||||||
|
@ -40,7 +40,11 @@ func init() {
|
||||||
providers.RegisterDomainServiceProviderType("HOSTINGDE", fns, features)
|
providers.RegisterDomainServiceProviderType("HOSTINGDE", fns, features)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newHostingde(m map[string]string) (*hostingdeProvider, error) {
|
type providerMeta struct {
|
||||||
|
DefaultNS []string `json:"default_ns"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func newHostingde(m map[string]string, providermeta json.RawMessage) (*hostingdeProvider, error) {
|
||||||
authToken, ownerAccountID, baseURL := m["authToken"], m["ownerAccountId"], m["baseURL"]
|
authToken, ownerAccountID, baseURL := m["authToken"], m["ownerAccountId"], m["baseURL"]
|
||||||
|
|
||||||
if authToken == "" {
|
if authToken == "" {
|
||||||
|
@ -56,33 +60,33 @@ func newHostingde(m map[string]string) (*hostingdeProvider, error) {
|
||||||
authToken: authToken,
|
authToken: authToken,
|
||||||
ownerAccountID: ownerAccountID,
|
ownerAccountID: ownerAccountID,
|
||||||
baseURL: baseURL,
|
baseURL: baseURL,
|
||||||
|
nameservers: defaultNameservers,
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(providermeta) > 0 {
|
||||||
|
var pm providerMeta
|
||||||
|
if err := json.Unmarshal(providermeta, &pm); err != nil {
|
||||||
|
return nil, fmt.Errorf("hosting.de: could not parse providermeta: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(pm.DefaultNS) > 0 {
|
||||||
|
hp.nameservers = pm.DefaultNS
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return hp, nil
|
return hp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newHostingdeDsp(m map[string]string, raw json.RawMessage) (providers.DNSServiceProvider, error) {
|
func newHostingdeDsp(m map[string]string, providermeta json.RawMessage) (providers.DNSServiceProvider, error) {
|
||||||
return newHostingde(m)
|
return newHostingde(m, providermeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newHostingdeReg(m map[string]string) (providers.Registrar, error) {
|
func newHostingdeReg(m map[string]string) (providers.Registrar, error) {
|
||||||
return newHostingde(m)
|
return newHostingde(m, json.RawMessage{})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hp *hostingdeProvider) GetNameservers(domain string) ([]*models.Nameserver, error) {
|
func (hp *hostingdeProvider) GetNameservers(domain string) ([]*models.Nameserver, error) {
|
||||||
src, err := hp.getRecords(domain)
|
return models.ToNameserversStripTD(hp.nameservers)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var nameservers []string
|
|
||||||
for _, record := range src {
|
|
||||||
if record.Type == "NS" {
|
|
||||||
nameservers = append(nameservers, record.Content)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return models.ToNameservers(nameservers)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hp *hostingdeProvider) GetZoneRecords(domain string) (models.Records, error) {
|
func (hp *hostingdeProvider) GetZoneRecords(domain string) (models.Records, error) {
|
||||||
|
|
Loading…
Reference in a new issue