diff --git a/fast_trace/basic.go b/fast_trace/basic.go new file mode 100644 index 0000000..cab1034 --- /dev/null +++ b/fast_trace/basic.go @@ -0,0 +1,111 @@ +package fastTrace + +type AllLocationCollection struct { + Beijing BackBoneCollection + Shanghai BackBoneCollection + Guangzhou BackBoneCollection +} + +type BackBoneCollection struct { + Location string + CT163 ISPCollection + CTCN2 ISPCollection + CU169 ISPCollection + CU9929 ISPCollection + CM ISPCollection + EDU ISPCollection +} + +type ISPCollection struct { + ISPName string + IP string +} + +const ( + CT163 string = "电信 163 AS4134" + CTCN2 string = "电信 CN2 AS4809" + CU169 string = "联通 169 AS4837" + CU9929 string = "联通 A网 AS9929" + CM string = "移动 骨干网 AS9808" + EDU string = "教育网 CERNET AS4538" +) + +var TestIPsCollection = AllLocationCollection{ + Beijing: Beijing, + Shanghai: Shanghai, + Guangzhou: Guangzhou, +} + +var Beijing = BackBoneCollection{ + Location: "北京", + CT163: ISPCollection{ + ISPName: CT163, + IP: "106.37.67.1", + }, + + CU169: ISPCollection{ + ISPName: CU169, + IP: "123.125.96.156", + }, + + CM: ISPCollection{ + ISPName: CM, + IP: "211.136.25.153", + }, + + EDU: ISPCollection{ + ISPName: EDU, + IP: "101.6.15.130", + }, +} + +var Shanghai = BackBoneCollection{ + Location: "上海", + CT163: ISPCollection{ + ISPName: CT163, + IP: "101.226.28.198", + }, + + CTCN2: ISPCollection{ + ISPName: CTCN2, + IP: "58.32.4.1", + }, + + CU169: ISPCollection{ + ISPName: CU169, + IP: "139.226.206.150", + }, + + CU9929: ISPCollection{ + ISPName: CU9929, + IP: "210.13.86.1", + }, + + CM: ISPCollection{ + ISPName: CM, + IP: "120.204.34.85", + }, + + EDU: ISPCollection{ + ISPName: EDU, + IP: "202.120.58.155", + }, +} + +var Guangzhou = BackBoneCollection{ + Location: "广州", + CT163: ISPCollection{ + ISPName: CT163, + IP: "106.37.67.1", + }, + + CU169: ISPCollection{ + ISPName: CU169, + IP: "123.125.96.156", + }, + + CM: ISPCollection{ + ISPName: CM, + IP: "120.198.26.254", + }, +} diff --git a/fast_trace/fast_trace.go b/fast_trace/fast_trace.go new file mode 100644 index 0000000..24f08d0 --- /dev/null +++ b/fast_trace/fast_trace.go @@ -0,0 +1,136 @@ +package fastTrace + +import ( + "fmt" + "log" + "net" + "time" + + "github.com/xgadget-lab/nexttrace/config" + "github.com/xgadget-lab/nexttrace/ipgeo" + "github.com/xgadget-lab/nexttrace/printer" + "github.com/xgadget-lab/nexttrace/reporter" + "github.com/xgadget-lab/nexttrace/trace" +) + +type FastTracer struct { + Preference config.Preference + TracerouteMethod trace.Method +} + +func (f *FastTracer) tracert(location string, ispCollection ISPCollection) { + fmt.Printf("『%s %s 』\n", location, ispCollection.ISPName) + fmt.Printf("traceroute to %s, 30 hops max, 32 byte packets\n", ispCollection.IP) + ip := net.ParseIP(ispCollection.IP) + var conf = trace.Config{ + DestIP: ip, + DestPort: 80, + MaxHops: 30, + NumMeasurements: 3, + ParallelRequests: 18, + RDns: !f.Preference.NoRDNS, + IPGeoSource: ipgeo.GetSource(f.Preference.DataOrigin), + Timeout: 1 * time.Second, + } + + if f.TracerouteMethod == trace.ICMPTrace { + conf.RealtimePrinter = printer.RealtimePrinter + } + + res, err := trace.Traceroute(f.TracerouteMethod, conf) + + if err != nil { + log.Fatal(err) + } + + if f.TracerouteMethod == trace.TCPTrace { + printer.TracerouteTablePrinter(res) + } + + if f.Preference.AlwaysRoutePath { + r := reporter.New(res, ip.String()) + r.Print() + } +} + +func initialize() *FastTracer { + configData, err := config.Read() + + // Initialize Default Config + if err != nil || configData.DataOrigin == "" { + if configData, err = config.AutoGenerate(); err != nil { + log.Fatal(err) + } + } + + // Set Token from Config + ipgeo.SetToken(configData.Token) + + return &FastTracer{ + Preference: configData.Preference, + } +} + +func (f *FastTracer) testAll() { + f.testCT() + f.testCU() + f.testCM() + f.testEDU() +} + +func (f *FastTracer) testCT() { + f.tracert(TestIPsCollection.Beijing.Location, TestIPsCollection.Beijing.CT163) + f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.CT163) + f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.CTCN2) + f.tracert(TestIPsCollection.Guangzhou.Location, TestIPsCollection.Guangzhou.CT163) +} + +func (f *FastTracer) testCU() { + f.tracert(TestIPsCollection.Beijing.Location, TestIPsCollection.Beijing.CU169) + f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.CU169) + f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.CU9929) + f.tracert(TestIPsCollection.Guangzhou.Location, TestIPsCollection.Guangzhou.CU169) +} + +func (f *FastTracer) testCM() { + f.tracert(TestIPsCollection.Beijing.Location, TestIPsCollection.Beijing.CM) + f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.CM) + f.tracert(TestIPsCollection.Guangzhou.Location, TestIPsCollection.Guangzhou.CM) +} + +func (f *FastTracer) testEDU() { + f.tracert(TestIPsCollection.Beijing.Location, TestIPsCollection.Beijing.EDU) + f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.EDU) +} + +func FastTest(tm bool) { + var c string + + fmt.Println("您想测试哪些ISP的路由?\n1. 国内四网\n2. 电信\n3. 联通\n4. 移动\n5. 教育网") + fmt.Print("请选择选项:") + fmt.Scanln(&c) + + ft := initialize() + + if !tm { + ft.TracerouteMethod = trace.ICMPTrace + fmt.Println("您将默认使用ICMP协议进行路由跟踪,如果您想使用TCP SYN进行路由跟踪,可以加入 -T 参数") + } else { + ft.TracerouteMethod = trace.TCPTrace + } + + switch c { + case "1": + ft.testAll() + case "2": + ft.testCT() + case "3": + ft.testCU() + case "4": + ft.testCM() + case "5": + ft.testEDU() + default: + ft.testAll() + } +} diff --git a/main.go b/main.go index 150481c..e8512d5 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,7 @@ import ( "time" "github.com/xgadget-lab/nexttrace/config" + fastTrace "github.com/xgadget-lab/nexttrace/fast_trace" "github.com/xgadget-lab/nexttrace/ipgeo" "github.com/xgadget-lab/nexttrace/printer" "github.com/xgadget-lab/nexttrace/reporter" @@ -18,6 +19,7 @@ import ( ) var fSet = flag.NewFlagSet("", flag.ExitOnError) +var fastTest = fSet.Bool("f", false, "One-Key Fast Traceroute") var tcpSYNFlag = fSet.Bool("T", false, "Use TCP SYN for tracerouting (default port is 80)") var udpPackageFlag = fSet.Bool("U", false, "Use UDP Package for tracerouting (default port is 53 in UDP)") var port = fSet.Int("p", 80, "Set SYN Traceroute Port") @@ -44,6 +46,8 @@ func flagApply() string { if len(os.Args) < 2 { printArgHelp() } + + // flag parse if !strings.HasPrefix(os.Args[1], "-") { target = os.Args[1] fSet.Parse(os.Args[2:]) @@ -52,6 +56,7 @@ func flagApply() string { target = fSet.Arg(0) } + // Print Version if *ver { os.Exit(0) } @@ -64,6 +69,12 @@ func flagApply() string { os.Exit(0) } + // -f Fast Test + if *fastTest { + fastTrace.FastTest(*tcpSYNFlag) + os.Exit(0) + } + if target == "" { printArgHelp() }