init.go 5.0 KB

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