gameshieldbackend.go 7.1 KB

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