network.go 4.8 KB

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