dnscontrol/providers/sakuracloud/sakuracloudProvider.go
Takashi Takizawa 864d45290f
NEW PROVIDER: Sakura Cloud (SAKURACLOUD) (#3086)
Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
2024-08-21 09:14:56 -04:00

109 lines
3.3 KiB
Go

package sakuracloud
import (
"encoding/json"
"fmt"
"github.com/StackExchange/dnscontrol/v4/models"
"github.com/StackExchange/dnscontrol/v4/providers"
)
const defaultEndpoint = "https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1"
var features = providers.DocumentationNotes{
// The default for unlisted capabilities is 'Cannot'.
// See providers/capabilities.go for the entire list of capabilities.
providers.CanAutoDNSSEC: providers.Cannot(),
providers.CanConcur: providers.Cannot(),
providers.CanGetZones: providers.Can(),
providers.CanUseAlias: providers.Can(),
providers.CanUseCAA: providers.Can(),
providers.CanUseDHCID: providers.Cannot(),
providers.CanUseDNAME: providers.Cannot(),
providers.CanUseDS: providers.Cannot(),
providers.CanUseDSForChildren: providers.Cannot(),
providers.CanUseHTTPS: providers.Can(),
providers.CanUseLOC: providers.Cannot(),
providers.CanUseNAPTR: providers.Cannot(),
providers.CanUsePTR: providers.Can(),
providers.CanUseSOA: providers.Cannot(),
providers.CanUseSRV: providers.Can(),
providers.CanUseSSHFP: providers.Cannot(),
providers.CanUseSVCB: providers.Can(),
providers.CanUseTLSA: providers.Cannot(),
providers.CanUseDNSKEY: providers.Cannot(),
providers.DocCreateDomains: providers.Can(),
providers.DocDualHost: providers.Cannot(),
providers.DocOfficiallySupported: providers.Cannot(),
}
func init() {
const providerName = "SAKURACLOUD"
const providerMaintainer = "@ttkzw"
fns := providers.DspFuncs{
Initializer: newSakuracloudDsp,
RecordAuditor: AuditRecords,
}
providers.RegisterDomainServiceProviderType(providerName, fns, features)
providers.RegisterMaintainer(providerName, providerMaintainer)
}
type sakuracloudProvider struct {
api *sakuracloudAPI
}
func newSakuracloudDsp(conf map[string]string, metadata json.RawMessage) (providers.DNSServiceProvider, error) {
return newSakuracloud(conf, metadata)
}
// newDSP initializes a Sakura Cloud DNSServiceProvider.
func newSakuracloud(config map[string]string, _ json.RawMessage) (*sakuracloudProvider, error) {
// config -- the key/values from creds.json
accessToken := config["access_token"]
if accessToken == "" {
return nil, fmt.Errorf("access_token is required")
}
accessTokenSecret := config["access_token_secret"]
if accessTokenSecret == "" {
return nil, fmt.Errorf("access_token_secret is required")
}
endpoint := config["endpoint"]
if endpoint == "" {
endpoint = defaultEndpoint
}
api, err := NewSakuracloudAPI(accessToken, accessTokenSecret, endpoint)
if err != nil {
return nil, err
}
dsp := &sakuracloudProvider{
api: api,
}
return dsp, nil
}
type errNoExist struct {
domain string
}
func (e errNoExist) Error() string {
return fmt.Sprintf("Zone %s not found in your Sakura Cloud account", e.domain)
}
// GetNameservers returns the current nameservers for a domain.
func (s *sakuracloudProvider) GetNameservers(domain string) ([]*models.Nameserver, error) {
itemMap, err := s.api.GetCommonServiceItemMap()
if err != nil {
return nil, err
}
item, ok := itemMap[domain]
if !ok {
return nil, errNoExist{domain}
}
return models.ToNameservers(item.Status.NS)
}