jpictl/dns: introduce add command to register new machines
Signed-off-by: Alejandro Mery <amery@jpi.io>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user