server.go 5.5 KB

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