gameshieldbackend.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  7. "github.com/go-nunu/nunu-layout-advanced/internal/repository"
  8. "github.com/spf13/viper"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. type GameShieldBackendService interface {
  14. GetGameShieldBackend(ctx context.Context, id int64) (*model.GameShieldBackend, error)
  15. GameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, int, error)
  16. AddGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error)
  17. EditGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error)
  18. DeleteGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error)
  19. GetGameShieldRequired(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (*v1.GetGameShieldRequiredResponse, int, error)
  20. }
  21. func NewGameShieldBackendService(
  22. service *Service,
  23. gameShieldBackendRepository repository.GameShieldBackendRepository,
  24. gameShieldRepository repository.GameShieldRepository,
  25. crawlerService CrawlerService,
  26. gameShieldPublicIpService GameShieldPublicIpService,
  27. duedate DuedateService,
  28. formatter FormatterService,
  29. parser ParserService,
  30. required RequiredService,
  31. conf *viper.Viper,
  32. ) GameShieldBackendService {
  33. return &gameShieldBackendService{
  34. Service: service,
  35. gameShieldBackendRepository: gameShieldBackendRepository,
  36. gameShieldRepository: gameShieldRepository,
  37. crawlerService: crawlerService,
  38. gameShieldPublicIpService: gameShieldPublicIpService,
  39. duedate: duedate,
  40. formatter: formatter,
  41. parser: parser,
  42. required: required,
  43. Url: conf.GetString("crawler.Url"),
  44. }
  45. }
  46. type gameShieldBackendService struct {
  47. *Service
  48. gameShieldBackendRepository repository.GameShieldBackendRepository
  49. crawlerService CrawlerService
  50. gameShieldRepository repository.GameShieldRepository
  51. gameShieldPublicIpService GameShieldPublicIpService
  52. duedate DuedateService
  53. formatter FormatterService
  54. Url string
  55. parser ParserService
  56. required RequiredService
  57. }
  58. func (s *gameShieldBackendService) GetGameShieldRequired(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (*v1.GetGameShieldRequiredResponse, int, error) {
  59. var res v1.GetGameShieldRequiredResponse
  60. var err error
  61. var count int
  62. if req.Uid == 0 {
  63. return nil, 0, fmt.Errorf("uid is required")
  64. }
  65. res.ExpiredAt, err = s.duedate.NextDueDate(ctx, req.Uid, strconv.Itoa(req.HostId))
  66. if err != nil {
  67. return nil, 0, err
  68. }
  69. gameShield, err := s.gameShieldRepository.GetGameShieldByHostId(ctx, req.HostId)
  70. if err != nil {
  71. return nil, 0, err
  72. }
  73. res.RuleId = gameShield.RuleId
  74. oldBackend, err := s.gameShieldBackendRepository.GetGameShieldBackendByHostId(ctx, req.HostId)
  75. if err != nil {
  76. return nil, 0, err
  77. }
  78. OldBackend, err := s.formatter.OldFormat(ctx, oldBackend)
  79. res.Backend, count, err = s.formatter.FormatBackendData(ctx, req, OldBackend)
  80. if err != nil {
  81. return nil, 0, err
  82. }
  83. res.Cookie, err = s.crawlerService.GetLoginCookie(ctx)
  84. if err != nil {
  85. return nil, 0, err
  86. }
  87. res.Domain, err = s.gameShieldRepository.GetHostById(ctx, req.HostId)
  88. return &res, count, nil
  89. }
  90. func (s *gameShieldBackendService) GetGameShieldBackend(ctx context.Context, id int64) (*model.GameShieldBackend, error) {
  91. res, err := s.gameShieldBackendRepository.GetGameShieldBackendById(ctx, id)
  92. if err != nil {
  93. return nil, err
  94. }
  95. return res, nil
  96. }
  97. func (s *gameShieldBackendService) GameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, int, error) {
  98. require, count, err := s.GetGameShieldRequired(ctx, req)
  99. if err != nil {
  100. return "", 0, err
  101. }
  102. tokenUrl := s.Url + "admin/info/rule/edit?&__goadmin_edit_pk=" + strconv.Itoa(require.RuleId) + "_" + require.Domain
  103. tokens, err := s.crawlerService.GetFormTokens(ctx, tokenUrl, require.Cookie)
  104. if err != nil {
  105. return "", 0, err
  106. }
  107. dunName := strconv.Itoa(req.Uid) + "_" + strconv.FormatInt(time.Now().Unix(), 10) + "_" + require.Domain
  108. formData := map[string]interface{}{
  109. "app_name": dunName,
  110. "gateway_group_id": 4,
  111. "backend": require.Backend,
  112. "rule_id": require.RuleId,
  113. "expired_at": require.ExpiredAt,
  114. "max_device_count": 0,
  115. "__go_admin_previous_": tokens["previous"],
  116. "__go_admin_t_": tokens["t"],
  117. }
  118. sendUrl := s.Url + "admin/edit/rule"
  119. respBody, err := s.crawlerService.SendFormData(ctx, sendUrl, require.Cookie, formData)
  120. if err != nil {
  121. return "", 0, err
  122. }
  123. // 解析响应内容中的 alert 消息
  124. res, err := s.parser.ParseAlert(string(respBody))
  125. if err != nil {
  126. return "", 0, err
  127. }
  128. if res != "" {
  129. return "", 0, fmt.Errorf(res)
  130. }
  131. KeyAndField, err := s.required.GetKeyAndField(ctx, dunName, "rule_id")
  132. if err != nil {
  133. return "", 0, err
  134. }
  135. if err := s.gameShieldRepository.UpdateGameShieldByHostId(ctx, &model.GameShield{Id: req.HostId, Key: KeyAndField.Key, DunName: dunName}); err != nil {
  136. return "", 0, err
  137. }
  138. return res, count, nil
  139. }
  140. func (s *gameShieldBackendService) AddGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error) {
  141. res, count, err := s.GameShieldBackend(ctx, req)
  142. if err != nil {
  143. return "", err
  144. }
  145. saveData, err := s.formatter.TidyFormatBackendData(ctx, req, count)
  146. if err != nil {
  147. return "", err
  148. }
  149. if err := s.SaveGameShieldBackend(ctx, saveData, req.HostId); err != nil {
  150. return "", err
  151. }
  152. return res, nil
  153. }
  154. func (s *gameShieldBackendService) EditGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error) {
  155. for _, v := range req.Items {
  156. if err := s.gameShieldBackendRepository.EditGameShieldBackend(ctx, &v); err != nil {
  157. return "", err
  158. }
  159. }
  160. res, _, err := s.GameShieldBackend(ctx, req)
  161. if err != nil {
  162. return "", err
  163. }
  164. return res, nil
  165. }
  166. func (s *gameShieldBackendService) DeleteGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error) {
  167. for _, v := range req.Items {
  168. if err := s.gameShieldBackendRepository.DeleteGameShieldBackend(ctx, int64(v.Id)); err != nil {
  169. return "", err
  170. }
  171. }
  172. res, _, err := s.GameShieldBackend(ctx, req)
  173. if err != nil {
  174. return "", err
  175. }
  176. return res, nil
  177. }
  178. func (s *gameShieldBackendService) SaveGameShieldBackend(ctx context.Context, req map[string]v1.SendGameShieldBackend, hostId int) error {
  179. for k, v := range req {
  180. parts := strings.Split(v.Addr[0], ":")
  181. keyName := strings.Split(k, "key")[1]
  182. key, err := strconv.Atoi(keyName)
  183. if err != nil {
  184. return err
  185. }
  186. if v.ProxyAddr == "127.0.0.1" {
  187. v.Type = "mobile"
  188. } else {
  189. v.Type = "pc"
  190. }
  191. if err := s.gameShieldBackendRepository.AddGameShieldBackend(ctx,
  192. &model.GameShieldBackend{
  193. HostId: hostId,
  194. KeySort: key,
  195. SourceMachineIP: parts[0],
  196. Protocol: v.Protocol,
  197. ProxyAddr: v.ProxyAddr,
  198. ConnectPort: parts[1],
  199. SdkIp: v.SdkIp,
  200. SdkPort: strconv.Itoa(v.SdkPort),
  201. // 可以添加其他字段
  202. }); err != nil {
  203. return err
  204. }
  205. }
  206. return nil
  207. }