93 lines
1.8 KiB
Go
93 lines
1.8 KiB
Go
package vultr
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/libdns/libdns"
|
|
"github.com/vultr/govultr/v3"
|
|
)
|
|
|
|
type VultrRecord struct {
|
|
Record libdns.RR
|
|
ID string
|
|
}
|
|
|
|
func (r VultrRecord) RR() libdns.RR {
|
|
return r.Record
|
|
}
|
|
|
|
// Converts a govultr.DomainRecord to libdns.Record
|
|
// Taken from libdns/digitalocean
|
|
func fromAPIRecord(r govultr.DomainRecord, zone string) VultrRecord {
|
|
name := libdns.RelativeName(r.Name, zone)
|
|
ttl := time.Duration(r.TTL) * time.Second
|
|
|
|
// Vultr uses a custom priority field for MX and SRV records
|
|
data := r.Data
|
|
if r.Type == "MX" || r.Type == "SRV" {
|
|
data = fmt.Sprintf("%d %s", r.Priority, r.Data)
|
|
}
|
|
|
|
return VultrRecord{
|
|
Record: libdns.RR{
|
|
Name: name,
|
|
TTL: ttl,
|
|
Type: r.Type,
|
|
Data: data,
|
|
},
|
|
ID: r.ID,
|
|
}
|
|
}
|
|
|
|
// Converts a libdns.Record to VultrRecord with an optional ID
|
|
func fromLibdnsRecord(r libdns.Record, id string) VultrRecord {
|
|
rr := r.RR()
|
|
return VultrRecord{
|
|
Record: rr,
|
|
ID: id,
|
|
}
|
|
}
|
|
|
|
// Converts a libdns.Record to a govultr.DomainRecordReq
|
|
func toDomainRecordReq(r libdns.Record) govultr.DomainRecordReq {
|
|
data := r.RR().Data
|
|
var priority int
|
|
|
|
// Vultr uses a custom priority field for MX and SRV records
|
|
if rec, ok := r.RR().Parse(); ok == nil {
|
|
if r.RR().Type == "MX" {
|
|
mx := rec.(libdns.MX)
|
|
priority = int(mx.Preference)
|
|
data = mx.Target
|
|
} else if r.RR().Type == "SRV" {
|
|
srv := rec.(libdns.SRV)
|
|
priority = int(srv.Priority)
|
|
data = data[strings.Index(data, " ")+1:]
|
|
}
|
|
}
|
|
|
|
rr := r.RR()
|
|
return govultr.DomainRecordReq{
|
|
Name: rr.Name,
|
|
Type: rr.Type,
|
|
TTL: int(rr.TTL.Seconds()),
|
|
Data: data,
|
|
Priority: &priority,
|
|
}
|
|
}
|
|
|
|
func getRecordId(r libdns.Record) (string, error) {
|
|
var id string
|
|
if vr, err := r.(VultrRecord); err {
|
|
id = vr.ID
|
|
}
|
|
|
|
if id == "" {
|
|
return "", fmt.Errorf("record has no ID: %v", r)
|
|
}
|
|
|
|
return id, nil
|
|
}
|