2020-05-30 15:54:07 +02:00
|
|
|
package powerdns
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
2022-08-14 20:46:56 -04:00
|
|
|
|
2020-05-30 15:54:07 +02:00
|
|
|
"github.com/StackExchange/dnscontrol/v3/models"
|
|
|
|
"github.com/StackExchange/dnscontrol/v3/providers"
|
2020-08-30 19:52:37 -04:00
|
|
|
pdns "github.com/mittwald/go-powerdns"
|
2020-05-30 15:54:07 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
var features = providers.DocumentationNotes{
|
2022-03-02 11:19:15 -05:00
|
|
|
providers.CanAutoDNSSEC: providers.Can(),
|
|
|
|
providers.CanGetZones: providers.Can(),
|
2021-03-01 13:09:49 +01:00
|
|
|
providers.CanUseAlias: providers.Can("Needs to be enabled in PowerDNS first", "https://doc.powerdns.com/authoritative/guides/alias.html"),
|
2020-05-30 15:54:07 +02:00
|
|
|
providers.CanUseCAA: providers.Can(),
|
2022-02-17 23:16:15 +01:00
|
|
|
providers.CanUseDS: providers.Can(),
|
2023-03-16 19:59:44 -04:00
|
|
|
providers.CanUseLOC: providers.Unimplemented(),
|
2022-03-02 11:19:15 -05:00
|
|
|
providers.CanUseNAPTR: providers.Can(),
|
2020-05-30 15:54:07 +02:00
|
|
|
providers.CanUsePTR: providers.Can(),
|
|
|
|
providers.CanUseSRV: providers.Can(),
|
|
|
|
providers.CanUseSSHFP: providers.Can(),
|
2022-03-02 11:19:15 -05:00
|
|
|
providers.CanUseTLSA: providers.Can(),
|
2020-05-30 15:54:07 +02:00
|
|
|
providers.DocCreateDomains: providers.Can(),
|
2021-03-01 13:09:49 +01:00
|
|
|
providers.DocDualHost: providers.Can(),
|
2022-03-02 11:19:15 -05:00
|
|
|
providers.DocOfficiallySupported: providers.Cannot(),
|
2020-05-30 15:54:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
2021-03-07 13:19:22 -05:00
|
|
|
fns := providers.DspFuncs{
|
2022-06-20 18:27:05 +02:00
|
|
|
Initializer: newDSP,
|
2021-03-08 20:14:30 -05:00
|
|
|
RecordAuditor: AuditRecords,
|
2021-03-07 13:19:22 -05:00
|
|
|
}
|
|
|
|
providers.RegisterDomainServiceProviderType("POWERDNS", fns, features)
|
2020-05-30 15:54:07 +02:00
|
|
|
}
|
|
|
|
|
2020-10-26 09:25:30 -04:00
|
|
|
// powerdnsProvider represents the powerdnsProvider DNSServiceProvider.
|
|
|
|
type powerdnsProvider struct {
|
2020-05-30 15:54:07 +02:00
|
|
|
client pdns.Client
|
|
|
|
APIKey string
|
|
|
|
APIUrl string
|
|
|
|
ServerName string
|
|
|
|
DefaultNS []string `json:"default_ns"`
|
|
|
|
DNSSecOnCreate bool `json:"dnssec_on_create"`
|
|
|
|
|
|
|
|
nameservers []*models.Nameserver
|
|
|
|
}
|
|
|
|
|
2022-06-20 18:27:05 +02:00
|
|
|
// newDSP initializes a PowerDNS DNSServiceProvider.
|
|
|
|
func newDSP(m map[string]string, metadata json.RawMessage) (providers.DNSServiceProvider, error) {
|
|
|
|
dsp := &powerdnsProvider{}
|
2020-05-30 15:54:07 +02:00
|
|
|
|
2022-06-20 18:27:05 +02:00
|
|
|
dsp.APIKey = m["apiKey"]
|
|
|
|
if dsp.APIKey == "" {
|
2020-05-30 15:54:07 +02:00
|
|
|
return nil, fmt.Errorf("PowerDNS API Key is required")
|
|
|
|
}
|
|
|
|
|
2022-06-20 18:27:05 +02:00
|
|
|
dsp.APIUrl = m["apiUrl"]
|
|
|
|
if dsp.APIUrl == "" {
|
2020-05-30 15:54:07 +02:00
|
|
|
return nil, fmt.Errorf("PowerDNS API URL is required")
|
|
|
|
}
|
|
|
|
|
2022-06-20 18:27:05 +02:00
|
|
|
dsp.ServerName = m["serverName"]
|
|
|
|
if dsp.ServerName == "" {
|
2020-05-30 15:54:07 +02:00
|
|
|
return nil, fmt.Errorf("PowerDNS server name is required")
|
|
|
|
}
|
|
|
|
|
|
|
|
// load js config
|
|
|
|
if len(metadata) != 0 {
|
2022-06-20 18:27:05 +02:00
|
|
|
err := json.Unmarshal(metadata, dsp)
|
2020-05-30 15:54:07 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var nss []string
|
2022-06-20 18:27:05 +02:00
|
|
|
for _, ns := range dsp.DefaultNS {
|
2020-05-30 15:54:07 +02:00
|
|
|
nss = append(nss, ns[0:len(ns)-1])
|
|
|
|
}
|
|
|
|
var err error
|
2022-06-20 18:27:05 +02:00
|
|
|
dsp.nameservers, err = models.ToNameservers(nss)
|
2020-05-30 15:54:07 +02:00
|
|
|
if err != nil {
|
2022-06-20 18:27:05 +02:00
|
|
|
return dsp, err
|
2020-05-30 15:54:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var clientErr error
|
2022-06-20 18:27:05 +02:00
|
|
|
dsp.client, clientErr = pdns.New(
|
|
|
|
pdns.WithBaseURL(dsp.APIUrl),
|
|
|
|
pdns.WithAPIKeyAuthentication(dsp.APIKey),
|
2020-05-30 15:54:07 +02:00
|
|
|
)
|
2022-06-20 18:27:05 +02:00
|
|
|
return dsp, clientErr
|
2020-05-30 15:54:07 +02:00
|
|
|
}
|