gameshieldbackend.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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, id int64) 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. return &res, count, nil
  88. }
  89. func (s *gameShieldBackendService) GetGameShieldBackend(ctx context.Context, id int64) (*model.GameShieldBackend, error) {
  90. res, err := s.gameShieldBackendRepository.GetGameShieldBackendById(ctx, id)
  91. if err != nil {
  92. return nil, err
  93. }
  94. return res, nil
  95. }
  96. func (s *gameShieldBackendService) GameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, int, error) {
  97. require, count, err := s.GetGameShieldRequired(ctx, req)
  98. if err != nil {
  99. return "", 0, err
  100. }
  101. tokenUrl := s.Url + "admin/info/rule/edit?&__goadmin_edit_pk=" + strconv.Itoa(require.RuleId) + "_" + req.AppName
  102. tokens, err := s.crawlerService.GetFormTokens(ctx, tokenUrl, require.Cookie)
  103. if err != nil {
  104. return "", 0, err
  105. }
  106. dunName := strconv.Itoa(req.Uid) + "_" + strconv.FormatInt(time.Now().Unix(), 10) + "_" + req.AppName
  107. formData := map[string]interface{}{
  108. "app_name": dunName,
  109. "gateway_group_id": 4,
  110. "backend": require.Backend,
  111. "rule_id": require.RuleId,
  112. "expired_at": require.ExpiredAt,
  113. "max_device_count": 0,
  114. "__go_admin_previous_": tokens["previous"],
  115. "__go_admin_t_": tokens["t"],
  116. }
  117. sendUrl := s.Url + "admin/edit/rule"
  118. respBody, err := s.crawlerService.SendFormData(ctx, sendUrl, require.Cookie, formData)
  119. if err != nil {
  120. return "", 0, err
  121. }
  122. // 解析响应内容中的 alert 消息
  123. res, err := s.parser.ParseAlert(string(respBody))
  124. if err != nil {
  125. return "", 0, err
  126. }
  127. if res != "" {
  128. return "", 0, fmt.Errorf(res)
  129. }
  130. KeyAndField, err := s.required.GetKeyAndField(ctx, dunName, "rule_id")
  131. if err != nil {
  132. return "", 0, err
  133. }
  134. if err := s.gameShieldRepository.UpdateGameShieldByHostId(ctx, &model.GameShield{Id: req.HostId, Key: KeyAndField.Key, DunName: dunName}); err != nil {
  135. return "", 0, err
  136. }
  137. return res, count, nil
  138. }
  139. func (s *gameShieldBackendService) AddGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error) {
  140. res, count, err := s.GameShieldBackend(ctx, req)
  141. if err != nil {
  142. return "", err
  143. }
  144. saveData, err := s.formatter.TidyFormatBackendData(ctx, req, count)
  145. if err != nil {
  146. return "", err
  147. }
  148. if err := s.SaveGameShieldBackend(ctx, saveData, req.HostId); err != nil {
  149. return "", err
  150. }
  151. return res, nil
  152. }
  153. func (s *gameShieldBackendService) EditGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error) {
  154. for _, v := range req.Items {
  155. if err := s.gameShieldBackendRepository.EditGameShieldBackend(ctx, &v); err != nil {
  156. return "", err
  157. }
  158. }
  159. res, _, err := s.GameShieldBackend(ctx, req)
  160. if err != nil {
  161. return "", err
  162. }
  163. return res, nil
  164. }
  165. func (s *gameShieldBackendService) DeleteGameShieldBackend(ctx context.Context, id int64) error {
  166. if err := s.gameShieldBackendRepository.DeleteGameShieldBackend(ctx, id); err != nil {
  167. return err
  168. }
  169. return nil
  170. }
  171. func (s *gameShieldBackendService) SaveGameShieldBackend(ctx context.Context, req map[string]v1.SendGameShieldBackend, hostId int) error {
  172. for k, v := range req {
  173. parts := strings.Split(v.Addr[0], ":")
  174. keyName := strings.Split(k, "key")[1]
  175. key, err := strconv.Atoi(keyName)
  176. if err != nil {
  177. return err
  178. }
  179. if err := s.gameShieldBackendRepository.AddGameShieldBackend(ctx,
  180. &model.GameShieldBackend{
  181. HostId: hostId,
  182. Key: key,
  183. SourceMachineIP: parts[0],
  184. Protocol: v.Protocol,
  185. ProxyAddr: v.ProxyAddr,
  186. ConnectPort: parts[1],
  187. PublicIp: v.SdkIp,
  188. SdkPort: strconv.Itoa(v.SdkPort),
  189. // 可以添加其他字段
  190. }); err != nil {
  191. return err
  192. }
  193. }
  194. return nil
  195. }