mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-05-11 05:55:12 +00:00
* go get -u github.com/aws/aws-sdk-go * get -u github.com/tiramiseb/go-gandi * go get -u google.golang.org/api Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
210 lines
7.8 KiB
Go
210 lines
7.8 KiB
Go
package domain
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/tiramiseb/go-gandi/internal/client"
|
|
)
|
|
|
|
// Domain is the API client to the Gandi v5 Domain API
|
|
type Domain struct {
|
|
client client.Gandi
|
|
}
|
|
|
|
// New returns an instance of the Domain API client
|
|
func New(apikey string, sharingid string, debug bool, dryRun bool) *Domain {
|
|
client := client.New(apikey, sharingid, debug, dryRun)
|
|
client.SetEndpoint("domain/")
|
|
return &Domain{client: *client}
|
|
}
|
|
|
|
// NewFromClient returns an instance of the Domain API client
|
|
func NewFromClient(g client.Gandi) *Domain {
|
|
g.SetEndpoint("domain/")
|
|
return &Domain{client: g}
|
|
}
|
|
|
|
// Contact represents a contact associated with a domain
|
|
type Contact struct {
|
|
Country string `json:"country"`
|
|
Email string `json:"email"`
|
|
FamilyName string `json:"family"`
|
|
GivenName string `json:"given"`
|
|
StreetAddr string `json:"streetaddr"`
|
|
ContactType int `json:"type"`
|
|
BrandNumber string `json:"brand_number,omitempty"`
|
|
City string `json:"city,omitempty"`
|
|
DataObfuscated *bool `json:"data_obfuscated,omitempty"`
|
|
Fax string `json:"fax,omitempty"`
|
|
Language string `json:"lang,omitempty"`
|
|
MailObfuscated *bool `json:"mail_obfuscated,omitempty"`
|
|
Mobile string `json:"mobile,omitempty"`
|
|
OrgName string `json:"orgname,omitempty"`
|
|
Phone string `json:"phone,omitempty"`
|
|
Siren string `json:"siren,omitempty"`
|
|
State string `json:"state,omitempty"`
|
|
Validation string `json:"validation,omitempty"`
|
|
Zip string `json:"zip,omitempty"`
|
|
}
|
|
|
|
// ResponseDates represents all the dates associated with a domain
|
|
type ResponseDates struct {
|
|
RegistryCreatedAt *time.Time `json:"registry_created_at"`
|
|
UpdatedAt *time.Time `json:"updated_at"`
|
|
AuthInfoExpiresAt *time.Time `json:"authinfo_expires_at,omitempty"`
|
|
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
DeletesAt *time.Time `json:"deletes_at,omitempty"`
|
|
HoldBeginsAt *time.Time `json:"hold_begins_at,omitempty"`
|
|
HoldEndsAt *time.Time `json:"hold_ends_at,omitempty"`
|
|
PendingDeleteEndsAt *time.Time `json:"pending_delete_ends_at,omitempty"`
|
|
RegistryEndsAt *time.Time `json:"registry_ends_at,omitempty"`
|
|
RenewBeginsAt *time.Time `json:"renew_begins_at,omitempty"`
|
|
RenewEndsAt *time.Time `json:"renew_ends_at,omitempty"`
|
|
}
|
|
|
|
// NameServerConfig represents the name server configuration for a domain
|
|
type NameServerConfig struct {
|
|
Current string `json:"current"`
|
|
Hosts []string `json:"hosts,omitempty"`
|
|
}
|
|
|
|
// ListResponse is the response object returned by listing domains
|
|
type ListResponse struct {
|
|
AutoRenew *bool `json:"autorenew"`
|
|
Dates *ResponseDates `json:"dates"`
|
|
DomainOwner string `json:"domain_owner"`
|
|
FQDN string `json:"fqdn"`
|
|
FQDNUnicode string `json:"fqdn_unicode"`
|
|
Href string `json:"href"`
|
|
ID string `json:"id"`
|
|
NameServer *NameServerConfig `json:"nameserver"`
|
|
OrgaOwner string `json:"orga_owner"`
|
|
Owner string `json:"owner"`
|
|
Status []string `json:"status"`
|
|
TLD string `json:"tld"`
|
|
SharingID string `json:"sharing_id,omitempty"`
|
|
Tags []string `json:"tags,omitempty"`
|
|
}
|
|
|
|
// AutoRenew is the auto renewal information for the domain
|
|
type AutoRenew struct {
|
|
Href string `json:"href,omitempty"`
|
|
Dates *[]time.Time `json:"dates,omitempty"`
|
|
Duration int `json:"duration,omitempty"`
|
|
Enabled *bool `json:"enabled,omitempty"`
|
|
OrgID string `json:"org_id,omitempty"`
|
|
}
|
|
|
|
// SharingSpace defines the Organisation that owns the domain
|
|
type SharingSpace struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
// Details describes a single domain
|
|
type Details struct {
|
|
AutoRenew *AutoRenew `json:"autorenew"`
|
|
CanTLDLock *bool `json:"can_tld_lock"`
|
|
Contacts *Contacts `json:"contacts"`
|
|
Dates *ResponseDates `json:"dates"`
|
|
FQDN string `json:"fqdn"`
|
|
FQDNUnicode string `json:"fqdn_unicode"`
|
|
Href string `json:"href"`
|
|
Nameservers []string `json:"nameservers,omitempty"`
|
|
Services []string `json:"services"`
|
|
SharingSpace *SharingSpace `json:"sharing_space"`
|
|
Status []string `json:"status"`
|
|
TLD string `json:"tld"`
|
|
AuthInfo string `json:"authinfo,omitempty"`
|
|
ID string `json:"id,omitempty"`
|
|
SharingID string `json:"sharing_id,omitempty"`
|
|
Tags []string `json:"tags,omitempty"`
|
|
TrusteeRoles []string `json:"trustee_roles,omitempty"`
|
|
}
|
|
|
|
// CreateRequest is used to request a new domain
|
|
type CreateRequest struct {
|
|
FQDN string `json:"fqdn"`
|
|
Owner *Contact `json:"owner"`
|
|
Admin *Contact `json:"admin,omitempty"`
|
|
Billing *Contact `json:"bill,omitempty"`
|
|
Claims string `json:"claims,omitempty"`
|
|
Currency string `json:"currency,omitempty"`
|
|
// Duration in years between 1 and 10
|
|
Duration int `json:"duration,omitempty"`
|
|
EnforcePremium bool `json:"enforce_premium,omitempty"`
|
|
Lang string `json:"lang,omitempty"`
|
|
// NameserverIPs sets the Glue Records for the domain
|
|
NameserverIPs map[string]string `json:"nameserver_ips,omitempty"`
|
|
Nameservers []string `json:"nameservers,omitempty"`
|
|
Price int `json:"price,omitempty"`
|
|
ReselleeID string `json:"resellee_id,omitempty"`
|
|
// SMD is a Signed Mark Data file; if used, `TLDPeriod` must be "sunrise"
|
|
SMD string `json:"smd,omitempty"`
|
|
Tech *Contact `json:"tech,omitempty"`
|
|
TLDPeriod string `json:"tld_period,omitempty"`
|
|
}
|
|
|
|
// Contacts is the set of contacts associated with a Domain
|
|
type Contacts struct {
|
|
Admin *Contact `json:"admin,omitempty"`
|
|
Billing *Contact `json:"bill,omitempty"`
|
|
Owner *Contact `json:"owner,omitempty"`
|
|
Tech *Contact `json:"tech,omitempty"`
|
|
}
|
|
|
|
// Nameservers represents a list of nameservers
|
|
type Nameservers struct {
|
|
Nameservers []string `json:"nameservers,omitempty"`
|
|
}
|
|
|
|
// ListDomains requests the set of Domains
|
|
// It returns a slice of domains and any error encountered
|
|
func (g *Domain) ListDomains() (domains []ListResponse, err error) {
|
|
_, err = g.client.Get("domains", nil, &domains)
|
|
return
|
|
}
|
|
|
|
// GetDomain requests a single Domain
|
|
// It returns a Details object and any error encountered
|
|
func (g *Domain) GetDomain(domain string) (domainResponse Details, err error) {
|
|
_, err = g.client.Get("domains/"+domain, nil, &domainResponse)
|
|
return
|
|
}
|
|
|
|
// CreateDomain creates a single Domain
|
|
func (g *Domain) CreateDomain(req CreateRequest) (err error) {
|
|
_, err = g.client.Post("domains", req, nil)
|
|
return
|
|
}
|
|
|
|
// GetNameServers returns the configured nameservers for a domain
|
|
func (g *Domain) GetNameServers(domain string) (nameservers []string, err error) {
|
|
_, err = g.client.Get("domains/"+domain+"/nameservers", nil, &nameservers)
|
|
return
|
|
}
|
|
|
|
// UpdateNameServers sets the list of the nameservers for a domain
|
|
func (g *Domain) UpdateNameServers(domain string, ns []string) (err error) {
|
|
_, err = g.client.Put("domains/"+domain+"/nameservers", Nameservers{ns}, nil)
|
|
return
|
|
}
|
|
|
|
// GetContacts returns the contact objects for a domain
|
|
func (g *Domain) GetContacts(domain string) (contacts Contacts, err error) {
|
|
_, err = g.client.Get("domains/"+domain+"/contacts", nil, &contacts)
|
|
return
|
|
}
|
|
|
|
// SetContacts sets the contact objects for a domain
|
|
func (g *Domain) SetContacts(domain string, contacts Contacts) (err error) {
|
|
_, err = g.client.Patch("domains/"+domain+"/contacts", contacts, nil)
|
|
return
|
|
}
|
|
|
|
// SetAutoRenew enables or disables auto renew on the given Domain
|
|
func (g *Domain) SetAutoRenew(domain string, autorenew bool) (err error) {
|
|
_, err = g.client.Patch("domains/"+domain+"/autorenew", AutoRenew{Enabled: &autorenew}, nil)
|
|
return
|
|
}
|