webforwarding.go 4.7 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. "strconv"
  9. )
  10. type WebForwardingService interface {
  11. GetWebForwarding(ctx context.Context, id int64) (*model.WebForwarding, error)
  12. AddWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error)
  13. EditWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error)
  14. DeleteWebForwarding(ctx context.Context, wafWebId int) (string, error)
  15. }
  16. func NewWebForwardingService(
  17. service *Service,
  18. required RequiredService,
  19. webForwardingRepository repository.WebForwardingRepository,
  20. crawler CrawlerService,
  21. parser ParserService,
  22. ) WebForwardingService {
  23. return &webForwardingService{
  24. Service: service,
  25. webForwardingRepository: webForwardingRepository,
  26. required: required,
  27. parser: parser,
  28. crawler: crawler,
  29. }
  30. }
  31. type webForwardingService struct {
  32. *Service
  33. webForwardingRepository repository.WebForwardingRepository
  34. required RequiredService
  35. parser ParserService
  36. crawler CrawlerService
  37. }
  38. func (s *webForwardingService) GetWebForwarding(ctx context.Context, id int64) (*model.WebForwarding, error) {
  39. return s.webForwardingRepository.GetWebForwarding(ctx, id)
  40. }
  41. func (s *webForwardingService) AddWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error) {
  42. formData := map[string]interface{}{
  43. "tag": req.Tag,
  44. "port": req.Port,
  45. "waf_gateway_group_id": req.WafGatewayGroupId,
  46. "backend": req.Backend,
  47. "is_https": req.IsHttps,
  48. "bps": req.QpsCount,
  49. "max_bytes_month": req.MaxBytesMonth,
  50. "qps_count": req.QpsCount,
  51. "qps_duration": req.QpsDuration,
  52. "cc_count": req.CcCount,
  53. "cc_duration": req.CcDuration,
  54. "cc_block_count": req.CcBlockCount,
  55. "cc_block_duration": req.CcBlockDuration,
  56. "cc_4xx_count": req.Cc4xxCount,
  57. "cc_4xx_duration": req.Cc4xxDuration,
  58. "cc_4xx_block_count": req.Cc4xxBlockCount,
  59. "cc_4xx_block_duration": req.Cc4xxBlockDuration,
  60. "cc_5xx_count": req.Cc5xxCount,
  61. "cc_5xx_duration": req.Cc5xxDuration,
  62. "cc_5xx_block_count": req.Cc5xxBlockCount,
  63. "cc_5xx_block_duration": req.Cc5xxBlockDuration,
  64. }
  65. respBody, err := s.required.SendForm(ctx, "admin/info/waf_web/new", "admin/new/waf_web", formData)
  66. if err != nil {
  67. return "", err
  68. }
  69. // 解析响应内容中的 alert 消息
  70. res, err := s.parser.ParseAlert(string(respBody))
  71. if err != nil {
  72. return "", err
  73. }
  74. if res != "" {
  75. return "", fmt.Errorf(res)
  76. }
  77. wafWebId, err := s.parser.GetRuleId(ctx, respBody)
  78. if err != nil {
  79. return "", err
  80. }
  81. fmt.Println("=================================================", wafWebId)
  82. return "", nil
  83. }
  84. func (s *webForwardingService) EditWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error) {
  85. formData := map[string]interface{}{
  86. "waf_web_id": req.WafWebId,
  87. "tag": req.Tag,
  88. "port": req.Port,
  89. "waf_gateway_group_id": req.WafGatewayGroupId,
  90. "backend": req.Backend,
  91. "is_https": req.IsHttps,
  92. "bps": req.QpsCount,
  93. "max_bytes_month": req.MaxBytesMonth,
  94. "qps_count": req.QpsCount,
  95. "qps_duration": req.QpsDuration,
  96. "cc_count": req.CcCount,
  97. "cc_duration": req.CcDuration,
  98. "cc_block_count": req.CcBlockCount,
  99. "cc_block_duration": req.CcBlockDuration,
  100. "cc_4xx_count": req.Cc4xxCount,
  101. "cc_4xx_duration": req.Cc4xxDuration,
  102. "cc_4xx_block_count": req.Cc4xxBlockCount,
  103. "cc_4xx_block_duration": req.Cc4xxBlockDuration,
  104. "cc_5xx_count": req.Cc5xxCount,
  105. "cc_5xx_duration": req.Cc5xxDuration,
  106. "cc_5xx_block_count": req.Cc5xxBlockCount,
  107. "cc_5xx_block_duration": req.Cc5xxBlockDuration,
  108. }
  109. respBody, err := s.required.SendForm(ctx, "admin/info/waf_web/edit?&__goadmin_edit_pk="+strconv.Itoa(req.WafWebId), "admin/edit/waf_web", 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 *webForwardingService) DeleteWebForwarding(ctx context.Context, wafWebId int) (string, error) {
  124. res, err := s.crawler.DeleteRule(ctx, wafWebId, "admin/delete/waf_web?page=1&__pageSize=10&__sort=waf_web_id&__sort_type=desc")
  125. if err != nil {
  126. return "", err
  127. }
  128. return res, nil
  129. }