util.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "io/ioutil"
  6. mu "mfw/util"
  7. "net"
  8. "net/http"
  9. "os/exec"
  10. "strings"
  11. "time"
  12. )
  13. //检测端口是否可用
  14. func checkPort() (sPorts, fPorts []string) {
  15. output, err := exec.Command("netstat", "-tuln").Output()
  16. if err != nil {
  17. fmt.Println("执行netstat命令时出错:", err)
  18. return
  19. }
  20. lines := strings.Split(string(output), "\n")
  21. for _, port := range config.Ports {
  22. portOk := false
  23. for _, line := range lines {
  24. if line == "" {
  25. continue
  26. }
  27. fields := strings.Fields(line)
  28. if len(fields) >= 4 && strings.Contains(fields[3], fmt.Sprint(port)) { //端口存活
  29. portOk = true
  30. }
  31. }
  32. if portOk {
  33. sPorts = append(sPorts, fmt.Sprint(port))
  34. } else {
  35. fPorts = append(fPorts, fmt.Sprint(port))
  36. }
  37. }
  38. return
  39. }
  40. //测速
  41. func checkSpeed(addr string, updatename bool) (float64, float64) {
  42. conn, err := net.Dial("tcp", addr)
  43. if err != nil {
  44. return 0, 0
  45. }
  46. defer conn.Close()
  47. t1 := time.Now()
  48. buf := make([]byte, 1024)
  49. for i := 0; i < 50; i++ {
  50. io.ReadFull(conn, buf)
  51. }
  52. dd := time.Since(t1)
  53. t1 = time.Now()
  54. for i := 0; i < 50; i++ {
  55. conn.Write(buf)
  56. }
  57. for {
  58. _, err := conn.Write(buf)
  59. if err != nil {
  60. break
  61. }
  62. time.Sleep(10 * time.Millisecond)
  63. }
  64. ud := time.Since(t1)
  65. dp, up := float64(0.05)/dd.Seconds(), float64(0.05)/ud.Seconds()
  66. msg := fmt.Sprintf(MSG_TPL, config.VpsName, float64(0.05)/dd.Seconds(), float64(0.05)/ud.Seconds())
  67. fmt.Println("网速测试,", msg)
  68. if updatename {
  69. client.WriteObj("", "", mu.EVENT_UPDATE_MYNAME, mu.SENDTO_TYPE_P2P, []byte(msg))
  70. }
  71. return dp, up
  72. }
  73. //切换IP
  74. func changeIP() {
  75. sendMessageBeforChangeIp()
  76. defer sendMessageAfterChangeIp()
  77. for {
  78. fmt.Println("start change ip...")
  79. exec.Command("pppoe-stop").Run()
  80. exec.Command("pppoe-start").Run()
  81. fmt.Println("wait...")
  82. time.Sleep(10 * time.Second) //避免换IP后无法获取IP
  83. newIp := getMyIp() //获取新IP
  84. fmt.Println("newIp:", newIp)
  85. if newIp != "" && newIp != myoldip {
  86. fmt.Println("公网IP由", myoldip, "换为", newIp)
  87. ds, us := checkSpeed(config.CheckSpeedAddr, true) //测速
  88. if ds >= config.DownSpeedLimit && us >= config.UploadSpeedLimit { //网速达标
  89. fmt.Println("IP测速通过", newIp)
  90. myoldip = newIp
  91. break
  92. }
  93. }
  94. time.Sleep(5 * time.Second)
  95. }
  96. }
  97. func sendMessageBeforChangeIp() {
  98. fmt.Println("切换IP前发送消息...")
  99. bs := []byte{}
  100. for _, v := range cache {
  101. udpclient.WriteUdp([]byte{}, mu.OP_WILLCHANGEIP, v.Addr) //udp通知本服务器的下载器节点要切换ip,下掉所有服务
  102. bs = append(bs, []byte(v.Code)...)
  103. }
  104. client.WriteObj("", "", mu.SERVICE_DOWNLOAD_DELETE_NODE, mu.SENDTO_TYPE_ALL_RECIVER, bs)
  105. }
  106. func sendMessageAfterChangeIp() {
  107. fmt.Println("切换IP后发送消息...")
  108. cacheLock.Lock()
  109. for k, v := range cache { //告诉下载器重连
  110. udpclient.WriteUdp([]byte{}, mu.OP_NEWCLIENT, v.Addr)
  111. delete(cache, k)
  112. }
  113. cacheLock.Unlock()
  114. go func() {
  115. for i := 1; i <= 5; i++ {
  116. time.Sleep(5 * time.Second)
  117. if len(cache) > 0 {
  118. bs := []byte{}
  119. for k, v := range cache {
  120. fmt.Println("本机下载器机器码:", k, v.Code)
  121. bs = append(bs, []byte(v.Code)...)
  122. }
  123. client.WriteObj("", "", mu.SERVICE_DOWNLOAD_APPEND_NODE, mu.SENDTO_TYPE_ALL_RECIVER, bs)
  124. return
  125. }
  126. }
  127. }()
  128. }
  129. //获取IP
  130. func getMyIp() (ip string) {
  131. for i := 1; i <= 3; i++ {
  132. client := &http.Client{
  133. Timeout: 5 * time.Second, // 设置超时时间为5秒
  134. }
  135. resp, err := client.Get("https://api.ipify.org") // 使用ipify.org提供的IP查询API
  136. if err != nil {
  137. fmt.Println("获取公网IP失败:", err)
  138. continue
  139. }
  140. ipByte, err := ioutil.ReadAll(resp.Body)
  141. if err != nil {
  142. fmt.Println("获取公网IP失败:", err)
  143. continue
  144. }
  145. resp.Body.Close()
  146. ip = string(ipByte)
  147. return
  148. }
  149. return
  150. }
  151. func checkIpAndPort() (sPorts, fPorts []string) {
  152. //检测IP
  153. if !changing { //正在切换IP,不做测速检测
  154. fmt.Println("测速...")
  155. ds, us := checkSpeed(config.CheckSpeedAddr, false) //测速
  156. if ds < config.DownSpeedLimit || us < config.UploadSpeedLimit { //网速不达标,切换IP
  157. go runChangeIP() //重新切换IP
  158. }
  159. }
  160. fmt.Println("检测端口...")
  161. //检测端口
  162. sPorts, fPorts = checkPort()
  163. if len(fPorts) == len(config.Ports) { //端口都不可用,重启端口
  164. go reStartPorts() //本轮检测重启,不可用
  165. }
  166. time.Sleep(1 * time.Second)
  167. return
  168. }
  169. //端口重启
  170. func reStartPorts() {
  171. tmpPort := []string{}
  172. for _, port := range config.Ports {
  173. tmpPort = append(tmpPort, ":"+fmt.Sprint(port))
  174. }
  175. exec.Command("/bin/sh", "-c", `kill -9 $(pidof "proxy")`).Run() //杀proxy
  176. exec.Command("proxy", "socks", "-t", "tcp", "-p", strings.Join(tmpPort, ","), "--forever", "--nolog", "--daemon").Run() //启动proxy
  177. }