2020-05-30 15:54:07 +02:00
package powerdns
import (
"encoding/json"
"fmt"
2023-08-18 15:50:21 +01:00
2023-04-25 00:16:23 +02:00
"github.com/mittwald/go-powerdns/apis/zones"
2022-08-14 20:46:56 -04:00
2023-05-20 19:21:45 +02:00
"github.com/StackExchange/dnscontrol/v4/models"
"github.com/StackExchange/dnscontrol/v4/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 {
2024-03-18 18:30:09 -04:00
// The default for unlisted capabilities is 'Cannot'.
// See providers/capabilities.go for the entire list of capabilities.
2022-03-02 11:19:15 -05:00
providers . CanAutoDNSSEC : providers . Can ( ) ,
providers . CanGetZones : providers . Can ( ) ,
2024-03-20 12:36:54 -04:00
providers . CanConcur : providers . Cannot ( ) ,
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 ( ) ,
2024-04-17 21:50:18 +02:00
providers . CanUseDHCID : providers . Can ( ) ,
2023-03-17 15:22:10 +01:00
providers . CanUseLOC : providers . Unimplemented ( "Normalization within the PowerDNS API seems to be buggy, so disabled" , "https://github.com/PowerDNS/pdns/issues/10558" ) ,
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
2023-04-25 00:16:23 +02:00
DefaultNS [ ] string ` json:"default_ns" `
DNSSecOnCreate bool ` json:"dnssec_on_create" `
ZoneKind zones . ZoneKind ` json:"zone_kind" `
2023-08-18 15:50:21 +01:00
SOAEditAPI string ` json:"soa_edit_api,omitempty" `
2020-05-30 15:54:07 +02:00
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
}