server.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package server
  2. import (
  3. "errors"
  4. "github.com/cnlh/nps/bridge"
  5. "github.com/cnlh/nps/lib/beego"
  6. "github.com/cnlh/nps/lib/file"
  7. "github.com/cnlh/nps/lib/lg"
  8. "github.com/cnlh/nps/server/proxy"
  9. "github.com/cnlh/nps/server/tool"
  10. "reflect"
  11. )
  12. var (
  13. Bridge *bridge.Bridge
  14. RunList map[int]interface{} //运行中的任务
  15. )
  16. func init() {
  17. RunList = make(map[int]interface{})
  18. }
  19. //从csv文件中恢复任务
  20. func InitFromCsv() {
  21. //Add a public password
  22. c := file.NewClient(beego.AppConfig.String("publicVkey"), true, true)
  23. file.GetCsvDb().NewClient(c)
  24. RunList[c.Id] = nil
  25. //Initialize services in server-side files
  26. for _, v := range file.GetCsvDb().Tasks {
  27. if v.Status {
  28. lg.Println("启动模式:", v.Mode, "监听端口:", v.Port)
  29. AddTask(v)
  30. }
  31. }
  32. }
  33. func DealBridgeTask() {
  34. for {
  35. select {
  36. case t := <-Bridge.OpenTask:
  37. AddTask(t)
  38. case id := <-Bridge.CloseClient:
  39. DelTunnelAndHostByClientId(id)
  40. file.GetCsvDb().DelClient(id)
  41. }
  42. }
  43. }
  44. //start a new server
  45. func StartNewServer(bridgePort int, cnf *file.Tunnel, bridgeType string) {
  46. Bridge = bridge.NewTunnel(bridgePort, bridgeType)
  47. if err := Bridge.StartTunnel(); err != nil {
  48. lg.Fatalln("服务端开启失败", err)
  49. } else {
  50. lg.Printf("Server startup, the bridge type is %s, the bridge port is %d", bridgeType, bridgePort)
  51. }
  52. go DealBridgeTask()
  53. if svr := NewMode(Bridge, cnf); svr != nil {
  54. RunList[cnf.Id] = svr
  55. err := reflect.ValueOf(svr).MethodByName("Start").Call(nil)[0]
  56. if err.Interface() != nil {
  57. lg.Fatalln(err)
  58. }
  59. } else {
  60. lg.Fatalln("启动模式%s不正确", cnf.Mode)
  61. }
  62. }
  63. //new a server by mode name
  64. func NewMode(Bridge *bridge.Bridge, c *file.Tunnel) interface{} {
  65. switch c.Mode {
  66. case "tcpServer":
  67. return proxy.NewTunnelModeServer(proxy.ProcessTunnel, Bridge, c)
  68. case "socks5Server":
  69. return proxy.NewSock5ModeServer(Bridge, c)
  70. case "httpProxyServer":
  71. return proxy.NewTunnelModeServer(proxy.ProcessHttp, Bridge, c)
  72. case "udpServer":
  73. return proxy.NewUdpModeServer(Bridge, c)
  74. case "webServer":
  75. InitFromCsv()
  76. t := &file.Tunnel{
  77. Port: 0,
  78. Mode: "httpHostServer",
  79. Target: "",
  80. Status: true,
  81. }
  82. AddTask(t)
  83. return proxy.NewWebServer(Bridge)
  84. case "httpHostServer":
  85. return proxy.NewHttp(Bridge, c)
  86. }
  87. return nil
  88. }
  89. //stop server
  90. func StopServer(id int) error {
  91. if v, ok := RunList[id]; ok {
  92. if reflect.ValueOf(v).IsValid() {
  93. //TODO 错误处理
  94. reflect.ValueOf(v).MethodByName("Close").Call(nil)
  95. if t, err := file.GetCsvDb().GetTask(id); err != nil {
  96. return err
  97. } else {
  98. t.Status = false
  99. file.GetCsvDb().UpdateTask(t)
  100. }
  101. }
  102. delete(RunList, id)
  103. return nil
  104. }
  105. return errors.New("未在运行中")
  106. }
  107. //add task
  108. func AddTask(t *file.Tunnel) error {
  109. if b := tool.TestServerPort(t.Port, t.Mode); !b && t.Mode != "httpHostServer" {
  110. lg.Printf("taskId %d start error Port %d Open Failed", t.Id, t.Port)
  111. return errors.New("the port open error")
  112. }
  113. if svr := NewMode(Bridge, t); svr != nil {
  114. RunList[t.Id] = svr
  115. go func() {
  116. err := reflect.ValueOf(svr).MethodByName("Start").Call(nil)[0]
  117. if err.Interface() != nil {
  118. lg.Println("clientId %d taskId %d start error %s", t.Client.Id, t.Id, err)
  119. delete(RunList, t.Id)
  120. return
  121. }
  122. }()
  123. } else {
  124. return errors.New("the mode is not correct")
  125. }
  126. return nil
  127. }
  128. //start task
  129. func StartTask(id int) error {
  130. if t, err := file.GetCsvDb().GetTask(id); err != nil {
  131. return err
  132. } else {
  133. AddTask(t)
  134. t.Status = true
  135. file.GetCsvDb().UpdateTask(t)
  136. }
  137. return nil
  138. }
  139. //delete task
  140. func DelTask(id int) error {
  141. if _, ok := RunList[id]; ok {
  142. if err := StopServer(id); err != nil {
  143. return err
  144. }
  145. }
  146. return file.GetCsvDb().DelTask(id)
  147. }
  148. //get task list by page num
  149. func GetTunnel(start, length int, typeVal string, clientId int) ([]*file.Tunnel, int) {
  150. list := make([]*file.Tunnel, 0)
  151. var cnt int
  152. for _, v := range file.GetCsvDb().Tasks {
  153. if (typeVal != "" && v.Mode != typeVal) || (typeVal == "" && clientId != v.Client.Id) {
  154. continue
  155. }
  156. cnt++
  157. if _, ok := Bridge.Client[v.Client.Id]; ok {
  158. v.Client.IsConnect = true
  159. } else {
  160. v.Client.IsConnect = false
  161. }
  162. if start--; start < 0 {
  163. if length--; length > 0 {
  164. if _, ok := RunList[v.Id]; ok {
  165. v.RunStatus = true
  166. } else {
  167. v.RunStatus = false
  168. }
  169. list = append(list, v)
  170. }
  171. }
  172. }
  173. return list, cnt
  174. }
  175. //获取客户端列表
  176. func GetClientList(start, length int) (list []*file.Client, cnt int) {
  177. list, cnt = file.GetCsvDb().GetClientList(start, length)
  178. dealClientData(list)
  179. return
  180. }
  181. func dealClientData(list []*file.Client) {
  182. for _, v := range list {
  183. if _, ok := Bridge.Client[v.Id]; ok {
  184. v.IsConnect = true
  185. } else {
  186. v.IsConnect = false
  187. }
  188. v.Flow.InletFlow = 0
  189. v.Flow.ExportFlow = 0
  190. for _, h := range file.GetCsvDb().Hosts {
  191. if h.Client.Id == v.Id {
  192. v.Flow.InletFlow += h.Flow.InletFlow
  193. v.Flow.ExportFlow += h.Flow.ExportFlow
  194. }
  195. }
  196. for _, t := range file.GetCsvDb().Tasks {
  197. if t.Client.Id == v.Id {
  198. v.Flow.InletFlow += t.Flow.InletFlow
  199. v.Flow.ExportFlow += t.Flow.ExportFlow
  200. }
  201. }
  202. }
  203. return
  204. }
  205. //根据客户端id删除其所属的所有隧道和域名
  206. func DelTunnelAndHostByClientId(clientId int) {
  207. var ids []int
  208. for _, v := range file.GetCsvDb().Tasks {
  209. if v.Client.Id == clientId {
  210. ids = append(ids, v.Id)
  211. }
  212. }
  213. for _, id := range ids {
  214. DelTask(id)
  215. }
  216. for _, v := range file.GetCsvDb().Hosts {
  217. if v.Client.Id == clientId {
  218. file.GetCsvDb().DelHost(v.Id)
  219. }
  220. }
  221. }
  222. //关闭客户端连接
  223. func DelClientConnect(clientId int) {
  224. Bridge.DelClient(clientId)
  225. }
  226. func GetDashboardData() map[string]int {
  227. data := make(map[string]int)
  228. data["hostCount"] = len(file.GetCsvDb().Hosts)
  229. data["clientCount"] = len(file.GetCsvDb().Clients)
  230. list := file.GetCsvDb().Clients
  231. dealClientData(list)
  232. c := 0
  233. var in, out int64
  234. for _, v := range list {
  235. if v.IsConnect {
  236. c += 1
  237. }
  238. in += v.Flow.InletFlow
  239. out += v.Flow.ExportFlow
  240. }
  241. data["clientOnlineCount"] = c
  242. data["inletFlowCount"] = int(in)
  243. data["exportFlowCount"] = int(out)
  244. for _, v := range file.GetCsvDb().Tasks {
  245. switch v.Mode {
  246. case "tcpServer":
  247. data["tcpServerCount"] += 1
  248. case "socks5Server":
  249. data["socks5ServerCount"] += 1
  250. case "httpProxyServer":
  251. data["httpProxyServerCount"] += 1
  252. case "udpServer":
  253. data["udpServerCount"] += 1
  254. }
  255. }
  256. return data
  257. }