udpforwarding.go 4.5 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 UdpForWardingService interface {
  11. GetUdpForWarding(ctx context.Context, id int64) (*model.UdpForWarding, error)
  12. AddUdpForwarding(ctx context.Context, req *v1.UdpForwardingRequest) (string, error)
  13. EditUdpForwarding(ctx context.Context, req *v1.UdpForwardingRequest) (string, error)
  14. DeleteUdpForwarding(ctx context.Context, wafUdpId int) (string, error)
  15. }
  16. func NewUdpForWardingService(
  17. service *Service,
  18. udpForWardingRepository repository.UdpForWardingRepository,
  19. required RequiredService,
  20. parser ParserService,
  21. crawler CrawlerService,
  22. globalRep repository.GlobalLimitRepository,
  23. hostRep repository.HostRepository,
  24. wafformatter WafFormatterService,
  25. ) UdpForWardingService {
  26. return &udpForWardingService{
  27. Service: service,
  28. udpForWardingRepository: udpForWardingRepository,
  29. required: required,
  30. parser: parser,
  31. crawler: crawler,
  32. globalRep: globalRep,
  33. hostRep: hostRep,
  34. wafformatter: wafformatter,
  35. }
  36. }
  37. type udpForWardingService struct {
  38. *Service
  39. udpForWardingRepository repository.UdpForWardingRepository
  40. required RequiredService
  41. parser ParserService
  42. crawler CrawlerService
  43. globalRep repository.GlobalLimitRepository
  44. hostRep repository.HostRepository
  45. wafformatter WafFormatterService
  46. }
  47. func (s *udpForWardingService) require(ctx context.Context,req v1.GlobalRequire) (v1.GlobalRequire, error) {
  48. res, err := s.wafformatter.require(ctx, req, "udp")
  49. if err != nil {
  50. return v1.GlobalRequire{}, err
  51. }
  52. return res, nil
  53. }
  54. func (s *udpForWardingService) GetUdpForWarding(ctx context.Context, id int64) (*model.UdpForWarding, error) {
  55. return s.udpForWardingRepository.GetUdpForWarding(ctx, id)
  56. }
  57. func (s *udpForWardingService) AddUdpForwarding(ctx context.Context, req *v1.UdpForwardingRequest) (string, error) {
  58. require, err := s.require(ctx, v1.GlobalRequire{
  59. HostId: req.HostId,
  60. Uid: req.Uid,
  61. Comment: req.UdpForwardingData.Comment,
  62. })
  63. if err != nil {
  64. return "", err
  65. }
  66. formData := map[string]interface{}{
  67. "tag": require.Tag,
  68. "port": req.UdpForwardingData.Port,
  69. "waf_gateway_group_id": require.WafGatewayGroupId,
  70. "waf_udp_limit_id": require.LimitRuleId,
  71. "cc_packet_count": req.UdpForwardingData.CcPacketCount,
  72. "cc_packet_duration": req.UdpForwardingData.CcPacketDuration,
  73. "cc_count": req.UdpForwardingData.CcCount,
  74. "cc_duration": req.UdpForwardingData.CcDuration,
  75. "cc_block_count": req.UdpForwardingData.CcBlockCount,
  76. "cc_block_duration": req.UdpForwardingData.CcBlockDuration,
  77. "session_timeout": req.UdpForwardingData.SessionTimeout,
  78. "backend_list": req.UdpForwardingData.BackendList,
  79. "allow_ip_list": req.UdpForwardingData.AllowIpList,
  80. "deny_ip_list": req.UdpForwardingData.DenyIpList,
  81. "access_rule": req.UdpForwardingData.AccessRule,
  82. "comment": req.UdpForwardingData.Comment,
  83. }
  84. respBody, err := s.required.SendForm(ctx, "admin/info/waf_udp/new", "admin/new/waf_udp", formData)
  85. if err != nil {
  86. return "", err
  87. }
  88. // 解析响应内容中的 alert 消息
  89. res, err := s.parser.ParseAlert(string(respBody))
  90. if err != nil {
  91. return "", err
  92. }
  93. if res != "" {
  94. return "", fmt.Errorf(res)
  95. }
  96. wafUdpId, err := s.parser.GetRuleId(ctx, respBody)
  97. if err != nil {
  98. return "", err
  99. }
  100. fmt.Println("=================================================", wafUdpId)
  101. return "", nil
  102. }
  103. func (s *udpForWardingService) EditUdpForwarding(ctx context.Context, req *v1.UdpForwardingRequest) (string, error) {
  104. formData := map[string]interface{}{
  105. }
  106. respBody, err := s.required.SendForm(ctx, "admin/info/waf_udp/edit?&__goadmin_edit_pk="+strconv.Itoa(req.UdpForwardingData.WafUdpId), "admin/edit/waf_udp", formData)
  107. if err != nil {
  108. return "", err
  109. }
  110. // 解析响应内容中的 alert 消息
  111. res, err := s.parser.ParseAlert(string(respBody))
  112. if err != nil {
  113. return "", err
  114. }
  115. if res != "" {
  116. return "", fmt.Errorf(res)
  117. }
  118. return "", nil
  119. }
  120. func (s *udpForWardingService) DeleteUdpForwarding(ctx context.Context, wafUdpId int) (string, error) {
  121. res, err := s.crawler.DeleteRule(ctx, wafUdpId, "admin/delete/waf_udp?page=1&__pageSize=10&__sort=waf_udp_id&__sort_type=desc")
  122. if err != nil {
  123. return "", err
  124. }
  125. return res, nil
  126. }