2016-08-23 08:31:50 +08:00
package providers
import (
"encoding/json"
Switch to Go 1.13 error wrapping (#604)
* Replaced errors.Wrap with fmt.Errorf (#589)
* Find: errors\.Wrap\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Replaced errors.Wrapf with fmt.Errorf (#589)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])(,[^)]+)\)
* Replace: fmt.Errorf($2: %w$3$4, $1)
* Replaced errors.Errorf with fmt.Errorf (#589)
* Find: errors\.Errorf
Replace: fmt.Errorf
* Cleaned up remaining imports
* Cleanup
* Regenerate provider support matrix
This was broken by #533 ... and it's now the third time this has been missed.
2020-01-29 00:06:56 +08:00
"fmt"
2016-08-23 08:31:50 +08:00
"log"
2020-01-28 23:42:31 +08:00
"github.com/StackExchange/dnscontrol/v2/models"
2016-08-23 08:31:50 +08:00
)
2018-07-26 00:59:04 +08:00
// Registrar is an interface for a domain registrar. It can return a list of needed corrections to be applied in the future. Implement this only if the provider is a "registrar" (i.e. can update the NS records of the parent to a domain).
2016-08-23 08:31:50 +08:00
type Registrar interface {
2018-02-02 00:45:53 +08:00
models . Registrar
2016-08-23 08:31:50 +08:00
}
2018-07-26 00:59:04 +08:00
// DNSServiceProvider is able to generate a set of corrections that need to be made to correct records for a domain. Implement this only if the provider is a DNS Service Provider (can update records in a DNS zone).
2016-08-23 08:31:50 +08:00
type DNSServiceProvider interface {
2018-02-02 00:45:53 +08:00
models . DNSProvider
2016-08-23 08:31:50 +08:00
}
2018-01-10 01:53:16 +08:00
// DomainCreator should be implemented by providers that have the ability to add domains to an account. the create-domains command
2018-07-26 00:59:04 +08:00
// can be run to ensure all domains are present before running preview/push. Implement this only if the provider supoprts the `dnscontrol create-domain` command.
2017-01-04 04:26:08 +08:00
type DomainCreator interface {
EnsureDomainExists ( domain string ) error
}
2018-01-10 01:53:16 +08:00
// RegistrarInitializer is a function to create a registrar. Function will be passed the unprocessed json payload from the configuration file for the given provider.
2016-08-23 08:31:50 +08:00
type RegistrarInitializer func ( map [ string ] string ) ( Registrar , error )
2018-01-10 01:53:16 +08:00
// RegistrarTypes stores initializer for each registrar.
2017-09-15 04:13:17 +08:00
var RegistrarTypes = map [ string ] RegistrarInitializer { }
2016-08-23 08:31:50 +08:00
2018-01-10 01:53:16 +08:00
// DspInitializer is a function to create a DNS service provider. Function will be passed the unprocessed json payload from the configuration file for the given provider.
2016-08-23 08:31:50 +08:00
type DspInitializer func ( map [ string ] string , json . RawMessage ) ( DNSServiceProvider , error )
2018-01-10 01:53:16 +08:00
// DNSProviderTypes stores initializer for each DSP.
2017-09-15 04:13:17 +08:00
var DNSProviderTypes = map [ string ] DspInitializer { }
2016-08-23 08:31:50 +08:00
2018-01-10 01:53:16 +08:00
// RegisterRegistrarType adds a registrar type to the registry by providing a suitable initialization function.
2017-09-15 04:13:17 +08:00
func RegisterRegistrarType ( name string , init RegistrarInitializer , pm ... ProviderMetadata ) {
if _ , ok := RegistrarTypes [ name ] ; ok {
2016-08-23 08:31:50 +08:00
log . Fatalf ( "Cannot register registrar type %s multiple times" , name )
}
2017-09-15 04:13:17 +08:00
RegistrarTypes [ name ] = init
unwrapProviderCapabilities ( name , pm )
2016-08-23 08:31:50 +08:00
}
2018-01-10 01:53:16 +08:00
// RegisterDomainServiceProviderType adds a dsp to the registry with the given initialization function.
2017-09-15 04:13:17 +08:00
func RegisterDomainServiceProviderType ( name string , init DspInitializer , pm ... ProviderMetadata ) {
if _ , ok := DNSProviderTypes [ name ] ; ok {
2016-08-23 08:31:50 +08:00
log . Fatalf ( "Cannot register registrar type %s multiple times" , name )
}
2017-09-15 04:13:17 +08:00
DNSProviderTypes [ name ] = init
unwrapProviderCapabilities ( name , pm )
2016-08-23 08:31:50 +08:00
}
2018-02-02 00:45:53 +08:00
// CreateRegistrar initializes a registrar instance from given credentials.
func CreateRegistrar ( rType string , config map [ string ] string ) ( Registrar , error ) {
2017-09-15 04:13:17 +08:00
initer , ok := RegistrarTypes [ rType ]
2016-08-23 08:31:50 +08:00
if ! ok {
Switch to Go 1.13 error wrapping (#604)
* Replaced errors.Wrap with fmt.Errorf (#589)
* Find: errors\.Wrap\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Replaced errors.Wrapf with fmt.Errorf (#589)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])(,[^)]+)\)
* Replace: fmt.Errorf($2: %w$3$4, $1)
* Replaced errors.Errorf with fmt.Errorf (#589)
* Find: errors\.Errorf
Replace: fmt.Errorf
* Cleaned up remaining imports
* Cleanup
* Regenerate provider support matrix
This was broken by #533 ... and it's now the third time this has been missed.
2020-01-29 00:06:56 +08:00
return nil , fmt . Errorf ( "registrar type %s not declared" , rType )
2016-08-23 08:31:50 +08:00
}
return initer ( config )
}
2018-02-02 00:45:53 +08:00
// CreateDNSProvider initializes a dns provider instance from given credentials.
2017-03-17 13:42:53 +08:00
func CreateDNSProvider ( dType string , config map [ string ] string , meta json . RawMessage ) ( DNSServiceProvider , error ) {
2017-09-15 04:13:17 +08:00
initer , ok := DNSProviderTypes [ dType ]
2016-08-23 08:31:50 +08:00
if ! ok {
Switch to Go 1.13 error wrapping (#604)
* Replaced errors.Wrap with fmt.Errorf (#589)
* Find: errors\.Wrap\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Replaced errors.Wrapf with fmt.Errorf (#589)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])\)
Replace: fmt.Errorf($2: %w$3, $1)
* Find: errors\.Wrapf\(([^,]+),\s+(["`][^"`]*)(["`])(,[^)]+)\)
* Replace: fmt.Errorf($2: %w$3$4, $1)
* Replaced errors.Errorf with fmt.Errorf (#589)
* Find: errors\.Errorf
Replace: fmt.Errorf
* Cleaned up remaining imports
* Cleanup
* Regenerate provider support matrix
This was broken by #533 ... and it's now the third time this has been missed.
2020-01-29 00:06:56 +08:00
return nil , fmt . Errorf ( "DSP type %s not declared" , dType )
2016-08-23 08:31:50 +08:00
}
return initer ( config , meta )
}
2017-04-27 20:59:18 +08:00
// None is a basic provider type that does absolutely nothing. Can be useful as a placeholder for third parties or unimplemented providers.
2016-08-23 08:31:50 +08:00
type None struct { }
2018-01-10 01:53:16 +08:00
// GetRegistrarCorrections returns corrections to update registrars.
2016-08-23 08:31:50 +08:00
func ( n None ) GetRegistrarCorrections ( dc * models . DomainConfig ) ( [ ] * models . Correction , error ) {
return nil , nil
}
2018-01-10 01:53:16 +08:00
// GetNameservers returns the current nameservers for a domain.
2016-12-17 04:10:27 +08:00
func ( n None ) GetNameservers ( string ) ( [ ] * models . Nameserver , error ) {
return nil , nil
}
2018-01-10 01:53:16 +08:00
// GetDomainCorrections returns corrections to update a domain.
2016-08-23 08:31:50 +08:00
func ( n None ) GetDomainCorrections ( dc * models . DomainConfig ) ( [ ] * models . Correction , error ) {
return nil , nil
}
func init ( ) {
RegisterRegistrarType ( "NONE" , func ( map [ string ] string ) ( Registrar , error ) {
return None { } , nil
} )
}
2017-05-20 02:15:57 +08:00
2018-01-10 01:53:16 +08:00
// CustomRType stores an rtype that is only valid for this DSP.
2017-05-20 02:15:57 +08:00
type CustomRType struct {
Name string
Provider string
RealType string
}
// RegisterCustomRecordType registers a record type that is only valid for one provider.
// provider is the registered type of provider this is valid with
// name is the record type as it will appear in the js. (should be something like $PROVIDER_FOO)
// realType is the record type it will be replaced with after validation
func RegisterCustomRecordType ( name , provider , realType string ) {
customRecordTypes [ name ] = & CustomRType { Name : name , Provider : provider , RealType : realType }
}
// GetCustomRecordType returns a registered custom record type, or nil if none
func GetCustomRecordType ( rType string ) * CustomRType {
return customRecordTypes [ rType ]
}
var customRecordTypes = map [ string ] * CustomRType { }