network.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package network
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "io/ioutil"
  6. "log"
  7. "net"
  8. "net/http"
  9. "strings"
  10. "gitlab.com/NebulousLabs/go-upnp"
  11. )
  12. type NICS struct {
  13. Flags string
  14. HardwareAddr string
  15. Index int
  16. MTU int
  17. IPv4Addr string
  18. IPv6Addr string
  19. IPv4MulticastAddrs string
  20. IPv6MulticastAddrs string
  21. Name string
  22. }
  23. func GetNICInfo(w http.ResponseWriter, r *http.Request) {
  24. interfaces, err := net.Interfaces()
  25. if err != nil {
  26. sendJSONResponse(w, err.Error())
  27. }
  28. var NICList []NICS
  29. for _, i := range interfaces {
  30. InterfaceName := i.Name
  31. InterfaceIPv4 := ""
  32. InterfaceIPv6 := ""
  33. Flags := i.Flags.String()
  34. HardwareAddr := i.HardwareAddr.String()
  35. Index := i.Index
  36. MTU := i.MTU
  37. IPv4MulticastAddr := ""
  38. IPv6MulticastAddr := ""
  39. if HardwareAddr == "" {
  40. HardwareAddr = "N/A"
  41. }
  42. Addrs, _ := i.Addrs()
  43. for _, addr := range Addrs {
  44. var ip net.IP
  45. switch v := addr.(type) {
  46. case *net.IPNet:
  47. ip = v.IP
  48. case *net.IPAddr:
  49. ip = v.IP
  50. }
  51. ip = ip.To4()
  52. if ip != nil {
  53. InterfaceIPv4 = ip.String()
  54. } else {
  55. InterfaceIPv6 = ip.String()
  56. }
  57. }
  58. if InterfaceIPv4 == "" || InterfaceIPv4 == "<nil>" {
  59. InterfaceIPv4 = "N/A"
  60. }
  61. if InterfaceIPv6 == "" || InterfaceIPv6 == "<nil>" {
  62. InterfaceIPv6 = "N/A"
  63. }
  64. MultiAddrs, _ := i.MulticastAddrs()
  65. for _, addr := range MultiAddrs {
  66. var ip net.IP
  67. switch v := addr.(type) {
  68. case *net.IPNet:
  69. ip = v.IP
  70. case *net.IPAddr:
  71. ip = v.IP
  72. }
  73. ip = ip.To4()
  74. if ip != nil {
  75. IPv4MulticastAddr = ip.String()
  76. } else {
  77. IPv6MulticastAddr = ip.String()
  78. }
  79. }
  80. if IPv4MulticastAddr == "" || IPv4MulticastAddr == "<nil>" {
  81. IPv4MulticastAddr = "N/A"
  82. }
  83. if IPv6MulticastAddr == "" || IPv6MulticastAddr == "<nil>" {
  84. IPv6MulticastAddr = "N/A"
  85. }
  86. n := NICS{
  87. Flags: Flags,
  88. HardwareAddr: HardwareAddr,
  89. Index: Index,
  90. MTU: MTU,
  91. IPv4Addr: InterfaceIPv4,
  92. IPv6Addr: InterfaceIPv6,
  93. IPv4MulticastAddrs: IPv4MulticastAddr,
  94. IPv6MulticastAddrs: IPv6MulticastAddr,
  95. Name: InterfaceName,
  96. }
  97. NICList = append(NICList, n)
  98. }
  99. var jsonData []byte
  100. jsonData, err = json.Marshal(NICList)
  101. if err != nil {
  102. log.Println(err)
  103. }
  104. sendJSONResponse(w, string(jsonData))
  105. }
  106. //Get the IP address of the NIC that can conncet to the internet
  107. func GetOutboundIP() (net.IP, error) {
  108. conn, err := net.Dial("udp", "8.8.8.8:80")
  109. if err != nil {
  110. return nil, err
  111. }
  112. defer conn.Close()
  113. localAddr := conn.LocalAddr().(*net.UDPAddr)
  114. return localAddr.IP, nil
  115. }
  116. //Get External IP address, will require 3rd party services
  117. func GetExternalIPAddr() (string, error) {
  118. u, err := upnp.Discover()
  119. if err != nil {
  120. return "", err
  121. }
  122. // discover external IP
  123. ip, err := u.ExternalIP()
  124. if err != nil {
  125. return "", err
  126. }
  127. return ip, nil
  128. }
  129. func GetExternalIPAddrVia3rdPartyServices() (string, error) {
  130. //Fallback to using Amazon AWS IP resolve service
  131. resp, err := http.Get("http://checkip.amazonaws.com/")
  132. if err != nil {
  133. return "", err
  134. }
  135. defer resp.Body.Close()
  136. body, err := ioutil.ReadAll(resp.Body)
  137. if err != nil {
  138. return "", err
  139. }
  140. return strings.TrimSpace(string(body)), nil
  141. }
  142. func IsPublicIP(IP net.IP) bool {
  143. if IP.IsLoopback() || IP.IsLinkLocalMulticast() || IP.IsLinkLocalUnicast() {
  144. return false
  145. }
  146. if ip4 := IP.To4(); ip4 != nil {
  147. switch {
  148. case ip4[0] == 10:
  149. return false
  150. case ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31:
  151. return false
  152. case ip4[0] == 192 && ip4[1] == 168:
  153. return false
  154. default:
  155. return true
  156. }
  157. }
  158. return false
  159. }
  160. func IsIPv6Addr(ip string) (bool, error) {
  161. if net.ParseIP(ip) == nil {
  162. return false, errors.New("Address parsing failed")
  163. }
  164. for i := 0; i < len(ip); i++ {
  165. switch ip[i] {
  166. case '.':
  167. return false, nil
  168. case ':':
  169. return true, nil
  170. }
  171. }
  172. return false, errors.New("Unable to determine address type")
  173. }
  174. func GetPing(w http.ResponseWriter, r *http.Request) {
  175. sendJSONResponse(w, "pong")
  176. }