forked from TrueCloudLab/lego
283 lines
8.3 KiB
Go
283 lines
8.3 KiB
Go
package goinwx
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/fatih/structs"
|
|
"github.com/mitchellh/mapstructure"
|
|
)
|
|
|
|
const (
|
|
methodNameserverCheck = "nameserver.check"
|
|
methodNameserverCreate = "nameserver.create"
|
|
methodNameserverCreateRecord = "nameserver.createRecord"
|
|
methodNameserverDelete = "nameserver.delete"
|
|
methodNameserverDeleteRecord = "nameserver.deleteRecord"
|
|
methodNameserverInfo = "nameserver.info"
|
|
methodNameserverList = "nameserver.list"
|
|
methodNameserverUpdate = "nameserver.update"
|
|
methodNameserverUpdateRecord = "nameserver.updateRecord"
|
|
)
|
|
|
|
// NameserverService API access to Nameservers.
|
|
type NameserverService service
|
|
|
|
// Check Checks a domain on nameservers.
|
|
func (s *NameserverService) Check(domain string, nameservers []string) (*NameserverCheckResponse, error) {
|
|
req := s.client.NewRequest(methodNameserverCheck, map[string]interface{}{
|
|
"domain": domain,
|
|
"ns": nameservers,
|
|
})
|
|
|
|
resp, err := s.client.Do(*req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var result NameserverCheckResponse
|
|
err = mapstructure.Decode(*resp, &result)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &result, nil
|
|
}
|
|
|
|
// Info Gets informations.
|
|
func (s *NameserverService) Info(request *NameserverInfoRequest) (*NamserverInfoResponse, error) {
|
|
req := s.client.NewRequest(methodNameserverInfo, structs.Map(request))
|
|
|
|
resp, err := s.client.Do(*req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var result NamserverInfoResponse
|
|
err = mapstructure.Decode(*resp, &result)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &result, nil
|
|
}
|
|
|
|
// List List nameservers for a domain.
|
|
func (s *NameserverService) List(domain string) (*NamserverListResponse, error) {
|
|
requestMap := map[string]interface{}{
|
|
"domain": "*",
|
|
"wide": 2,
|
|
}
|
|
if domain != "" {
|
|
requestMap["domain"] = domain
|
|
}
|
|
req := s.client.NewRequest(methodNameserverList, requestMap)
|
|
|
|
resp, err := s.client.Do(*req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var result NamserverListResponse
|
|
err = mapstructure.Decode(*resp, &result)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &result, nil
|
|
}
|
|
|
|
// Create Creates a namesever.
|
|
func (s *NameserverService) Create(request *NameserverCreateRequest) (int, error) {
|
|
req := s.client.NewRequest(methodNameserverCreate, structs.Map(request))
|
|
|
|
resp, err := s.client.Do(*req)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
var result map[string]int
|
|
err = mapstructure.Decode(*resp, &result)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return result["roId"], nil
|
|
}
|
|
|
|
// CreateRecord Creates a DNS record.
|
|
func (s *NameserverService) CreateRecord(request *NameserverRecordRequest) (int, error) {
|
|
req := s.client.NewRequest(methodNameserverCreateRecord, structs.Map(request))
|
|
|
|
resp, err := s.client.Do(*req)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
var result map[string]int
|
|
err = mapstructure.Decode(*resp, &result)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return result["id"], nil
|
|
}
|
|
|
|
// UpdateRecord Updates a DNS record.
|
|
func (s *NameserverService) UpdateRecord(recID int, request *NameserverRecordRequest) error {
|
|
if request == nil {
|
|
return errors.New("request can't be nil")
|
|
}
|
|
requestMap := structs.Map(request)
|
|
requestMap["id"] = recID
|
|
|
|
req := s.client.NewRequest(methodNameserverUpdateRecord, requestMap)
|
|
|
|
_, err := s.client.Do(*req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// DeleteRecord Deletes a DNS record.
|
|
func (s *NameserverService) DeleteRecord(recID int) error {
|
|
req := s.client.NewRequest(methodNameserverDeleteRecord, map[string]interface{}{
|
|
"id": recID,
|
|
})
|
|
|
|
_, err := s.client.Do(*req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// FindRecordByID Search a DNS record by ID.
|
|
func (s *NameserverService) FindRecordByID(recID int) (*NameserverRecord, *NameserverDomain, error) {
|
|
listResp, err := s.client.Nameservers.List("")
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
for _, domainItem := range listResp.Domains {
|
|
resp, err := s.client.Nameservers.Info(&NameserverInfoRequest{RoID: domainItem.RoID})
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
for _, record := range resp.Records {
|
|
if record.ID == recID {
|
|
return &record, &domainItem, nil
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil, nil, fmt.Errorf("couldn't find INWX Record for id %d", recID)
|
|
|
|
}
|
|
|
|
// NameserverCheckResponse API model.
|
|
type NameserverCheckResponse struct {
|
|
Details []string
|
|
Status string
|
|
}
|
|
|
|
// NameserverRecordRequest API model.
|
|
type NameserverRecordRequest struct {
|
|
RoID int `structs:"roId,omitempty"`
|
|
Domain string `structs:"domain,omitempty"`
|
|
Type string `structs:"type"`
|
|
Content string `structs:"content"`
|
|
Name string `structs:"name,omitempty"`
|
|
TTL int `structs:"ttl,omitempty"`
|
|
Priority int `structs:"prio,omitempty"`
|
|
URLRedirectType string `structs:"urlRedirectType,omitempty"`
|
|
URLRedirectTitle string `structs:"urlRedirectTitle,omitempty"`
|
|
URLRedirectDescription string `structs:"urlRedirectDescription,omitempty"`
|
|
URLRedirectFavIcon string `structs:"urlRedirectFavIcon,omitempty"`
|
|
URLRedirectKeywords string `structs:"urlRedirectKeywords,omitempty"`
|
|
}
|
|
|
|
// NameserverCreateRequest API model.
|
|
type NameserverCreateRequest struct {
|
|
Domain string `structs:"domain"`
|
|
Type string `structs:"type"`
|
|
Nameservers []string `structs:"ns,omitempty"`
|
|
MasterIP string `structs:"masterIp,omitempty"`
|
|
Web string `structs:"web,omitempty"`
|
|
Mail string `structs:"mail,omitempty"`
|
|
SoaEmail string `structs:"soaEmail,omitempty"`
|
|
URLRedirectType string `structs:"urlRedirectType,omitempty"`
|
|
URLRedirectTitle string `structs:"urlRedirectTitle,omitempty"`
|
|
URLRedirectDescription string `structs:"urlRedirectDescription,omitempty"`
|
|
URLRedirectFavIcon string `structs:"urlRedirectFavIcon,omitempty"`
|
|
URLRedirectKeywords string `structs:"urlRedirectKeywords,omitempty"`
|
|
Testing bool `structs:"testing,omitempty"`
|
|
}
|
|
|
|
// NameserverInfoRequest API model.
|
|
type NameserverInfoRequest struct {
|
|
Domain string `structs:"domain,omitempty"`
|
|
RoID int `structs:"roId,omitempty"`
|
|
RecordID int `structs:"recordId,omitempty"`
|
|
Type string `structs:"type,omitempty"`
|
|
Name string `structs:"name,omitempty"`
|
|
Content string `structs:"content,omitempty"`
|
|
TTL int `structs:"ttl,omitempty"`
|
|
Priority int `structs:"prio,omitempty"`
|
|
}
|
|
|
|
// NamserverInfoResponse API model.
|
|
type NamserverInfoResponse struct {
|
|
RoID int `mapstructure:"roId"`
|
|
Domain string `mapstructure:"domain"`
|
|
Type string `mapstructure:"type"`
|
|
MasterIP string `mapstructure:"masterIp"`
|
|
LastZoneCheck time.Time `mapstructure:"lastZoneCheck"`
|
|
SlaveDNS []SlaveInfo `mapstructure:"slaveDns"`
|
|
SOASerial string `mapstructure:"SOAserial"`
|
|
Count int `mapstructure:"count"`
|
|
Records []NameserverRecord `mapstructure:"record"`
|
|
}
|
|
|
|
// SlaveInfo API model.
|
|
type SlaveInfo struct {
|
|
Name string `mapstructure:"name"`
|
|
IP string `mapstructure:"ip"`
|
|
}
|
|
|
|
// NameserverRecord API model.
|
|
type NameserverRecord struct {
|
|
ID int `mapstructure:"id"`
|
|
Name string `mapstructure:"name"`
|
|
Type string `mapstructure:"type"`
|
|
Content string `mapstructure:"content"`
|
|
TTL int `mapstructure:"TTL"`
|
|
Priority int `mapstructure:"prio"`
|
|
URLRedirectType string `mapstructure:"urlRedirectType"`
|
|
URLRedirectTitle string `mapstructure:"urlRedirectTitle"`
|
|
URLRedirectDescription string `mapstructure:"urlRedirectDescription"`
|
|
URLRedirectKeywords string `mapstructure:"urlRedirectKeywords"`
|
|
URLRedirectFavIcon string `mapstructure:"urlRedirectFavIcon"`
|
|
}
|
|
|
|
// NamserverListResponse API model.
|
|
type NamserverListResponse struct {
|
|
Count int
|
|
Domains []NameserverDomain `mapstructure:"domains"`
|
|
}
|
|
|
|
// NameserverDomain API model.
|
|
type NameserverDomain struct {
|
|
RoID int `mapstructure:"roId"`
|
|
Domain string `mapstructure:"domain"`
|
|
Type string `mapstructure:"type"`
|
|
MasterIP string `mapstructure:"masterIp"`
|
|
Mail string `mapstructure:"mail"`
|
|
Web string `mapstructure:"web"`
|
|
URL string `mapstructure:"url"`
|
|
Ipv4 string `mapstructure:"ipv4"`
|
|
Ipv6 string `mapstructure:"ipv6"`
|
|
}
|