control.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package client
  2. import (
  3. "encoding/binary"
  4. "errors"
  5. "github.com/cnlh/nps/lib/common"
  6. "github.com/cnlh/nps/lib/config"
  7. "github.com/cnlh/nps/lib/conn"
  8. "github.com/cnlh/nps/lib/crypt"
  9. "github.com/cnlh/nps/lib/version"
  10. "github.com/cnlh/nps/vender/github.com/astaxie/beego/logs"
  11. "github.com/cnlh/nps/vender/github.com/xtaci/kcp"
  12. "github.com/cnlh/nps/vender/golang.org/x/net/proxy"
  13. "io/ioutil"
  14. "log"
  15. "net"
  16. "net/url"
  17. "os"
  18. "path/filepath"
  19. "strconv"
  20. "strings"
  21. "time"
  22. )
  23. func GetTaskStatus(path string) {
  24. cnf, err := config.NewConfig(path)
  25. if err != nil {
  26. log.Fatalln(err)
  27. }
  28. c, err := NewConn(cnf.CommonConfig.Tp, cnf.CommonConfig.VKey, cnf.CommonConfig.Server, common.WORK_CONFIG, cnf.CommonConfig.ProxyUrl)
  29. if err != nil {
  30. log.Fatalln(err)
  31. }
  32. if _, err := c.Write([]byte(common.WORK_STATUS)); err != nil {
  33. log.Fatalln(err)
  34. }
  35. //read now vKey and write to server
  36. if f, err := common.ReadAllFromFile(filepath.Join(common.GetTmpPath(), "npc_vkey.txt")); err != nil {
  37. log.Fatalln(err)
  38. } else if _, err := c.Write([]byte(crypt.Md5(string(f)))); err != nil {
  39. log.Fatalln(err)
  40. }
  41. var isPub bool
  42. binary.Read(c, binary.LittleEndian, &isPub)
  43. if l, err := c.GetLen(); err != nil {
  44. log.Fatalln(err)
  45. } else if b, err := c.GetShortContent(l); err != nil {
  46. log.Fatalln(err)
  47. } else {
  48. arr := strings.Split(string(b), common.CONN_DATA_SEQ)
  49. for _, v := range cnf.Hosts {
  50. if common.InStrArr(arr, v.Remark) {
  51. log.Println(v.Remark, "ok")
  52. } else {
  53. log.Println(v.Remark, "not running")
  54. }
  55. }
  56. for _, v := range cnf.Tasks {
  57. ports := common.GetPorts(v.Ports)
  58. if v.Mode == "secret" {
  59. ports = append(ports, 0)
  60. }
  61. for _, vv := range ports {
  62. var remark string
  63. if len(ports) > 1 {
  64. remark = v.Remark + "_" + strconv.Itoa(vv)
  65. } else {
  66. remark = v.Remark
  67. }
  68. if common.InStrArr(arr, remark) {
  69. log.Println(remark, "ok")
  70. } else {
  71. log.Println(remark, "not running")
  72. }
  73. }
  74. }
  75. }
  76. os.Exit(0)
  77. }
  78. var errAdd = errors.New("The server returned an error, which port or host may have been occupied or not allowed to open.")
  79. func StartFromFile(path string) {
  80. first := true
  81. cnf, err := config.NewConfig(path)
  82. if err != nil || cnf.CommonConfig == nil {
  83. logs.Error("Config file %s loading error", path)
  84. os.Exit(0)
  85. }
  86. logs.Info("Loading configuration file %s successfully", path)
  87. re:
  88. if first || cnf.CommonConfig.AutoReconnection {
  89. if !first {
  90. logs.Info("Reconnecting...")
  91. time.Sleep(time.Second * 5)
  92. }
  93. } else {
  94. return
  95. }
  96. first = false
  97. c, err := NewConn(cnf.CommonConfig.Tp, cnf.CommonConfig.VKey, cnf.CommonConfig.Server, common.WORK_CONFIG, cnf.CommonConfig.ProxyUrl)
  98. if err != nil {
  99. logs.Error(err)
  100. goto re
  101. }
  102. var isPub bool
  103. binary.Read(c, binary.LittleEndian, &isPub)
  104. // get tmp password
  105. var b []byte
  106. vkey := cnf.CommonConfig.VKey
  107. if isPub {
  108. // send global configuration to server and get status of config setting
  109. if _, err := c.SendConfigInfo(cnf.CommonConfig); err != nil {
  110. logs.Error(err)
  111. goto re
  112. }
  113. if !c.GetAddStatus() {
  114. logs.Error(errAdd)
  115. goto re
  116. }
  117. if b, err = c.GetShortContent(16); err != nil {
  118. logs.Error(err)
  119. goto re
  120. }
  121. vkey = string(b)
  122. }
  123. ioutil.WriteFile(filepath.Join(common.GetTmpPath(), "npc_vkey.txt"), []byte(vkey), 0600)
  124. //send hosts to server
  125. for _, v := range cnf.Hosts {
  126. if _, err := c.SendHostInfo(v); err != nil {
  127. logs.Error(err)
  128. goto re
  129. }
  130. if !c.GetAddStatus() {
  131. logs.Error(errAdd, v.Host)
  132. goto re
  133. }
  134. }
  135. //send task to server
  136. for _, v := range cnf.Tasks {
  137. if _, err := c.SendTaskInfo(v); err != nil {
  138. logs.Error(err)
  139. goto re
  140. }
  141. if !c.GetAddStatus() {
  142. logs.Error(errAdd, v.Ports)
  143. goto re
  144. }
  145. if v.Mode == "file" {
  146. //start local file server
  147. go startLocalFileServer(cnf.CommonConfig, v, vkey)
  148. }
  149. }
  150. //create local server secret or p2p
  151. for _, v := range cnf.LocalServer {
  152. go StartLocalServer(v, cnf.CommonConfig)
  153. }
  154. c.Close()
  155. NewRPClient(cnf.CommonConfig.Server, vkey, cnf.CommonConfig.Tp, cnf.CommonConfig.ProxyUrl, cnf).Start()
  156. CloseLocalServer()
  157. goto re
  158. }
  159. // Create a new connection with the server and verify it
  160. func NewConn(tp string, vkey string, server string, connType string, proxyUrl string) (*conn.Conn, error) {
  161. var err error
  162. var connection net.Conn
  163. var sess *kcp.UDPSession
  164. if tp == "tcp" {
  165. if proxyUrl != "" {
  166. u, er := url.Parse(proxyUrl)
  167. if er != nil {
  168. return nil, er
  169. }
  170. n, er := proxy.FromURL(u, nil)
  171. if er != nil {
  172. return nil, er
  173. }
  174. connection, err = n.Dial("tcp", server)
  175. } else {
  176. connection, err = net.Dial("tcp", server)
  177. }
  178. } else {
  179. sess, err = kcp.DialWithOptions(server, nil, 10, 3)
  180. conn.SetUdpSession(sess)
  181. connection = sess
  182. }
  183. if err != nil {
  184. return nil, err
  185. }
  186. c := conn.NewConn(connection)
  187. if _, err := c.Write([]byte(common.CONN_TEST)); err != nil {
  188. logs.Error(err)
  189. os.Exit(0)
  190. }
  191. if _, err := c.Write([]byte(crypt.Md5(version.GetVersion()))); err != nil {
  192. logs.Error(err)
  193. os.Exit(0)
  194. }
  195. if b, err := c.GetShortContent(32); err != nil || crypt.Md5(version.GetVersion()) != string(b) {
  196. logs.Error("The client does not match the server version. The current version of the client is", version.GetVersion())
  197. os.Exit(0)
  198. }
  199. if _, err := c.Write([]byte(common.Getverifyval(vkey))); err != nil {
  200. logs.Error(err)
  201. os.Exit(0)
  202. }
  203. if s, err := c.ReadFlag(); err != nil {
  204. logs.Error(err)
  205. os.Exit(0)
  206. } else if s == common.VERIFY_EER {
  207. logs.Error("Validation key %s incorrect", vkey)
  208. os.Exit(0)
  209. }
  210. if _, err := c.Write([]byte(connType)); err != nil {
  211. logs.Error(err)
  212. os.Exit(0)
  213. }
  214. c.SetAlive(tp)
  215. return c, nil
  216. }