mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 21:50:28 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package utils
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"net"
 | 
						|
	"regexp"
 | 
						|
	"sync"
 | 
						|
	"time"
 | 
						|
 | 
						|
	dig "github.com/TeaOSLab/EdgeCommon/pkg/utils"
 | 
						|
	"golang.org/x/net/idna"
 | 
						|
)
 | 
						|
 | 
						|
func stringInSlice(str string, slice []string) bool {
 | 
						|
	for _, s := range slice {
 | 
						|
		if s == str {
 | 
						|
			return true
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return false
 | 
						|
}
 | 
						|
 | 
						|
func DnsCheck(domains []string, nodeIps []string) map[string]bool {
 | 
						|
	var wg sync.WaitGroup
 | 
						|
	ipMap := &sync.Map{}
 | 
						|
	concurrent := 10
 | 
						|
	counter := make(chan struct{}, concurrent)
 | 
						|
 | 
						|
	for _, domain := range domains {
 | 
						|
		counter <- struct{}{}
 | 
						|
		wg.Add(1)
 | 
						|
		go func(domain string) {
 | 
						|
			defer func() {
 | 
						|
				<-counter
 | 
						|
				wg.Done()
 | 
						|
			}()
 | 
						|
			// 中文域名转换
 | 
						|
			if !regexp.MustCompile(`^[a-zA-Z0-9-.]+$`).MatchString(domain) {
 | 
						|
				unicodeDomain, err := idna.ToASCII(domain)
 | 
						|
				if err == nil && len(unicodeDomain) > 0 {
 | 
						|
					domain = unicodeDomain
 | 
						|
				}
 | 
						|
			}
 | 
						|
			dnsIps, err := dig.DigTraceIP(domain)
 | 
						|
			if err != nil || len(dnsIps) < 1 {
 | 
						|
				ipMap.Store(domain, false)
 | 
						|
			} else {
 | 
						|
				var flag = false
 | 
						|
				for _, ip := range dnsIps{
 | 
						|
					flag = stringInSlice(ip, nodeIps)
 | 
						|
					if flag {
 | 
						|
						break
 | 
						|
					}
 | 
						|
				}
 | 
						|
				ipMap.Store(domain, flag)
 | 
						|
			}
 | 
						|
 | 
						|
		}(domain)
 | 
						|
	}
 | 
						|
 | 
						|
	wg.Wait()
 | 
						|
 | 
						|
	resultMap := make(map[string]bool)
 | 
						|
	ipMap.Range(func(key, value interface{}) bool {
 | 
						|
		resultMap[key.(string)] = value.(bool)
 | 
						|
		return true
 | 
						|
	})
 | 
						|
 | 
						|
	return resultMap
 | 
						|
}
 | 
						|
 | 
						|
func LookupIPWithTimeout(domain string, timeoutMS int64) ([]string, error) {
 | 
						|
	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*time.Duration(timeoutMS))
 | 
						|
	defer cancel()
 | 
						|
	r := net.DefaultResolver
 | 
						|
	ips, err := r.LookupHost(ctx, domain)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	return ips, nil
 | 
						|
}
 |