DataHoarder
a6ad95f299
All checks were successful
continuous-integration/drone/push Build is passing
149 lines
2.5 KiB
Go
149 lines
2.5 KiB
Go
package dns_api
|
|
|
|
import "github.com/miekg/dns"
|
|
|
|
type RRSet []dns.RR
|
|
|
|
func (s RRSet) Get(rrt uint16, name string) (rrset RRSet) {
|
|
for _, rr := range s {
|
|
if rr != nil && (rr.Header().Rrtype == rrt || rrt == dns.TypeANY) && (rr.Header().Name == name || name == "") {
|
|
rrset = append(rrset, rr)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s RRSet) Delete(rrt uint16, name string) {
|
|
for i, rr := range s {
|
|
if rr != nil && rr.Header().Rrtype == rrt && rr.Header().Name == name {
|
|
s[i] = nil
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s RRSet) SplitByType() (result []RRSet) {
|
|
|
|
var types []uint16
|
|
|
|
inTypes := func(i uint16) bool {
|
|
for _, j := range types {
|
|
if i == j {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
for _, rr := range s {
|
|
if rr != nil && !inTypes(rr.Header().Rrtype) {
|
|
result = append(result, s.Get(rr.Header().Rrtype, ""))
|
|
types = append(types, rr.Header().Rrtype)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s RRSet) SplitByName() (result []RRSet) {
|
|
var names []string
|
|
|
|
inNames := func(i string) bool {
|
|
for _, j := range names {
|
|
if i == j {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
for _, rr := range s {
|
|
if rr != nil && !inNames(rr.Header().Name) {
|
|
result = append(result, s.Get(dns.TypeANY, rr.Header().Name))
|
|
names = append(names, rr.Header().Name)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s RRSet) NotNil() (result RRSet) {
|
|
result = make(RRSet, 0, len(s))
|
|
for _, rr := range s {
|
|
if rr != nil {
|
|
result = append(result, rr)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s RRSet) RemoveTypes(disallow ...uint16) (result RRSet) {
|
|
|
|
inList := func(i uint16) bool {
|
|
|
|
for _, j := range disallow {
|
|
if i == j {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
for _, rr := range s {
|
|
if rr != nil && !inList(rr.Header().Rrtype) {
|
|
result = append(result, rr)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s RRSet) OnlyTypes(allow ...uint16) (result RRSet) {
|
|
|
|
inList := func(i uint16) bool {
|
|
|
|
for _, j := range allow {
|
|
if i == j {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
for _, rr := range s {
|
|
if rr != nil && inList(rr.Header().Rrtype) {
|
|
result = append(result, rr)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s RRSet) Encode() (result []byte, err error) {
|
|
var off int
|
|
for _, rr := range s {
|
|
buf := make([]byte, dns.Len(rr))
|
|
off, err = dns.PackRR(rr, buf, 0, nil, false)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result = append(result, buf[:off]...)
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func DecodeRRSet(buf []byte) (result RRSet, err error) {
|
|
for len(buf) > 0 {
|
|
rr, off, err := dns.UnpackRR(buf, 0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
buf = buf[off:]
|
|
result = append(result, rr)
|
|
}
|
|
|
|
return result, nil
|
|
}
|