server.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package server
  2. import (
  3. "errors"
  4. "github.com/cnlh/easyProxy/bridge"
  5. "github.com/cnlh/easyProxy/utils"
  6. "log"
  7. "reflect"
  8. "strings"
  9. "sync"
  10. )
  11. var (
  12. Bridge *bridge.Tunnel
  13. RunList map[string]interface{} //运行中的任务
  14. CsvDb *Csv
  15. VerifyKey string
  16. )
  17. func init() {
  18. RunList = make(map[string]interface{})
  19. }
  20. //从csv文件中恢复任务
  21. func InitFromCsv() {
  22. for _, v := range CsvDb.Tasks {
  23. if v.Start == 1 {
  24. log.Println("启动模式:", v.Mode, "监听端口:", v.TcpPort, "客户端令牌:", v.VerifyKey)
  25. AddTask(v)
  26. }
  27. }
  28. }
  29. //start a new server
  30. func StartNewServer(bridgePort int, cnf *ServerConfig) {
  31. Bridge = bridge.NewTunnel(bridgePort, RunList)
  32. if err := Bridge.StartTunnel(); err != nil {
  33. log.Fatalln("服务端开启失败", err)
  34. }
  35. if svr := NewMode(Bridge, cnf); svr != nil {
  36. RunList[cnf.VerifyKey] = svr
  37. err := reflect.ValueOf(svr).MethodByName("Start").Call(nil)[0]
  38. if err.Interface() != nil {
  39. log.Println(err)
  40. }
  41. } else {
  42. log.Fatalln("启动模式不正确")
  43. }
  44. }
  45. //new a server by mode name
  46. func NewMode(Bridge *bridge.Tunnel, config *ServerConfig) interface{} {
  47. switch config.Mode {
  48. case "tunnelServer":
  49. return NewTunnelModeServer(ProcessTunnel, Bridge, config)
  50. case "socks5Server":
  51. return NewSock5ModeServer(Bridge, config)
  52. case "httpProxyServer":
  53. return NewTunnelModeServer(ProcessHttp, Bridge, config)
  54. case "udpServer":
  55. return NewUdpModeServer(Bridge, config)
  56. case "webServer":
  57. InitCsvDb()
  58. InitFromCsv()
  59. //p, _ := beego.AppConfig.Int("hostPort")
  60. t := &ServerConfig{
  61. TcpPort: 8088,
  62. Mode: "httpHostServer",
  63. Target: "",
  64. VerifyKey: "",
  65. U: "",
  66. P: "",
  67. Compress: "",
  68. Start: 1,
  69. IsRun: 0,
  70. ClientStatus: 0,
  71. }
  72. AddTask(t)
  73. return NewWebServer(Bridge)
  74. case "hostServer":
  75. return NewHostServer(config)
  76. case "httpHostServer":
  77. return NewTunnelModeServer(ProcessHost, Bridge, config)
  78. }
  79. return nil
  80. }
  81. //stop server
  82. func StopServer(cFlag string) error {
  83. if v, ok := RunList[cFlag]; ok {
  84. reflect.ValueOf(v).MethodByName("Close").Call(nil)
  85. delete(RunList, cFlag)
  86. if VerifyKey == "" { //多客户端模式关闭相关隧道
  87. Bridge.DelClientSignal(cFlag)
  88. Bridge.DelClientTunnel(cFlag)
  89. }
  90. if t, err := CsvDb.GetTask(cFlag); err != nil {
  91. return err
  92. } else {
  93. t.Start = 0
  94. CsvDb.UpdateTask(t)
  95. }
  96. return nil
  97. }
  98. return errors.New("未在运行中")
  99. }
  100. //add task
  101. func AddTask(t *ServerConfig) error {
  102. t.CompressDecode, t.CompressEncode = utils.GetCompressType(t.Compress)
  103. if svr := NewMode(Bridge, t); svr != nil {
  104. RunList[t.VerifyKey] = svr
  105. go func() {
  106. err := reflect.ValueOf(svr).MethodByName("Start").Call(nil)[0]
  107. if err.Interface() != nil {
  108. log.Println("客户端", t.VerifyKey, "启动失败,错误:", err)
  109. delete(RunList, t.VerifyKey)
  110. }
  111. }()
  112. } else {
  113. return errors.New("启动模式不正确")
  114. }
  115. return nil
  116. }
  117. //start task
  118. func StartTask(vKey string) error {
  119. if t, err := CsvDb.GetTask(vKey); err != nil {
  120. return err
  121. } else {
  122. AddTask(t)
  123. t.Start = 1
  124. CsvDb.UpdateTask(t)
  125. }
  126. return nil
  127. }
  128. //delete task
  129. func DelTask(vKey string) error {
  130. if err := StopServer(vKey); err != nil {
  131. return err
  132. }
  133. return CsvDb.DelTask(vKey)
  134. }
  135. //init csv from file
  136. func InitCsvDb() *Csv {
  137. var once sync.Once
  138. once.Do(func() {
  139. CsvDb = NewCsv(RunList)
  140. CsvDb.Init()
  141. })
  142. return CsvDb
  143. }
  144. //get key by host from x
  145. func GetKeyByHost(host string) (h *HostList, t *ServerConfig, err error) {
  146. for _, v := range CsvDb.Hosts {
  147. if strings.Contains(host, v.Host) {
  148. h = v
  149. t, err = CsvDb.GetTask(v.Vkey)
  150. return
  151. }
  152. }
  153. err = errors.New("未找到host对应的内网目标")
  154. return
  155. }
  156. //get task list by page num
  157. func GetServerConfig(start, length int, typeVal string) ([]*ServerConfig, int) {
  158. list := make([]*ServerConfig, 0)
  159. var cnt int
  160. for _, v := range CsvDb.Tasks {
  161. if v.Mode != typeVal {
  162. continue
  163. }
  164. cnt++
  165. if start--; start < 0 {
  166. if length--; length > 0 {
  167. if _, ok := RunList[v.VerifyKey]; ok {
  168. v.IsRun = 1
  169. } else {
  170. v.IsRun = 0
  171. }
  172. if s, ok := Bridge.SignalList[getverifyval(v.VerifyKey)]; ok {
  173. if s.Len() > 0 {
  174. v.ClientStatus = 1
  175. } else {
  176. v.ClientStatus = 0
  177. }
  178. } else {
  179. v.ClientStatus = 0
  180. }
  181. list = append(list, v)
  182. }
  183. }
  184. }
  185. return list, cnt
  186. }
  187. //get verify value
  188. //when mode is webServer and vKey is not none
  189. func getverifyval(vkey string) string {
  190. if VerifyKey != "" {
  191. return utils.Md5(VerifyKey)
  192. }
  193. return utils.Md5(vkey)
  194. }