Only test for ipv6 if network supports it

This commit is contained in:
Ben Adrian Sarmiento
2024-08-25 13:29:50 +02:00
parent f5cbf150ef
commit 11e9c5d431
3 changed files with 92 additions and 94 deletions

View File

@@ -11,9 +11,12 @@ import (
"net/url"
"os"
"sort"
"strings"
"sync"
"time"
"github.com/debridmediamanager/zurg/pkg/logutil"
"github.com/panjf2000/ants/v2"
)
type IPRepository struct {
@@ -89,6 +92,7 @@ func (r *IPRepository) GetHosts(numberOfHosts int, ipv6 bool) []string {
kvList = append(kvList, kv{k, v})
}
// Sort by latency from lowest to highest
sort.Slice(kvList, func(i, j int) bool {
return kvList[i].Value < kvList[j].Value
})
@@ -105,98 +109,78 @@ func (r *IPRepository) GetHosts(numberOfHosts int, ipv6 bool) []string {
}
func (r *IPRepository) runLatencyTest() {
limit := 99
start := 0
for {
lastDomainsWorked := false
for i := start; i <= limit; i++ {
// EU servers
ipv4Domain := fmt.Sprintf("%d-4.download.real-debrid.com", i)
ipv6Domain := fmt.Sprintf("%d-6.download.real-debrid.com", i)
var wg sync.WaitGroup
ipv6Enabled := false
if r.canConnectToIPv6() {
r.log.Info("Your network supports IPv6")
ipv6Enabled = true
} else {
r.log.Info("Your network does not support IPv6")
}
ips, err := net.LookupIP(ipv4Domain)
if err != nil || len(ips) == 0 {
continue
p, _ := ants.NewPoolWithFunc(8, func(h interface{}) {
defer wg.Done()
host := h.(string)
ips, err := net.LookupIP(host)
if err == nil && len(ips) > 0 {
latency, err := r.testDomainLatency(r.ipv4client, host)
if err == nil {
r.ipv4latencyMap[host] = latency
r.log.Debugf("Latency from ipv4 %s: %.5f seconds", host, latency)
}
latency, err := r.testDomainLatency(r.ipv4client, ipv4Domain)
if err == nil {
r.ipv4latencyMap[ipv4Domain] = latency
r.log.Debugf("Latency from ipv4 %s: %.5f seconds", ipv4Domain, latency)
if i >= limit-2 {
lastDomainsWorked = true
if ipv6Enabled {
latency, err = r.testDomainLatency(r.ipv6client, host)
if err == nil {
r.ipv6latencyMap[host] = latency
r.log.Debugf("Latency from ipv6 %s: %.5f seconds", host, latency)
}
}
latency, err = r.testDomainLatency(r.ipv6client, ipv6Domain)
if err == nil {
r.ipv6latencyMap[ipv6Domain] = latency
r.log.Debugf("Latency from ipv6 %s: %.5f seconds", ipv6Domain, latency)
if i >= limit-2 {
lastDomainsWorked = true
if strings.HasSuffix(host, ".download.real-debrid.com") {
ipv4Host := strings.Replace(host, ".download.real-debrid.com", "-4.download.real-debrid.com", 1)
latency, err := r.testDomainLatency(r.ipv4client, ipv4Host)
if err == nil {
r.ipv4latencyMap[ipv4Host] = latency
r.log.Debugf("Latency from ipv4 %s: %.5f seconds", ipv4Host, latency)
}
}
// EU servers (old)
ipv4Domain = fmt.Sprintf("%d.download.real-debrid.com", i)
ipv6Domain = fmt.Sprintf("%d.download.real-debrid.com", i)
ips, err = net.LookupIP(ipv4Domain)
if err != nil || len(ips) == 0 {
continue
}
latency, err = r.testDomainLatency(r.ipv4client, ipv4Domain)
if err == nil {
r.ipv4latencyMap[ipv4Domain] = latency
r.log.Debugf("Latency from ipv4 %s: %.5f seconds", ipv4Domain, latency)
if i >= limit-2 {
lastDomainsWorked = true
}
}
latency, err = r.testDomainLatency(r.ipv6client, ipv6Domain)
if err == nil {
r.ipv6latencyMap[ipv6Domain] = latency
r.log.Debugf("Latency from ipv6 %s: %.5f seconds", ipv6Domain, latency)
if i >= limit-2 {
lastDomainsWorked = true
}
}
// Cloudflare servers
ipv4Domain = fmt.Sprintf("%d.download.real-debrid.cloud", i)
ipv6Domain = fmt.Sprintf("%d.download.real-debrid.cloud", i)
ips, err = net.LookupIP(ipv4Domain)
if err != nil || len(ips) == 0 {
continue
}
latency, err = r.testDomainLatency(r.ipv4client, ipv4Domain)
if err == nil {
r.ipv4latencyMap[ipv4Domain] = latency
r.log.Debugf("Latency from ipv4 %s: %.5f seconds", ipv4Domain, latency)
if i >= limit-2 {
lastDomainsWorked = true
}
}
latency, err = r.testDomainLatency(r.ipv6client, ipv6Domain)
if err == nil {
r.ipv6latencyMap[ipv6Domain] = latency
r.log.Debugf("Latency from ipv6 %s: %.5f seconds", ipv6Domain, latency)
if i >= limit-2 {
lastDomainsWorked = true
if ipv6Enabled {
ipv6Host := strings.Replace(host, ".download.real-debrid.com", "-6.download.real-debrid.com", 1)
latency, err = r.testDomainLatency(r.ipv6client, ipv6Host)
if err == nil {
r.ipv6latencyMap[ipv6Host] = latency
r.log.Debugf("Latency from ipv6 %s: %.5f seconds", ipv6Host, latency)
}
}
}
}
if lastDomainsWorked {
start = limit + 1
limit += 10
} else {
break
}
})
defer p.Release()
for i := 1; i <= 99; i++ {
wg.Add(2)
_ = p.Invoke(fmt.Sprintf("%d.download.real-debrid.com", i))
_ = p.Invoke(fmt.Sprintf("%d.download.real-debrid.cloud", i))
}
// for i := 'a'; i <= 'z'; i++ {
// for j := 'a'; j <= 'z'; j++ {
// for k := 'a'; k <= 'z'; k++ {
// wg.Add(2)
// _ = p.Invoke(fmt.Sprintf("%c%c%c.download.real-debrid.com", i, j, k))
// _ = p.Invoke(fmt.Sprintf("%c%c%c1.download.real-debrid.com", i, j, k))
// }
// }
// }
wg.Wait()
r.log.Infof("Found %d ipv4 hosts", len(r.ipv4latencyMap))
if ipv6Enabled {
r.log.Infof("Found %d ipv6 hosts", len(r.ipv6latencyMap))
}
}
@@ -285,3 +269,18 @@ func (r *IPRepository) writeLatencyFile(latencyFile string, data interface{}) {
return
}
}
func (r *IPRepository) canConnectToIPv6() bool {
address := "[2001:4860:4860::8888]:53" // Google Public DNS IPv6 address on port 53
timeout := 5 * time.Second // Timeout duration
conn, err := net.DialTimeout("tcp6", address, timeout)
if err != nil {
fmt.Printf("Failed to connect to IPv6 address %s: %v\n", address, err)
return false
}
defer conn.Close()
fmt.Printf("Successfully connected to IPv6 address %s\n", address)
return true
}