control.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package client
  2. import (
  3. "errors"
  4. "github.com/cnlh/nps/lib/common"
  5. "github.com/cnlh/nps/lib/config"
  6. "github.com/cnlh/nps/lib/conn"
  7. "github.com/cnlh/nps/lib/lg"
  8. "github.com/cnlh/nps/vender/github.com/xtaci/kcp"
  9. "github.com/cnlh/nps/vender/golang.org/x/net/proxy"
  10. "io/ioutil"
  11. "log"
  12. "net"
  13. "net/url"
  14. "os"
  15. "path/filepath"
  16. "strconv"
  17. "strings"
  18. "time"
  19. )
  20. func GetTaskStatus(path string) {
  21. cnf, err := config.NewConfig(path)
  22. if err != nil {
  23. log.Fatalln(err)
  24. }
  25. c, err := NewConn(cnf.CommonConfig.Tp, cnf.CommonConfig.VKey, cnf.CommonConfig.Server, common.WORK_CONFIG, cnf.CommonConfig.ProxyUrl)
  26. if err != nil {
  27. log.Fatalln(err)
  28. }
  29. if _, err := c.Write([]byte(common.WORK_STATUS)); err != nil {
  30. log.Fatalln(err)
  31. }
  32. if f, err := common.ReadAllFromFile(filepath.Join(common.GetTmpPath(), "npc_vkey.txt")); err != nil {
  33. log.Fatalln(err)
  34. } else if _, err := c.Write([]byte(string(f))); err != nil {
  35. log.Fatalln(err)
  36. }
  37. if l, err := c.GetLen(); err != nil {
  38. log.Fatalln(err)
  39. } else if b, err := c.ReadLen(l); err != nil {
  40. lg.Fatalln(err)
  41. } else {
  42. arr := strings.Split(string(b), common.CONN_DATA_SEQ)
  43. for _, v := range cnf.Hosts {
  44. if common.InStrArr(arr, v.Remark) {
  45. log.Println(v.Remark, "ok")
  46. } else {
  47. log.Println(v.Remark, "not running")
  48. }
  49. }
  50. for _, v := range cnf.Tasks {
  51. ports := common.GetPorts(v.Ports)
  52. for _, vv := range ports {
  53. var remark string
  54. if len(ports) > 1 {
  55. remark = v.Remark + "_" + strconv.Itoa(vv)
  56. } else {
  57. remark = v.Remark
  58. }
  59. if common.InStrArr(arr, remark) {
  60. log.Println(remark, "ok")
  61. } else {
  62. log.Println(remark, "not running")
  63. }
  64. }
  65. }
  66. }
  67. os.Exit(0)
  68. }
  69. var errAdd = errors.New("The server returned an error, which port or host may have been occupied or not allowed to open.")
  70. func StartFromFile(path string) {
  71. first := true
  72. cnf, err := config.NewConfig(path)
  73. if err != nil {
  74. lg.Fatalln(err)
  75. }
  76. lg.Printf("Loading configuration file %s successfully", path)
  77. re:
  78. if first || cnf.CommonConfig.AutoReconnection {
  79. if !first {
  80. lg.Println("Reconnecting...")
  81. time.Sleep(time.Second * 5)
  82. }
  83. } else {
  84. return
  85. }
  86. first = false
  87. c, err := NewConn(cnf.CommonConfig.Tp, cnf.CommonConfig.VKey, cnf.CommonConfig.Server, common.WORK_CONFIG, cnf.CommonConfig.ProxyUrl)
  88. if err != nil {
  89. lg.Println(err)
  90. goto re
  91. }
  92. if _, err := c.SendConfigInfo(cnf.CommonConfig.Cnf); err != nil {
  93. lg.Println(err)
  94. goto re
  95. }
  96. var b []byte
  97. if b, err = c.ReadLen(16); err != nil {
  98. lg.Println(err)
  99. goto re
  100. } else {
  101. ioutil.WriteFile(filepath.Join(common.GetTmpPath(), "npc_vkey.txt"), []byte(string(b)), 0600)
  102. }
  103. if !c.GetAddStatus() {
  104. lg.Println(errAdd)
  105. goto re
  106. }
  107. for _, v := range cnf.Hosts {
  108. if _, err := c.SendHostInfo(v); err != nil {
  109. lg.Println(err)
  110. goto re
  111. }
  112. if !c.GetAddStatus() {
  113. lg.Println(errAdd, v.Host)
  114. goto re
  115. }
  116. }
  117. for _, v := range cnf.Tasks {
  118. if _, err := c.SendTaskInfo(v); err != nil {
  119. lg.Println(err)
  120. goto re
  121. }
  122. if !c.GetAddStatus() {
  123. lg.Println(errAdd, v.Ports)
  124. goto re
  125. }
  126. }
  127. c.Close()
  128. NewRPClient(cnf.CommonConfig.Server, string(b), cnf.CommonConfig.Tp, cnf.CommonConfig.ProxyUrl).Start()
  129. goto re
  130. }
  131. //Create a new connection with the server and verify it
  132. func NewConn(tp string, vkey string, server string, connType string, proxyUrl string) (*conn.Conn, error) {
  133. var err error
  134. var connection net.Conn
  135. var sess *kcp.UDPSession
  136. if tp == "tcp" {
  137. if proxyUrl != "" {
  138. u, er := url.Parse(proxyUrl)
  139. if er != nil {
  140. return nil, er
  141. }
  142. n, er := proxy.FromURL(u, nil)
  143. if er != nil {
  144. return nil, er
  145. }
  146. connection, err = n.Dial("tcp", server)
  147. } else {
  148. connection, err = net.Dial("tcp", server)
  149. }
  150. } else {
  151. sess, err = kcp.DialWithOptions(server, nil, 10, 3)
  152. conn.SetUdpSession(sess)
  153. connection = sess
  154. }
  155. if err != nil {
  156. return nil, err
  157. }
  158. c := conn.NewConn(connection)
  159. if _, err := c.Write([]byte(common.Getverifyval(vkey))); err != nil {
  160. lg.Println(err)
  161. }
  162. if s, err := c.ReadFlag(); err != nil {
  163. lg.Println(err)
  164. } else if s == common.VERIFY_EER {
  165. lg.Fatalf("Validation key %s incorrect", vkey)
  166. }
  167. if _, err := c.Write([]byte(connType)); err != nil {
  168. lg.Println(err)
  169. }
  170. c.SetAlive(tp)
  171. return c, nil
  172. }