tcplimit.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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/cast"
  9. "strconv"
  10. )
  11. type TcpLimitService interface {
  12. GetTcpLimit(ctx context.Context, id int64) (*model.TcpLimit, error)
  13. AddTcpLimit(ctx context.Context, req *v1.GeneralLimitRequireRequest) (int, error)
  14. UpdateTcpLimit(ctx context.Context, req *v1.TcpLimitSendRequest) error
  15. DeleteTcpLimit(ctx context.Context, TcpWebLimitId int) (string, error)
  16. }
  17. func NewTcpLimitService(
  18. service *Service,
  19. tcpLimitRepository repository.TcpLimitRepository,
  20. required RequiredService,
  21. parser ParserService,
  22. crawler CrawlerService,
  23. host HostService,
  24. ) TcpLimitService {
  25. return &tcpLimitService{
  26. Service: service,
  27. tcpLimitRepository: tcpLimitRepository,
  28. required: required,
  29. parser: parser,
  30. crawler: crawler,
  31. host: host,
  32. }
  33. }
  34. type tcpLimitService struct {
  35. *Service
  36. tcpLimitRepository repository.TcpLimitRepository
  37. required RequiredService
  38. parser ParserService
  39. crawler CrawlerService
  40. host HostService
  41. }
  42. func (s *tcpLimitService) GetTcpLimit(ctx context.Context, id int64) (*model.TcpLimit, error) {
  43. return s.tcpLimitRepository.GetTcpLimit(ctx, id)
  44. }
  45. func (s *tcpLimitService) Required(ctx context.Context, req v1.GeneralLimitRequireRequest) (*v1.TcpLimitSendRequest, error) {
  46. configCount, err := s.host.GetTcpLimitConfig(ctx, req.HostId)
  47. if err != nil {
  48. return nil, fmt.Errorf("获取配置限制失败: %w", err)
  49. }
  50. return &v1.TcpLimitSendRequest{
  51. Tag: req.Tag,
  52. ConnCount: configCount.ConnCount,
  53. ConnDuration: configCount.ConnDuration,
  54. MaxConnCount: configCount.MaxConnCount,
  55. RuleId: req.RuleId,
  56. }, nil
  57. }
  58. func (s *tcpLimitService) AddTcpLimit(ctx context.Context, req *v1.GeneralLimitRequireRequest) (int, error) {
  59. required, err := s.Required(ctx, *req)
  60. if err != nil {
  61. return 0, err
  62. }
  63. formData := map[string]interface{}{
  64. "tag": req.Tag,
  65. "conn_count": required.ConnCount,
  66. "conn_duration": required.ConnDuration,
  67. "max_conn_count": required.MaxConnCount,
  68. "waf_common_limit_id": required.RuleId,
  69. "comment": "",
  70. }
  71. respBody, err := s.required.SendForm(ctx, "admin/info/waf_tcp_limit/new", "admin/new/waf_tcp_limit", formData)
  72. if err != nil {
  73. return 0, err
  74. }
  75. // 解析响应内容中的 alert 消息
  76. res, err := s.parser.ParseAlert(string(respBody))
  77. if err != nil {
  78. return 0, err
  79. }
  80. if res != "" {
  81. return 0, fmt.Errorf(res)
  82. }
  83. tcpLimitIdBase, err := s.parser.GetRuleIdByColumnName(ctx, respBody, req.Tag)
  84. if err != nil {
  85. return 0, err
  86. }
  87. tcpLimitId, err := cast.ToIntE(tcpLimitIdBase)
  88. if err != nil {
  89. return 0, err
  90. }
  91. if tcpLimitId == 0 {
  92. res, err := s.parser.ParseAlert(string(respBody))
  93. if err != nil {
  94. return 0, err
  95. }
  96. return 0, fmt.Errorf(res)
  97. }
  98. return tcpLimitId, nil
  99. }
  100. func (s *tcpLimitService) UpdateTcpLimit(ctx context.Context, req *v1.TcpLimitSendRequest) error {
  101. formData := map[string]interface{}{
  102. "tag": req.Tag,
  103. "conn_count": req.ConnCount,
  104. "conn_duration": req.ConnDuration,
  105. "max_conn_count": req.MaxConnCount,
  106. "waf_common_limit_id": req.RuleId,
  107. "comment": "",
  108. }
  109. respBody, err := s.required.SendForm(ctx, "admin/info/waf_tcp_limit/edit?&__goadmin_edit_pk="+strconv.Itoa(req.WafTcpLimitId), "admin/edit/waf_tcp_limit", formData)
  110. if err != nil {
  111. return err
  112. }
  113. // 解析响应内容中的 alert 消息
  114. res, err := s.parser.ParseAlert(string(respBody))
  115. if err != nil {
  116. return err
  117. }
  118. if res != "" {
  119. return fmt.Errorf(res)
  120. }
  121. return nil
  122. }
  123. func (s *tcpLimitService) DeleteTcpLimit(ctx context.Context, TcpWebLimitId int) (string, error) {
  124. res, err := s.crawler.DeleteRule(ctx, TcpWebLimitId, "admin/delete/waf_tcp_limit?page=1&__pageSize=10&__sort=waf_tcp_limit_id&__sort_type=desc")
  125. if err != nil {
  126. return "", err
  127. }
  128. return res, nil
  129. }