mirror of
https://github.com/oneclickvirt/backtrace.git
synced 2025-04-21 19:52:07 +08:00
fix: 请求的缓存结果移动并复用
This commit is contained in:
parent
0c7727e3dc
commit
211c724509
@ -8,6 +8,13 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func BackTrace(enableIpv6 bool) {
|
func BackTrace(enableIpv6 bool) {
|
||||||
|
if model.CachedIcmpData == "" || model.ParsedIcmpTargets == nil || time.Since(model.CachedIcmpDataFetchTime) > time.Hour {
|
||||||
|
model.CachedIcmpData = getData(model.IcmpTargets)
|
||||||
|
model.CachedIcmpDataFetchTime = time.Now()
|
||||||
|
if model.CachedIcmpData != "" {
|
||||||
|
model.ParsedIcmpTargets = parseIcmpTargets(model.CachedIcmpData)
|
||||||
|
}
|
||||||
|
}
|
||||||
if enableIpv6 {
|
if enableIpv6 {
|
||||||
ipv4Count := len(model.Ipv4s)
|
ipv4Count := len(model.Ipv4s)
|
||||||
ipv6Count := len(model.Ipv6s)
|
ipv6Count := len(model.Ipv6s)
|
||||||
|
31
bk/utils.go
31
bk/utils.go
@ -17,19 +17,6 @@ type Result struct {
|
|||||||
s string
|
s string
|
||||||
}
|
}
|
||||||
|
|
||||||
// IcmpTarget 定义ICMP目标的JSON结构
|
|
||||||
type IcmpTarget struct {
|
|
||||||
Province string `json:"province"`
|
|
||||||
ISP string `json:"isp"`
|
|
||||||
IPVersion string `json:"ip_version"`
|
|
||||||
IPs string `json:"ips"` // IP列表,以逗号分隔
|
|
||||||
}
|
|
||||||
|
|
||||||
// 用于缓存ICMP数据的全局变量
|
|
||||||
var cachedIcmpData string
|
|
||||||
var cachedIcmpDataFetchTime time.Time
|
|
||||||
var parsedIcmpTargets []IcmpTarget
|
|
||||||
|
|
||||||
func removeDuplicates(elements []string) []string {
|
func removeDuplicates(elements []string) []string {
|
||||||
encountered := map[string]bool{} // 用于存储已经遇到的元素
|
encountered := map[string]bool{} // 用于存储已经遇到的元素
|
||||||
result := []string{} // 存储去重后的结果
|
result := []string{} // 存储去重后的结果
|
||||||
@ -80,14 +67,14 @@ func getData(endpoint string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// parseIcmpTargets 解析ICMP目标数据
|
// parseIcmpTargets 解析ICMP目标数据
|
||||||
func parseIcmpTargets(jsonData string) []IcmpTarget {
|
func parseIcmpTargets(jsonData string) []model.IcmpTarget {
|
||||||
// 确保JSON数据格式正确,如果返回的是数组,需要添加[和]
|
// 确保JSON数据格式正确,如果返回的是数组,需要添加[和]
|
||||||
if !strings.HasPrefix(jsonData, "[") {
|
if !strings.HasPrefix(jsonData, "[") {
|
||||||
jsonData = "[" + jsonData + "]"
|
jsonData = "[" + jsonData + "]"
|
||||||
}
|
}
|
||||||
// 如果JSON数据中的对象没有正确用逗号分隔,修复它
|
// 如果JSON数据中的对象没有正确用逗号分隔,修复它
|
||||||
jsonData = strings.ReplaceAll(jsonData, "}{", "},{")
|
jsonData = strings.ReplaceAll(jsonData, "}{", "},{")
|
||||||
var targets []IcmpTarget
|
var targets []model.IcmpTarget
|
||||||
err := json.Unmarshal([]byte(jsonData), &targets)
|
err := json.Unmarshal([]byte(jsonData), &targets)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if model.EnableLoger {
|
if model.EnableLoger {
|
||||||
@ -100,17 +87,7 @@ func parseIcmpTargets(jsonData string) []IcmpTarget {
|
|||||||
|
|
||||||
// tryAlternativeIPs 从IcmpTargets获取备选IP地址
|
// tryAlternativeIPs 从IcmpTargets获取备选IP地址
|
||||||
func tryAlternativeIPs(targetName string, ipVersion string) []string {
|
func tryAlternativeIPs(targetName string, ipVersion string) []string {
|
||||||
if cachedIcmpData == "" || parsedIcmpTargets == nil || time.Since(cachedIcmpDataFetchTime) > time.Hour {
|
if model.ParsedIcmpTargets == nil || (model.ParsedIcmpTargets != nil && len(model.ParsedIcmpTargets) == 0) {
|
||||||
cachedIcmpData = getData(model.IcmpTargets)
|
|
||||||
cachedIcmpDataFetchTime = time.Now()
|
|
||||||
if cachedIcmpData != "" {
|
|
||||||
parsedIcmpTargets = parseIcmpTargets(cachedIcmpData)
|
|
||||||
}
|
|
||||||
if model.EnableLoger {
|
|
||||||
Logger.Info("Fetched new ICMP targets data")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if parsedIcmpTargets == nil || len(parsedIcmpTargets) == 0 {
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// 从目标名称中提取省份和ISP信息
|
// 从目标名称中提取省份和ISP信息
|
||||||
@ -137,7 +114,7 @@ func tryAlternativeIPs(targetName string, ipVersion string) []string {
|
|||||||
}
|
}
|
||||||
// 查找匹配条件的目标
|
// 查找匹配条件的目标
|
||||||
var result []string
|
var result []string
|
||||||
for _, target := range parsedIcmpTargets {
|
for _, target := range model.ParsedIcmpTargets {
|
||||||
// 检查省份是否匹配(可能带有"省"字或不带)
|
// 检查省份是否匹配(可能带有"省"字或不带)
|
||||||
provinceMatch := (target.Province == targetProvince) || (target.Province == targetProvince+"省")
|
provinceMatch := (target.Province == targetProvince) || (target.Province == targetProvince+"省")
|
||||||
// 检查ISP和IP版本是否匹配
|
// 检查ISP和IP版本是否匹配
|
||||||
|
@ -1,9 +1,19 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
const BackTraceVersion = "v0.0.5"
|
const BackTraceVersion = "v0.0.5"
|
||||||
|
|
||||||
var EnableLoger = false
|
var EnableLoger = false
|
||||||
|
|
||||||
|
// IcmpTarget 定义ICMP目标的JSON结构
|
||||||
|
type IcmpTarget struct {
|
||||||
|
Province string `json:"province"`
|
||||||
|
ISP string `json:"isp"`
|
||||||
|
IPVersion string `json:"ip_version"`
|
||||||
|
IPs string `json:"ips"` // IP列表,以逗号分隔
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
IcmpTargets = "https://raw.githubusercontent.com/spiritLHLS/icmp_targets/refs/heads/main/nodes.json"
|
IcmpTargets = "https://raw.githubusercontent.com/spiritLHLS/icmp_targets/refs/heads/main/nodes.json"
|
||||||
CdnList = []string{
|
CdnList = []string{
|
||||||
@ -62,4 +72,7 @@ var (
|
|||||||
"AS9808": "移动CMI [普通线路]",
|
"AS9808": "移动CMI [普通线路]",
|
||||||
"AS58453": "移动CMI [普通线路]",
|
"AS58453": "移动CMI [普通线路]",
|
||||||
}
|
}
|
||||||
|
CachedIcmpData string
|
||||||
|
CachedIcmpDataFetchTime time.Time
|
||||||
|
ParsedIcmpTargets []IcmpTarget
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user