79 lines
1.5 KiB
Go
79 lines
1.5 KiB
Go
package dnsexit_manager
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"strconv"
|
|
"strings"
|
|
|
|
dns "git.uoc.run.place/OxFF/dns-manager"
|
|
dns_req "github.com/miekg/dns"
|
|
)
|
|
|
|
func (c *client) getNSRecods() (error, *[]string) {
|
|
var nameservers []string
|
|
|
|
ns, err := net.LookupNS(c.Domain)
|
|
if err != nil {
|
|
return err, nil
|
|
}
|
|
|
|
for _, v := range ns {
|
|
nameservers = append(nameservers, v.Host[:len(v.Host)-1]+":53")
|
|
}
|
|
|
|
return nil, &nameservers
|
|
}
|
|
|
|
func parse_record(record dns_req.RR) (error, *dns.Record) {
|
|
splitted := strings.SplitN(record.String(), "\t", -1)
|
|
|
|
if len(splitted) == 5 {
|
|
var parsed dns.Record
|
|
rec_type := dns.RecordType(splitted[3])
|
|
|
|
if !rec_type.Check() {
|
|
return errors.New("provided DNS type is not exist in the main library"), nil
|
|
}
|
|
|
|
parsed.Type = rec_type
|
|
ttl, _ := strconv.ParseUint(splitted[1], 10, 64)
|
|
|
|
parsed.Name = splitted[0]
|
|
parsed.Content = splitted[4]
|
|
parsed.TTL = uint(ttl)
|
|
|
|
return nil, &parsed
|
|
}
|
|
|
|
return errors.New("no meaningful record provided"), nil
|
|
}
|
|
|
|
func find_dns_records(domain string, nameserver string) (error, []*dns.Record) {
|
|
var subdomains []*dns.Record
|
|
|
|
tr := new(dns_req.Transfer)
|
|
m := new(dns_req.Msg)
|
|
m.SetAxfr(domain + ".")
|
|
|
|
client, err := tr.In(m, nameserver)
|
|
if err != nil {
|
|
return errors.New("failed to zone transfer in " + err.Error()), nil
|
|
}
|
|
|
|
for msg := range client {
|
|
if msg.Error != nil {
|
|
return msg.Error, nil
|
|
}
|
|
|
|
for _, r := range msg.RR {
|
|
err, record := parse_record(r)
|
|
if err == nil {
|
|
subdomains = append(subdomains, record)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil, subdomains
|
|
}
|