1
0

init.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package lib
  2. import (
  3. "errors"
  4. "flag"
  5. "log"
  6. "net/http"
  7. _ "net/http/pprof"
  8. "reflect"
  9. "strings"
  10. "sync"
  11. )
  12. var (
  13. configPath = flag.String("config", "config.json", "配置文件路径")
  14. TcpPort = flag.Int("tcpport", 8284, "客户端与服务端通信端口")
  15. httpPort = flag.Int("httpport", 8024, "对外监听的端口")
  16. rpMode = flag.String("mode", "client", "启动模式")
  17. tunnelTarget = flag.String("target", "10.1.50.203:80", "远程目标")
  18. verifyKey = flag.String("vkey", "", "验证密钥")
  19. u = flag.String("u", "", "验证用户名(socks5和web)")
  20. p = flag.String("p", "", "验证密码(socks5和web)")
  21. compress = flag.String("compress", "", "数据压缩方式(snappy)")
  22. serverAddr = flag.String("server", "", "服务器地址ip:端口")
  23. crypt = flag.String("crypt", "false", "是否加密(true|false)")
  24. mux = flag.String("mux", "false", "是否TCP多路复用(true|false)")
  25. config Config
  26. err error
  27. RunList map[string]interface{} //运行中的任务
  28. bridge *Tunnel
  29. CsvDb *Csv
  30. )
  31. const cryptKey = "1234567812345678"
  32. func init() {
  33. RunList = make(map[string]interface{})
  34. }
  35. func InitClient() {
  36. flag.Parse()
  37. if *rpMode == "client" {
  38. go func() {
  39. http.ListenAndServe("0.0.0.0:8899", nil)
  40. }()
  41. JsonParse := NewJsonStruct()
  42. if config, err = JsonParse.Load(*configPath); err != nil {
  43. log.Println("配置文件加载失败")
  44. }
  45. stop := make(chan int)
  46. for _, v := range strings.Split(*verifyKey, ",") {
  47. log.Println("客户端启动,连接:", *serverAddr, " 验证令牌:", v)
  48. go NewRPClient(*serverAddr, 1, v).Start()
  49. }
  50. <-stop
  51. }
  52. }
  53. func InitMode() {
  54. flag.Parse()
  55. if *rpMode == "client" {
  56. go func() {
  57. http.ListenAndServe("0.0.0.0:8899", nil)
  58. }()
  59. JsonParse := NewJsonStruct()
  60. if config, err = JsonParse.Load(*configPath); err != nil {
  61. log.Println("配置文件加载失败")
  62. }
  63. stop := make(chan int)
  64. for _, v := range strings.Split(*verifyKey, ",") {
  65. log.Println("客户端启动,连接:", *serverAddr, " 验证令牌:", v)
  66. go NewRPClient(*serverAddr, 1, v).Start()
  67. }
  68. <-stop
  69. } else {
  70. bridge = newTunnel(*TcpPort)
  71. if err := bridge.StartTunnel(); err != nil {
  72. log.Fatalln("服务端开启失败", err)
  73. }
  74. log.Println("服务端启动,监听tcp服务端端口:", *TcpPort)
  75. cnf := ServerConfig{
  76. TcpPort: *httpPort,
  77. Mode: *rpMode,
  78. Target: *tunnelTarget,
  79. VerifyKey: *verifyKey,
  80. U: *u,
  81. P: *p,
  82. Compress: *compress,
  83. Start: 0,
  84. IsRun: 0,
  85. ClientStatus: 0,
  86. Crypt: GetBoolByStr(*crypt),
  87. Mux: GetBoolByStr(*mux),
  88. CompressEncode: 0,
  89. CompressDecode: 0,
  90. }
  91. cnf.CompressDecode, cnf.CompressEncode = getCompressType(cnf.Compress)
  92. if svr := newMode(bridge, &cnf);
  93. svr != nil {
  94. reflect.ValueOf(svr).MethodByName("Start").Call(nil)
  95. } else {
  96. log.Fatalln("启动模式不正确")
  97. }
  98. }
  99. }
  100. //从csv文件中恢复任务
  101. func InitFromCsv() {
  102. for _, v := range CsvDb.Tasks {
  103. if v.Start == 1 {
  104. log.Println(""+
  105. "启动模式:", v.Mode, "监听端口:", v.TcpPort, "客户端令牌:", v.VerifyKey)
  106. AddTask(v)
  107. }
  108. }
  109. }
  110. func newMode(bridge *Tunnel, config *ServerConfig) interface{} {
  111. switch config.Mode {
  112. case "httpServer":
  113. return NewHttpModeServer(bridge, config)
  114. case "tunnelServer":
  115. return NewTunnelModeServer(ProcessTunnel, bridge, config)
  116. case "socks5Server":
  117. return NewSock5ModeServer(bridge, config)
  118. case "httpProxyServer":
  119. return NewTunnelModeServer(ProcessHttp, bridge, config)
  120. case "udpServer":
  121. return NewUdpModeServer(bridge, config)
  122. case "webServer":
  123. InitCsvDb()
  124. return NewWebServer(bridge)
  125. case "hostServer":
  126. return NewHostServer(config)
  127. case "httpHostServer":
  128. return NewTunnelModeServer(ProcessHost, bridge, config)
  129. }
  130. return nil
  131. }
  132. func StopServer(cFlag string) error {
  133. if v, ok := RunList[cFlag]; ok {
  134. reflect.ValueOf(v).MethodByName("Close").Call(nil)
  135. delete(RunList, cFlag)
  136. if *verifyKey == "" { //多客户端模式关闭相关隧道
  137. bridge.DelClientSignal(cFlag)
  138. bridge.DelClientTunnel(cFlag)
  139. }
  140. if t, err := CsvDb.GetTask(cFlag); err != nil {
  141. return err
  142. } else {
  143. t.Start = 0
  144. CsvDb.UpdateTask(t)
  145. }
  146. return nil
  147. }
  148. return errors.New("未在运行中")
  149. }
  150. func AddTask(t *ServerConfig) error {
  151. t.CompressDecode, t.CompressEncode = getCompressType(t.Compress)
  152. if svr := newMode(bridge, t); svr != nil {
  153. RunList[t.VerifyKey] = svr
  154. go func() {
  155. err := reflect.ValueOf(svr).MethodByName("Start").Call(nil)[0]
  156. if err.Interface() != nil {
  157. log.Println("客户端", t.VerifyKey, "启动失败,错误:", err)
  158. delete(RunList, t.VerifyKey)
  159. }
  160. }()
  161. } else {
  162. return errors.New("启动模式不正确")
  163. }
  164. return nil
  165. }
  166. func StartTask(vKey string) error {
  167. if t, err := CsvDb.GetTask(vKey); err != nil {
  168. return err
  169. } else {
  170. AddTask(t)
  171. t.Start = 1
  172. CsvDb.UpdateTask(t)
  173. }
  174. return nil
  175. }
  176. func DelTask(vKey string) error {
  177. if err := StopServer(vKey); err != nil {
  178. return err
  179. }
  180. return CsvDb.DelTask(vKey)
  181. }
  182. func InitCsvDb() *Csv {
  183. var once sync.Once
  184. once.Do(func() {
  185. CsvDb = NewCsv( bridge, RunList)
  186. CsvDb.Init()
  187. })
  188. return CsvDb
  189. }