052f89152c
Signed-off-by: Alejandro Mery <amery@jpi.io>
70 lines
1.3 KiB
Go
70 lines
1.3 KiB
Go
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
|
|
}
|