backtrace/bk/asn.go

156 lines
4.5 KiB
Go
Raw Normal View History

2024-05-01 16:17:44 +08:00
package backtrace
import (
"fmt"
"net"
"strings"
2024-05-22 00:15:44 +08:00
2024-06-24 13:17:54 +08:00
. "github.com/oneclickvirt/defaultset"
2024-05-01 16:17:44 +08:00
)
type Result struct {
i int
s string
}
var (
ips = []string{
2024-05-22 00:15:44 +08:00
// "219.141.136.12", "202.106.50.1",
"219.141.140.10", "202.106.195.68", "221.179.155.161",
2024-05-01 16:17:44 +08:00
"202.96.209.133", "210.22.97.1", "211.136.112.200",
"58.60.188.222", "210.21.196.6", "120.196.165.24",
"61.139.2.69", "119.6.6.6", "211.137.96.205",
}
names = []string{
"北京电信", "北京联通", "北京移动",
"上海电信", "上海联通", "上海移动",
"广州电信", "广州联通", "广州移动",
"成都电信", "成都联通", "成都移动",
}
m = map[string]string{
// [] 前的字符串个数中文占2个字符串
2024-05-01 18:05:54 +08:00
"AS4809a": "电信CN2GIA [精品线路]",
"AS4809b": "电信CN2GT [优质线路]",
2024-05-01 18:04:26 +08:00
"AS4134": "电信163 [普通线路]",
"AS9929": "联通9929 [优质线路]",
"AS4837": "联通4837 [普通线路]",
"AS58807": "移动CMIN2 [精品线路]",
"AS9808": "移动CMI [普通线路]",
"AS58453": "移动CMI [普通线路]",
2024-05-01 16:17:44 +08:00
}
)
func removeDuplicates(elements []string) []string {
encountered := map[string]bool{} // 用于存储已经遇到的元素
result := []string{} // 存储去重后的结果
for v := range elements { // 遍历切片中的元素
if encountered[elements[v]] == true { // 如果该元素已经遇到过
// 存在过就不加入了
} else {
encountered[elements[v]] = true // 将该元素标记为已经遇到
result = append(result, elements[v]) // 将该元素加入到结果切片中
}
}
return result // 返回去重后的结果切片
}
2024-05-22 00:15:44 +08:00
func trace(ch chan Result, i int) {
2024-05-01 16:17:44 +08:00
hops, err := Trace(net.ParseIP(ips[i]))
if err != nil {
s := fmt.Sprintf("%v %-15s %v", names[i], ips[i], err)
ch <- Result{i, s}
return
}
var asns []string
for _, h := range hops {
for _, n := range h.Nodes {
2024-05-22 00:15:44 +08:00
asn := ipAsn(n.IP.String())
2024-05-01 16:17:44 +08:00
if asn != "" {
asns = append(asns, asn)
}
}
}
// 处理CN2不同路线的区别
if asns != nil && len(asns) > 0 {
var tempText string
asns = removeDuplicates(asns)
tempText += fmt.Sprintf("%v ", names[i])
hasAS4134 := false
hasAS4809 := false
for _, asn := range asns {
if asn == "AS4134" {
hasAS4134 = true
}
if asn == "AS4809" {
hasAS4809 = true
}
}
2024-05-02 12:39:22 +08:00
// 判断是否包含 AS4134 和 AS4809
2024-05-01 16:17:44 +08:00
if hasAS4134 && hasAS4809 {
// 同时包含 AS4134 和 AS4809 属于 CN2GT
2024-05-02 12:39:22 +08:00
asns = append([]string{"AS4809b"}, asns...)
2024-05-01 16:17:44 +08:00
} else if hasAS4809 {
// 仅包含 AS4809 属于 CN2GIA
2024-05-02 12:39:22 +08:00
asns = append([]string{"AS4809a"}, asns...)
2024-05-01 16:17:44 +08:00
}
2024-05-01 17:55:11 +08:00
tempText += fmt.Sprintf("%-15s ", ips[i])
2024-05-01 16:17:44 +08:00
for _, asn := range asns {
asnDescription := m[asn]
switch asn {
case "":
continue
2024-05-01 18:01:06 +08:00
case "AS4809": // 被 AS4809a 和 AS4809b 替代了
continue
2024-05-01 16:17:44 +08:00
case "AS9929":
2024-05-01 21:59:45 +08:00
if !strings.Contains(tempText, asnDescription) {
tempText += DarkGreen(asnDescription) + " "
}
2024-05-01 16:17:44 +08:00
case "AS4809a":
2024-05-01 21:59:45 +08:00
if !strings.Contains(tempText, asnDescription) {
tempText += DarkGreen(asnDescription) + " "
}
2024-05-01 16:17:44 +08:00
case "AS4809b":
2024-05-01 21:59:45 +08:00
if !strings.Contains(tempText, asnDescription) {
tempText += Green(asnDescription) + " "
}
2024-05-01 16:17:44 +08:00
case "AS58807":
2024-05-01 21:59:45 +08:00
if !strings.Contains(tempText, asnDescription) {
tempText += Green(asnDescription) + " "
}
2024-05-01 16:17:44 +08:00
default:
2024-05-01 21:59:45 +08:00
if !strings.Contains(tempText, asnDescription) {
tempText += White(asnDescription) + " "
}
2024-05-01 16:17:44 +08:00
}
}
2024-05-02 08:36:19 +08:00
if tempText == (fmt.Sprintf("%v ", names[i]) + fmt.Sprintf("%-15s ", ips[i])) {
tempText += fmt.Sprintf("%v", Red("检测不到已知线路的ASN"))
}
2024-05-01 16:17:44 +08:00
ch <- Result{i, tempText}
} else {
2024-05-02 08:36:19 +08:00
s := fmt.Sprintf("%v %-15s %v", names[i], ips[i], Red("检测不到回程路由节点的IP地址"))
2024-05-01 16:17:44 +08:00
ch <- Result{i, s}
}
}
2024-05-22 00:15:44 +08:00
func ipAsn(ip string) string {
2024-05-01 16:17:44 +08:00
switch {
case strings.HasPrefix(ip, "59.43"):
return "AS4809"
case strings.HasPrefix(ip, "202.97"):
return "AS4134"
case strings.HasPrefix(ip, "218.105") || strings.HasPrefix(ip, "210.51"):
return "AS9929"
case strings.HasPrefix(ip, "219.158"):
return "AS4837"
2024-06-24 13:17:54 +08:00
case strings.HasPrefix(ip, "223.120.19") || strings.HasPrefix(ip, "223.120.17") || strings.HasPrefix(ip, "223.120.16") ||
strings.HasPrefix(ip, "223.120.140") || strings.HasPrefix(ip, "223.120.130") || strings.HasPrefix(ip, "223.120.131") ||
2024-06-02 00:27:23 +08:00
strings.HasPrefix(ip, "223.120.141"):
2024-05-22 00:15:44 +08:00
return "AS58807"
case strings.HasPrefix(ip, "223.118") || strings.HasPrefix(ip, "223.119") || strings.HasPrefix(ip, "223.120") || strings.HasPrefix(ip, "223.121"):
2024-05-01 16:17:44 +08:00
return "AS58453"
default:
return ""
}
}