Alejandro Mery
1 year ago
4 changed files with 94 additions and 0 deletions
@ -0,0 +1,2 @@ |
|||||||
|
// Package dns manages DNS entries for the cluster
|
||||||
|
package dns |
@ -0,0 +1,89 @@ |
|||||||
|
package dns |
||||||
|
|
||||||
|
import ( |
||||||
|
"bytes" |
||||||
|
"fmt" |
||||||
|
"io" |
||||||
|
"net/netip" |
||||||
|
"sort" |
||||||
|
"time" |
||||||
|
|
||||||
|
"darvaza.org/core" |
||||||
|
"github.com/libdns/libdns" |
||||||
|
) |
||||||
|
|
||||||
|
// SortAddrSlice sorts a slice of [netip.Addr]
|
||||||
|
func SortAddrSlice(s []netip.Addr) []netip.Addr { |
||||||
|
sort.Slice(s, func(i, j int) bool { |
||||||
|
return s[i].Less(s[j]) |
||||||
|
}) |
||||||
|
return s |
||||||
|
} |
||||||
|
|
||||||
|
// SortAddrRecords sorts a slice of [AddrRecord]
|
||||||
|
// by Name and Address
|
||||||
|
func SortAddrRecords(s []AddrRecord) []AddrRecord { |
||||||
|
sort.Slice(s, func(i, j int) bool { |
||||||
|
return s[i].Name < s[j].Name |
||||||
|
}) |
||||||
|
|
||||||
|
for _, p := range s { |
||||||
|
SortAddrSlice(p.Addr) |
||||||
|
} |
||||||
|
|
||||||
|
return s |
||||||
|
} |
||||||
|
|
||||||
|
// AddrRecord represents an A or AAAA record
|
||||||
|
type AddrRecord struct { |
||||||
|
Name string |
||||||
|
Addr []netip.Addr |
||||||
|
} |
||||||
|
|
||||||
|
// Sort sorts the addresses of the record
|
||||||
|
func (rr *AddrRecord) Sort() { |
||||||
|
SortAddrSlice(rr.Addr) |
||||||
|
} |
||||||
|
|
||||||
|
// Export converts the record into libdns.Record
|
||||||
|
func (rr *AddrRecord) Export() []libdns.Record { |
||||||
|
out := make([]libdns.Record, len(rr.Addr)) |
||||||
|
for i, addr := range rr.Addr { |
||||||
|
out[i] = libdns.Record{ |
||||||
|
Name: rr.Name, |
||||||
|
TTL: time.Second * 1, |
||||||
|
Type: core.IIf(addr.Is6(), "AAAA", "A"), |
||||||
|
Value: addr.String(), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return out |
||||||
|
} |
||||||
|
|
||||||
|
// WriteTo writes the record in BIND notation
|
||||||
|
func (rr *AddrRecord) WriteTo(w io.Writer) (int64, error) { |
||||||
|
var total int |
||||||
|
for _, addr := range rr.Addr { |
||||||
|
n, err := fmt.Fprint(w, |
||||||
|
rr.Name, "\t", |
||||||
|
1, "\t", |
||||||
|
core.IIf(addr.Is6(), "AAAA", "A"), "\t", |
||||||
|
addr.String(), "\n") |
||||||
|
|
||||||
|
switch { |
||||||
|
case err != nil: |
||||||
|
return 0, err |
||||||
|
case n > 0: |
||||||
|
total += n |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return int64(total), nil |
||||||
|
} |
||||||
|
|
||||||
|
// String converts the record into BIND entries
|
||||||
|
func (rr *AddrRecord) String() string { |
||||||
|
var buf bytes.Buffer |
||||||
|
_, _ = rr.WriteTo(&buf) |
||||||
|
return buf.String() |
||||||
|
} |
Loading…
Reference in new issue