diff --git a/main.go b/main.go index 095068cc..6997717a 100644 --- a/main.go +++ b/main.go @@ -19,7 +19,8 @@ var numMeasurements = flag.Int("q", 3, "Set the number of probes per each hop.") var parallelRequests = flag.Int("r", 18, "Set ParallelRequests number. It should be 1 when there is a multi-routing.") var maxHops = flag.Int("m", 30, "Set the max number of hops (max TTL to be reached).") var dataOrigin = flag.String("d", "LeoMoeAPI", "Choose IP Geograph Data Provider [LeoMoeAPI, IP.SB, IPInfo, IPInsight]") -var displayMode = flag.String("displayMode", "table", "Choose The Display Mode [table, Besttrace]") +var displayMode = flag.String("displayMode", "table", "Choose The Display Mode [table, classic]") +var rdnsenable = flag.Bool("rdns", false, "Set whether rDNS will be display") func main() { printer.PrintCopyRight() @@ -40,13 +41,13 @@ func main() { if err != nil { fmt.Println("请赋予 sudo (root) 权限运行本程序") } else { - if *displayMode == "Besttrace" { - printer.TraceroutePrinter(ip, *res, *dataOrigin) - } else if *displayMode == "table" { - printer.TracerouteTablePrinter(ip, *res, *dataOrigin) - } else { - printer.TracerouteTablePrinter(ip, *res, *dataOrigin) - } + util.Printer(&util.PrinterConfig{ + IP: ip, + DisplayMode: *displayMode, + DataOrigin: *dataOrigin, + Rdnsenable: *rdnsenable, + Results: *res, + }) } } else { @@ -65,13 +66,13 @@ func main() { if err != nil { fmt.Println("请赋予 sudo (root) 权限运行本程序") } else { - if *displayMode == "Besttrace" { - printer.TraceroutePrinter(ip, *res, *dataOrigin) - } else if *displayMode == "table" { - printer.TracerouteTablePrinter(ip, *res, *dataOrigin) - } else { - printer.TracerouteTablePrinter(ip, *res, *dataOrigin) - } + util.Printer(&util.PrinterConfig{ + IP: ip, + DisplayMode: *displayMode, + DataOrigin: *dataOrigin, + Rdnsenable: *rdnsenable, + Results: *res, + }) } } } diff --git a/util/methods.go b/util/methods.go index 9907d37b..92d682d7 100644 --- a/util/methods.go +++ b/util/methods.go @@ -1,5 +1,12 @@ package util +import ( + "net" + + "github.com/xgadget-lab/nexttrace/methods" + "github.com/xgadget-lab/nexttrace/util/printer" +) + type IPGeoData struct { Asnumber string `json:"asnumber"` Country string `json:"country"` @@ -9,3 +16,24 @@ type IPGeoData struct { Owner string `json:"owner"` Isp string `json:"isp"` } + +type PrinterConfig struct { + IP net.IP + DataOrigin string + DisplayMode string + Rdnsenable bool + Results map[uint16][]methods.TracerouteHop +} + +func Printer(config *PrinterConfig) { + switch config.DisplayMode { + case "table": + printer.TracerouteTablePrinter(config.IP, config.Results, config.DataOrigin, config.Rdnsenable) + case "classic": + printer.TraceroutePrinter(config.IP, config.Results, config.DataOrigin, config.Rdnsenable) + case "json": + //TracerouteJSONPrinter(config.Results, config.DataOrigin) + default: + printer.TraceroutePrinter(config.IP, config.Results, config.DataOrigin, config.Rdnsenable) + } +} diff --git a/util/printer/printer.go b/util/printer/printer.go index 1f9ff82a..ac3c4814 100644 --- a/util/printer/printer.go +++ b/util/printer/printer.go @@ -11,11 +11,11 @@ import ( var dataOrigin string -func TraceroutePrinter(ip net.IP, res map[uint16][]methods.TracerouteHop, dataOrigin string) { +func TraceroutePrinter(ip net.IP, res map[uint16][]methods.TracerouteHop, dataOrigin string, rdnsenable bool) { for hi := uint16(1); hi < 30; hi++ { fmt.Print(hi) for _, v := range res[hi] { - hopPrinter(v) + hopPrinter(v, rdnsenable) if v.Address != nil && ip.String() == v.Address.String() { hi = 31 } @@ -23,7 +23,7 @@ func TraceroutePrinter(ip net.IP, res map[uint16][]methods.TracerouteHop, dataOr } } -func hopPrinter(v2 methods.TracerouteHop) { +func hopPrinter(v2 methods.TracerouteHop, rdnsenable bool) { if v2.Address == nil { fmt.Println("\t*") } else { @@ -52,14 +52,19 @@ func hopPrinter(v2 methods.TracerouteHop) { geo = formatIpGeoData(ipStr, iPGeoData) } - ptr, err := net.LookupAddr(ipStr) - txt := "\t" - if err != nil { - txt += fmt.Sprint(ipStr, " ", fmt.Sprintf("%.2f", v2.RTT.Seconds()*1000), "ms ", geo) + + if rdnsenable { + ptr, err := net.LookupAddr(ipStr) + if err != nil { + txt += fmt.Sprint(ipStr, " ", fmt.Sprintf("%.2f", v2.RTT.Seconds()*1000), "ms ", geo) + } else { + txt += fmt.Sprint(ptr[0], " (", ipStr, ") ", fmt.Sprintf("%.2f", v2.RTT.Seconds()*1000), "ms ", geo) + } } else { - txt += fmt.Sprint(ptr[0], " (", ipStr, ") ", fmt.Sprintf("%.2f", v2.RTT.Seconds()*1000), "ms ", geo) + txt += fmt.Sprint(ipStr, " ", fmt.Sprintf("%.2f", v2.RTT.Seconds()*1000), "ms ", geo) } + fmt.Println(txt) } } diff --git a/util/printer/tableprinter.go b/util/printer/tableprinter.go index 93d7e5dc..14f39934 100644 --- a/util/printer/tableprinter.go +++ b/util/printer/tableprinter.go @@ -22,12 +22,12 @@ type rowData struct { Owner string } -func TracerouteTablePrinter(ip net.IP, res map[uint16][]methods.TracerouteHop, dataOrigin string) { +func TracerouteTablePrinter(ip net.IP, res map[uint16][]methods.TracerouteHop, dataOrigin string, rdnsenable bool) { // 初始化表格 tbl := New() for hi := uint16(1); hi < 30; hi++ { for _, v := range res[hi] { - data := tableDataGenerator(v) + data := tableDataGenerator(v, rdnsenable) tbl.AddRow(data.Hop, data.IP, data.Latency, data.Asnumber, data.Country, data.Prov, data.City, data.Owner) if v.Address != nil && ip.String() == v.Address.String() { hi = 31 @@ -48,7 +48,7 @@ func New() table.Table { return tbl } -func tableDataGenerator(v2 methods.TracerouteHop) *rowData { +func tableDataGenerator(v2 methods.TracerouteHop, rdnsenable bool) *rowData { if v2.Address == nil { return &rowData{ Hop: int64(v2.TTL), @@ -75,16 +75,19 @@ func tableDataGenerator(v2 methods.TracerouteHop) *rowData { iPGeoData, err = ipgeo.LeoIP(ipStr) } - ptr, err_LookupAddr := net.LookupAddr(ipStr) - - lantency = fmt.Sprintf("%.2fms", v2.RTT.Seconds()*1000) - - if err_LookupAddr != nil { - IP = fmt.Sprint(ipStr) + if rdnsenable { + ptr, err_LookupAddr := net.LookupAddr(ipStr) + if err_LookupAddr != nil { + IP = fmt.Sprint(ipStr) + } else { + IP = fmt.Sprint(ptr[0], " (", ipStr, ") ") + } } else { - IP = fmt.Sprint(ptr[0], " (", ipStr, ") ") + IP = fmt.Sprint(ipStr) } + lantency = fmt.Sprintf("%.2fms", v2.RTT.Seconds()*1000) + if iPGeoData.Owner == "" { iPGeoData.Owner = iPGeoData.Isp }