You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.3 KiB
70 lines
1.3 KiB
1 year ago
|
package dns
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"net/netip"
|
||
|
"os"
|
||
|
"time"
|
||
|
|
||
|
"darvaza.org/core"
|
||
|
"github.com/libdns/libdns"
|
||
|
)
|
||
|
|
||
|
// Add adds a machine to the DNS records
|
||
|
func (mgr *Manager) Add(ctx context.Context, name string, addrs ...netip.Addr) error {
|
||
|
// TODO: validate name
|
||
|
|
||
|
cur, err := mgr.GetRecords(ctx, name)
|
||
|
if err != nil {
|
||
|
return core.Wrap(err, "GetRecords")
|
||
|
}
|
||
|
|
||
|
// merge []SyncAddr for name
|
||
|
s := mgr.asSyncRecordsMap(cur)[name+mgr.suffix]
|
||
|
for _, addr := range addrs {
|
||
|
s = AppendSyncAddr(s, addr)
|
||
|
}
|
||
|
|
||
|
return mgr.addSyncAddr(ctx, name, s)
|
||
|
}
|
||
|
|
||
|
func (mgr *Manager) addSyncAddr(ctx context.Context, name string, s []SyncAddr) error {
|
||
|
var recs []libdns.Record
|
||
|
|
||
|
for _, a := range s {
|
||
|
recs = append(recs, libdns.Record{
|
||
|
ID: a.ID,
|
||
|
Name: name + mgr.suffix,
|
||
|
Type: core.IIf(a.Addr.Is6(), "AAAA", "A"),
|
||
|
TTL: time.Second,
|
||
|
Value: a.Addr.String(),
|
||
|
})
|
||
|
}
|
||
|
|
||
|
SortRecords(recs)
|
||
|
err := writeRecords(recs, os.Stdout)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
_, err = mgr.p.SetRecords(ctx, mgr.domain, recs)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// AppendSyncAddr appends a [netip.Addr] to a [SyncAddr] slice
|
||
|
// if the address is new.
|
||
|
func AppendSyncAddr(s []SyncAddr, addr netip.Addr) []SyncAddr {
|
||
|
for _, se := range s {
|
||
|
if se.Addr.Compare(addr) == 0 {
|
||
|
// found
|
||
|
return s
|
||
|
}
|
||
|
}
|
||
|
|
||
|
s = append(s, SyncAddr{
|
||
|
Addr: addr,
|
||
|
TTL: time.Second,
|
||
|
})
|
||
|
return s
|
||
|
}
|