ForwardServer.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package Service
  2. import (
  3. "fmt"
  4. "forward-core/Constant"
  5. "forward-core/Models"
  6. "net"
  7. "sync"
  8. "github.com/astaxie/beego/logs"
  9. )
  10. type ForWardServer struct {
  11. JobMap map[string]*ForWardJob
  12. JobMapLock sync.Mutex
  13. }
  14. func NewForWardServer() *ForWardServer {
  15. return &ForWardServer{
  16. JobMap: make(map[string]*ForWardJob, 200),
  17. }
  18. }
  19. func (_self *ForWardServer) FindAllForward() []*Models.ForwardInfo {
  20. var forwardList []*Models.ForwardInfo
  21. for _, forWardJob := range _self.JobMap {
  22. forwardInfo := new(Models.ForwardInfo)
  23. forwardInfo.Name = forWardJob.Config.Name
  24. forwardInfo.Status = forWardJob.Status
  25. forwardInfo.Protocol = forWardJob.Config.Protocol
  26. forwardInfo.SrcAddr = forWardJob.Config.SrcAddr
  27. forwardInfo.SrcPort = forWardJob.Config.SrcPort
  28. forwardInfo.DestAddr = forWardJob.Config.DestAddr
  29. forwardInfo.DestPort = forWardJob.Config.DestPort
  30. if forWardJob.IsUdpJob() {
  31. for key, _ := range forWardJob.UdpForwardJob.UdpConns {
  32. forwardInfo.Clients = append(forwardInfo.Clients, key)
  33. }
  34. } else {
  35. for _, client := range forWardJob.ClientMap {
  36. forwardInfo.Clients = append(forwardInfo.Clients, client.SrcConn.RemoteAddr().String())
  37. }
  38. }
  39. forwardInfo.OnlineCount = len(forwardInfo.Clients)
  40. forwardList = append(forwardList, forwardInfo)
  41. }
  42. return forwardList
  43. }
  44. func (_self *ForWardServer) GetForwardInfo(config *Models.ForwardConfig) *Models.ForwardInfo {
  45. forwardInfo := new(Models.ForwardInfo)
  46. forWardJob := _self.GetRegistryJob(config)
  47. if forWardJob != nil {
  48. forwardInfo.Name = forWardJob.Config.Name
  49. forwardInfo.Status = forWardJob.Status
  50. forwardInfo.Protocol = forWardJob.Config.Protocol
  51. forwardInfo.SrcAddr = forWardJob.Config.SrcAddr
  52. forwardInfo.SrcPort = forWardJob.Config.SrcPort
  53. forwardInfo.DestAddr = forWardJob.Config.DestAddr
  54. forwardInfo.DestPort = forWardJob.Config.DestPort
  55. for _, client := range forWardJob.ClientMap {
  56. forwardInfo.Clients = append(forwardInfo.Clients, client.SrcConn.RemoteAddr().String())
  57. }
  58. forwardInfo.OnlineCount = len(forwardInfo.Clients)
  59. }
  60. return forwardInfo
  61. }
  62. func (_self *ForWardServer) GetForwardJob(config *Models.ForwardConfig) *ForWardJob {
  63. return _self.GetRegistryJob(config)
  64. }
  65. func (_self *ForWardServer) OpenForward(config *Models.ForwardConfig, result chan Models.FuncResult) {
  66. hasJob := _self.GetForwardJob(config)
  67. if hasJob != nil && hasJob.Status == Constant.RunStatus_Running {
  68. resultData := &Models.FuncResult{Code: 1, Msg: "该端口转发正在执行中"}
  69. result <- *resultData
  70. return
  71. }
  72. forWardJob := new(ForWardJob)
  73. forWardJob.ClientMap = make(map[string]*ForWardClient, 500)
  74. forWardJob.Config = config
  75. forWardJob.UdpForwardJob = NewUdpForward()
  76. go forWardJob.StartJob(result)
  77. _self.RegistryJob(config, forWardJob)
  78. }
  79. func (_self *ForWardServer) GetJobKey(config *Models.ForwardConfig) string {
  80. srcAddr := fmt.Sprint(config.SrcAddr, ":", config.SrcPort)
  81. destAddr := fmt.Sprint(config.DestAddr, ":", config.DestPort)
  82. return fmt.Sprint(srcAddr, "_", config.Protocol, "_", destAddr)
  83. }
  84. func (_self *ForWardServer) GetClientId(conn net.Conn) string {
  85. return conn.RemoteAddr().String()
  86. }
  87. func (_self *ForWardServer) RegistryJob(config *Models.ForwardConfig, forWardJob *ForWardJob) {
  88. _self.JobMapLock.Lock()
  89. defer _self.JobMapLock.Unlock()
  90. _self.JobMap[_self.GetJobKey(config)] = forWardJob
  91. }
  92. func (_self *ForWardServer) UnRegistryJob(config *Models.ForwardConfig) {
  93. _self.JobMapLock.Lock()
  94. defer _self.JobMapLock.Unlock()
  95. key := _self.GetJobKey(config)
  96. delete(_self.JobMap, key)
  97. if ForWardDebug == true {
  98. logs.Debug("UnRegistryClient key: ", key)
  99. }
  100. }
  101. func (_self *ForWardServer) GetRegistryJob(config *Models.ForwardConfig) *ForWardJob {
  102. if forWardJob, ok := _self.JobMap[_self.GetJobKey(config)]; ok {
  103. return forWardJob
  104. }
  105. return nil
  106. }
  107. func (_self *ForWardServer) CloseForward(config *Models.ForwardConfig) {
  108. forWardJob := _self.GetRegistryJob(config)
  109. if forWardJob != nil {
  110. logs.Debug("停止转发,找到执行者:", _self.GetJobKey(config))
  111. forWardJob.StopJob()
  112. _self.UnRegistryJob(config)
  113. }
  114. }
  115. func (_self *ForWardServer) CloseAllForward() {
  116. for _, forWardJob := range _self.JobMap {
  117. forWardJob.StopJob()
  118. //delete(_self.JobMap, key)
  119. _self.UnRegistryJob(forWardJob.Config)
  120. }
  121. //_self.JobMap = nil
  122. _self.JobMap = make(map[string]*ForWardJob, 200)
  123. }
粤ICP备19079148号