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.
69 lines
1.3 KiB
69 lines
1.3 KiB
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 |
|
}
|
|
|