Files
coredns-netbox-plugin-dns/internal/netbox/record.go
T
2024-05-06 17:43:25 -06:00

100 lines
1.9 KiB
Go

package netbox
import (
"net/url"
"strconv"
)
type Record struct {
Type string `json:"type"`
Value string `json:"value"`
TTL *uint32 `json:"ttl"`
Zone Zone `json:"zone"`
FQDN string `json:"fqdn"`
}
type RecordQuery struct {
FQDN string
Name string
Type []string
Zone *Zone
}
func (recordQuery *RecordQuery) Encode() string {
out := url.Values{}
if recordQuery.FQDN != "" {
out.Set("fqdn", recordQuery.FQDN)
}
if recordQuery.Name != "" {
out.Set("name", recordQuery.Name)
}
if len(recordQuery.Type) != 0 {
for _, t := range recordQuery.Type {
out.Add("type", t)
}
}
if recordQuery.Zone != nil {
out.Set("zone_id", strconv.Itoa(recordQuery.Zone.ID))
}
return out.Encode()
}
func urlRecords(netboxurl *url.URL) *url.URL {
return netboxurl.JoinPath("records", "/")
}
func GetRecordsQuery(
requestClient *APIRequestClient,
query *RecordQuery,
) ([]Record, error) {
requestUrl := urlRecords(requestClient.NetboxURL)
requestUrl.RawQuery = query.Encode()
records, err := getMany[Record](requestClient, requestUrl.String())
if err != nil {
return nil, err
}
if query.Zone != nil {
for k, record := range records {
if record.TTL == nil {
records[k].TTL = &query.Zone.DefaultTTL
}
}
} else {
resolvedRecords, err := resolveRecordTTLs(requestClient, records)
if err != nil {
return records, err
}
records = resolvedRecords
}
return records, nil
}
func resolveRecordTTLs(
requestClient *APIRequestClient,
records []Record,
) ([]Record, error) {
zoneTTL := make(map[int]uint32)
for k, record := range records {
if record.TTL != nil {
continue
}
if ttl, ok := zoneTTL[record.Zone.ID]; ok {
records[k].TTL = &ttl
continue
}
zoneUrl := urlZoneID(requestClient.NetboxURL, record.Zone.ID)
zone, err := get[Zone](requestClient, zoneUrl.String())
if err != nil {
return records, err
}
zoneTTL[zone.ID] = zone.DefaultTTL
records[k].TTL = &zone.DefaultTTL
}
return records, nil
}