7 log "github.com/sirupsen/logrus"
9 "github.com/vapor/consensus"
10 "github.com/vapor/errors"
14 errInvalidIP = errors.New("invalid ip address")
15 errDNSTimeout = errors.New("get dns seed timeout")
16 errDNSSeedsEmpty = errors.New("dns seeds is empty")
18 dnsTimeout = 5 * time.Second
21 // QueryDNSSeeds Query the DNS seeds.
22 func QueryDNSSeeds(lookupHost func(host string) (addrs []string, err error)) ([]string, error) {
23 if len(consensus.ActiveNetParams.DNSSeeds) == 0 {
24 return nil, errDNSSeedsEmpty
27 resultCh := make(chan *[]string, 1)
28 for _, dnsSeed := range consensus.ActiveNetParams.DNSSeeds {
29 go queryDNSSeeds(lookupHost, resultCh, dnsSeed, consensus.ActiveNetParams.DefaultPort)
33 case result := <-resultCh:
35 case <-time.After(dnsTimeout):
36 return nil, errDNSTimeout
40 func queryDNSSeeds(lookupHost func(host string) (addrs []string, err error), resultCh chan *[]string, dnsSeed, port string) {
44 addrs, err := lookupHost(dnsSeed)
46 log.WithFields(log.Fields{"module": logModule, "err": err, "dnsSeed": dnsSeed}).Error("fail on look up host")
50 for _, addr := range addrs {
51 if ip := net.ParseIP(addr); ip == nil {
52 log.WithFields(log.Fields{"module": logModule, "err": errInvalidIP, "dnsSeed": dnsSeed}).Error("fail on parse IP")
56 seeds = append(seeds, net.JoinHostPort(addr, port))
61 //if channel is full, drop it
63 case resultCh <- &seeds: