Compare commits
2 Commits
v0.6.9
...
36347abaab
| Author | SHA1 | Date | |
|---|---|---|---|
| 36347abaab | |||
| 7dac96f474 |
@@ -38,6 +38,47 @@ func SortAddrRecords(s []AddrRecord) []AddrRecord {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SortRecords sorts a slice of [libdns.Record], by Name, Type and Value
|
||||||
|
func SortRecords(s []libdns.Record) []libdns.Record {
|
||||||
|
sort.Slice(s, func(i, j int) bool {
|
||||||
|
return lessRecord(s[i], s[j])
|
||||||
|
})
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func lessRecord(a, b libdns.Record) bool {
|
||||||
|
switch {
|
||||||
|
case a.Name < b.Name:
|
||||||
|
return true
|
||||||
|
case a.Name > b.Name:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case a.Type < b.Type:
|
||||||
|
return true
|
||||||
|
case a.Type > b.Type:
|
||||||
|
return false
|
||||||
|
case a.Type == "A", a.Type == "AAAA":
|
||||||
|
// IP Addresses
|
||||||
|
var aa, ba netip.Addr
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case aa.UnmarshalText([]byte(a.Value)) != nil:
|
||||||
|
// bad address on a
|
||||||
|
return true
|
||||||
|
case ba.UnmarshalText([]byte(b.Value)) != nil:
|
||||||
|
// bad address on b
|
||||||
|
return false
|
||||||
|
default:
|
||||||
|
return aa.Less(ba)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
// text
|
||||||
|
return a.Value < b.Value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SortRegions sorts regions. first by length those 3-character
|
// SortRegions sorts regions. first by length those 3-character
|
||||||
// or shorter, and then by length. It's mostly aimed at
|
// or shorter, and then by length. It's mostly aimed at
|
||||||
// supporting ISO-3166 order
|
// supporting ISO-3166 order
|
||||||
|
|||||||
+34
-8
@@ -1,29 +1,55 @@
|
|||||||
package dns
|
package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"darvaza.org/core"
|
"darvaza.org/core"
|
||||||
|
"github.com/libdns/libdns"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Show shows current DNS entries
|
// Show shows current DNS entries
|
||||||
func (mgr *Manager) Show(ctx context.Context, names ...string) error {
|
func (mgr *Manager) Show(ctx context.Context, names ...string) error {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
recs, err := mgr.GetRecords(ctx, names...)
|
recs, err := mgr.GetRecords(ctx, names...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return core.Wrap(err, "GetRecords")
|
return core.Wrap(err, "GetRecords")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SortRecords(recs)
|
||||||
|
|
||||||
for _, rr := range recs {
|
for _, rr := range recs {
|
||||||
_, _ = fmt.Printf("%s\t%v\tIN\t%s\t%s\t; %s\n",
|
_ = fmtRecord(&buf, rr)
|
||||||
rr.Name,
|
_, _ = buf.WriteRune('\n')
|
||||||
int(rr.TTL/time.Second),
|
}
|
||||||
rr.Type,
|
_, _ = fmt.Fprintf(&buf, "; %v records\n", len(recs))
|
||||||
rr.Value,
|
|
||||||
rr.ID)
|
_, err = buf.WriteTo(os.Stdout)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func fmtRecord(w io.Writer, rr libdns.Record) error {
|
||||||
|
ttl := int(rr.TTL / time.Second)
|
||||||
|
if ttl < 1 {
|
||||||
|
ttl = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _ = fmt.Printf("; %v records\n", len(recs))
|
_, err := fmt.Fprintf(w, "%s\t%v\tIN\t%s\t%s",
|
||||||
return nil
|
rr.Name,
|
||||||
|
ttl,
|
||||||
|
rr.Type,
|
||||||
|
rr.Value)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
if rr.ID != "" {
|
||||||
|
_, err = fmt.Fprintf(w, "\t; %s", rr.ID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user