1
0

netutils.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package netutils
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net"
  6. "net/http"
  7. "strconv"
  8. "github.com/likexian/whois"
  9. "imuslab.com/zoraxy/mod/utils"
  10. )
  11. /*
  12. This script handles basic network utilities like
  13. - traceroute
  14. - ping
  15. */
  16. func HandleTraceRoute(w http.ResponseWriter, r *http.Request) {
  17. targetIpOrDomain, err := utils.GetPara(r, "target")
  18. if err != nil {
  19. utils.SendErrorResponse(w, "invalid target (domain or ip) address given")
  20. return
  21. }
  22. maxhopsString, err := utils.GetPara(r, "maxhops")
  23. if err != nil {
  24. maxhopsString = "64"
  25. }
  26. maxHops, err := strconv.Atoi(maxhopsString)
  27. if err != nil {
  28. maxHops = 64
  29. }
  30. results, err := TraceRoute(targetIpOrDomain, maxHops)
  31. if err != nil {
  32. utils.SendErrorResponse(w, err.Error())
  33. return
  34. }
  35. js, _ := json.Marshal(results)
  36. utils.SendJSONResponse(w, string(js))
  37. }
  38. func TraceRoute(targetIpOrDomain string, maxHops int) ([]string, error) {
  39. return traceroute(targetIpOrDomain, maxHops)
  40. }
  41. func HandleWhois(w http.ResponseWriter, r *http.Request) {
  42. targetIpOrDomain, err := utils.GetPara(r, "target")
  43. if err != nil {
  44. utils.SendErrorResponse(w, "invalid target (domain or ip) address given")
  45. return
  46. }
  47. raw, _ := utils.GetPara(r, "raw")
  48. result, err := whois.Whois(targetIpOrDomain)
  49. if err != nil {
  50. utils.SendErrorResponse(w, err.Error())
  51. return
  52. }
  53. if raw == "true" {
  54. utils.SendTextResponse(w, result)
  55. } else {
  56. parsedOutput, err := ParseWHOISResponse(result)
  57. if err != nil {
  58. utils.SendErrorResponse(w, err.Error())
  59. return
  60. }
  61. js, _ := json.Marshal(parsedOutput)
  62. utils.SendJSONResponse(w, string(js))
  63. }
  64. }
  65. func HandlePing(w http.ResponseWriter, r *http.Request) {
  66. targetIpOrDomain, err := utils.GetPara(r, "target")
  67. if err != nil {
  68. utils.SendErrorResponse(w, "invalid target (domain or ip) address given")
  69. return
  70. }
  71. type MixedPingResults struct {
  72. ICMP []string
  73. TCP []string
  74. UDP []string
  75. }
  76. results := MixedPingResults{
  77. ICMP: []string{},
  78. TCP: []string{},
  79. UDP: []string{},
  80. }
  81. //Ping ICMP
  82. for i := 0; i < 4; i++ {
  83. realIP, pingTime, ttl, err := PingIP(targetIpOrDomain)
  84. if err != nil {
  85. results.ICMP = append(results.ICMP, "Reply from "+realIP+": "+err.Error())
  86. } else {
  87. results.ICMP = append(results.ICMP, fmt.Sprintf("Reply from %s: Time=%dms TTL=%d", realIP, pingTime.Milliseconds(), ttl))
  88. }
  89. }
  90. //Ping TCP
  91. for i := 0; i < 4; i++ {
  92. pingTime, err := TCPPing(targetIpOrDomain)
  93. if err != nil {
  94. results.TCP = append(results.TCP, "Reply from "+resolveIpFromDomain(targetIpOrDomain)+": "+err.Error())
  95. } else {
  96. results.TCP = append(results.TCP, fmt.Sprintf("Reply from %s: Time=%dms", resolveIpFromDomain(targetIpOrDomain), pingTime.Milliseconds()))
  97. }
  98. }
  99. //Ping UDP
  100. for i := 0; i < 4; i++ {
  101. pingTime, err := UDPPing(targetIpOrDomain)
  102. if err != nil {
  103. results.UDP = append(results.UDP, "Reply from "+resolveIpFromDomain(targetIpOrDomain)+": "+err.Error())
  104. } else {
  105. results.UDP = append(results.UDP, fmt.Sprintf("Reply from %s: Time=%dms", resolveIpFromDomain(targetIpOrDomain), pingTime.Milliseconds()))
  106. }
  107. }
  108. js, _ := json.Marshal(results)
  109. utils.SendJSONResponse(w, string(js))
  110. }
  111. func resolveIpFromDomain(targetIpOrDomain string) string {
  112. //Resolve target ip address
  113. targetIpAddrString := ""
  114. ipAddr, err := net.ResolveIPAddr("ip", targetIpOrDomain)
  115. if err != nil {
  116. targetIpAddrString = targetIpOrDomain
  117. } else {
  118. targetIpAddrString = ipAddr.IP.String()
  119. }
  120. return targetIpAddrString
  121. }