mirror of
https://github.com/oneclickvirt/backtrace.git
synced 2025-08-03 14:16:57 +08:00
fix: 修复类型分配
This commit is contained in:
parent
a36c3eff82
commit
bf0dc1c95f
@ -30,7 +30,7 @@ type Upstream struct {
|
|||||||
Name string
|
Name string
|
||||||
Direct bool
|
Direct bool
|
||||||
Tier1 bool
|
Tier1 bool
|
||||||
Type string // 新增类型字段
|
Type string
|
||||||
}
|
}
|
||||||
|
|
||||||
type PoPResult struct {
|
type PoPResult struct {
|
||||||
@ -39,6 +39,8 @@ type PoPResult struct {
|
|||||||
Result string
|
Result string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// === 分类映射 ===
|
||||||
|
|
||||||
var tier1Global = map[string]string{
|
var tier1Global = map[string]string{
|
||||||
"174": "Cogent",
|
"174": "Cogent",
|
||||||
"1299": "Arelion",
|
"1299": "Arelion",
|
||||||
@ -57,6 +59,42 @@ var tier1Global = map[string]string{
|
|||||||
"12956": "Telxius",
|
"12956": "Telxius",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var tier1Regional = map[string]string{
|
||||||
|
"4134": "ChinaNet",
|
||||||
|
"4837": "China Unicom",
|
||||||
|
"9808": "China Mobile",
|
||||||
|
"4766": "Korea Telecom",
|
||||||
|
"2516": "KDDI",
|
||||||
|
"7713": "Telkomnet",
|
||||||
|
"9121": "Etisalat",
|
||||||
|
}
|
||||||
|
|
||||||
|
var tier2 = map[string]string{
|
||||||
|
"6939": "Hurricane Electric",
|
||||||
|
"20485": "Transtelecom",
|
||||||
|
"1273": "Vodafone",
|
||||||
|
"1239": "Sprint",
|
||||||
|
"6762": "Sparkle",
|
||||||
|
"6453": "Tata",
|
||||||
|
}
|
||||||
|
|
||||||
|
var contentProviders = map[string]string{
|
||||||
|
"15169": "Google",
|
||||||
|
"32934": "Facebook",
|
||||||
|
"54113": "Fastly",
|
||||||
|
"20940": "Akamai",
|
||||||
|
"13335": "Cloudflare",
|
||||||
|
}
|
||||||
|
|
||||||
|
var ixps = map[string]string{
|
||||||
|
"5539": "IX.br",
|
||||||
|
"25291": "HKIX",
|
||||||
|
"1200": "AMS-IX",
|
||||||
|
"6695": "DE-CIX",
|
||||||
|
}
|
||||||
|
|
||||||
|
// === 工具函数 ===
|
||||||
|
|
||||||
func getISPAbbr(asn, name string) string {
|
func getISPAbbr(asn, name string) string {
|
||||||
if abbr, ok := tier1Global[asn]; ok {
|
if abbr, ok := tier1Global[asn]; ok {
|
||||||
return abbr
|
return abbr
|
||||||
@ -68,13 +106,20 @@ func getISPAbbr(asn, name string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getISPType(asn string, tier1 bool) string {
|
func getISPType(asn string, tier1 bool) string {
|
||||||
if tier1 {
|
switch {
|
||||||
if _, ok := tier1Global[asn]; ok {
|
case tier1 && tier1Global[asn] != "":
|
||||||
return "Tier1 Global"
|
return "Tier1 Global"
|
||||||
}
|
case tier1Regional[asn] != "":
|
||||||
return "Tier1 Regional"
|
return "Tier1 Regional"
|
||||||
|
case tier2[asn] != "":
|
||||||
|
return "Tier2"
|
||||||
|
case contentProviders[asn] != "":
|
||||||
|
return "CDN Provider"
|
||||||
|
case ixps[asn] != "":
|
||||||
|
return "IXP"
|
||||||
|
default:
|
||||||
|
return "Direct"
|
||||||
}
|
}
|
||||||
return "Direct"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func isValidIP(ip string) bool {
|
func isValidIP(ip string) bool {
|
||||||
@ -229,14 +274,36 @@ func GetPoPInfo(ip string) (*PoPResult, error) {
|
|||||||
return nil, fmt.Errorf("无法识别目标 ASN")
|
return nil, fmt.Errorf("无法识别目标 ASN")
|
||||||
}
|
}
|
||||||
upstreams := findUpstreams(targetASN, nodes, edges)
|
upstreams := findUpstreams(targetASN, nodes, edges)
|
||||||
var result string
|
if len(upstreams) > 5 {
|
||||||
|
upstreams = upstreams[:5]
|
||||||
|
}
|
||||||
|
colWidth := 16
|
||||||
|
center := func(s string) string {
|
||||||
|
runeLen := len([]rune(s))
|
||||||
|
if runeLen >= colWidth {
|
||||||
|
return s[:colWidth]
|
||||||
|
}
|
||||||
|
padding := colWidth - runeLen
|
||||||
|
left := padding / 2
|
||||||
|
right := padding - left
|
||||||
|
return strings.Repeat(" ", left) + s + strings.Repeat(" ", right)
|
||||||
|
}
|
||||||
|
var line1, line2, line3 []string
|
||||||
for _, u := range upstreams {
|
for _, u := range upstreams {
|
||||||
abbr := getISPAbbr(u.ASN, u.Name)
|
abbr := getISPAbbr(u.ASN, u.Name)
|
||||||
result += fmt.Sprintf("AS%s - %s [%s]\n", u.ASN, abbr, u.Type)
|
line1 = append(line1, center("AS"+u.ASN))
|
||||||
|
line2 = append(line2, center(abbr))
|
||||||
|
line3 = append(line3, center(u.Type))
|
||||||
}
|
}
|
||||||
|
var result strings.Builder
|
||||||
|
result.WriteString(strings.Join(line1, ""))
|
||||||
|
result.WriteString("\n")
|
||||||
|
result.WriteString(strings.Join(line2, ""))
|
||||||
|
result.WriteString("\n")
|
||||||
|
result.WriteString(strings.Join(line3, ""))
|
||||||
return &PoPResult{
|
return &PoPResult{
|
||||||
TargetASN: targetASN,
|
TargetASN: targetASN,
|
||||||
Upstreams: upstreams,
|
Upstreams: upstreams,
|
||||||
Result: result,
|
Result: result.String(),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user