server.go 5.6 KB

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