tcpforwarding.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package service
  2. import (
  3. "context"
  4. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  5. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/repository"
  7. "strconv"
  8. )
  9. type TcpforwardingService interface {
  10. GetTcpforwarding(ctx context.Context, id int64) (*model.Tcpforwarding, error)
  11. AddTcpForwarding(ctx context.Context, req *v1.TcpForwardingRequest) error
  12. EditTcpForwarding(ctx context.Context, req *v1.TcpForwardingRequest) (string, error)
  13. DeleteTcpForwarding(ctx context.Context, wafTcpId int) (string, error)
  14. }
  15. func NewTcpforwardingService(
  16. service *Service,
  17. tcpforwardingRepository repository.TcpforwardingRepository,
  18. parser ParserService,
  19. required RequiredService,
  20. crawler CrawlerService,
  21. globalRep repository.GlobalLimitRepository,
  22. hostRep repository.HostRepository,
  23. wafformatter WafFormatterService,
  24. ) TcpforwardingService {
  25. return &tcpforwardingService{
  26. Service: service,
  27. tcpforwardingRepository: tcpforwardingRepository,
  28. parser: parser,
  29. required: required,
  30. crawler: crawler,
  31. globalRep: globalRep,
  32. hostRep: hostRep,
  33. wafformatter: wafformatter,
  34. }
  35. }
  36. type tcpforwardingService struct {
  37. *Service
  38. tcpforwardingRepository repository.TcpforwardingRepository
  39. parser ParserService
  40. required RequiredService
  41. crawler CrawlerService
  42. globalRep repository.GlobalLimitRepository
  43. hostRep repository.HostRepository
  44. wafformatter WafFormatterService
  45. }
  46. func (s *tcpforwardingService) GetTcpforwarding(ctx context.Context, id int64) (*model.Tcpforwarding, error) {
  47. return s.tcpforwardingRepository.GetTcpforwarding(ctx, id)
  48. }
  49. func (s *tcpforwardingService) require(ctx context.Context,req v1.GlobalRequire) (v1.GlobalRequire, error) {
  50. res, err := s.wafformatter.require(ctx, req, "tcp")
  51. if err != nil {
  52. return v1.GlobalRequire{}, err
  53. }
  54. return res, nil
  55. }
  56. func (s *tcpforwardingService) buildWafFormData(req *v1.TcpForwardingData, require v1.GlobalRequire) map[string]interface{} {
  57. return map[string]interface{}{
  58. "tag": require.Tag,
  59. "port": req.Port,
  60. "waf_gateway_group_id": require.WafGatewayGroupId,
  61. "waf_tcp_limit_id": require.LimitRuleId,
  62. "cc_count": req.CcCount,
  63. "cc_duration": req.CcDuration,
  64. "cc_block_count": req.CcBlockCount,
  65. "cc_block_duration": req.CcBlockDuration,
  66. "backend_protocol": req.BackendProtocol,
  67. "backend_timeout": req.BackendTimeout,
  68. "comment": req.Comment,
  69. "backend_list": req.BackendList,
  70. "allow_ip_list": req.AllowIpList,
  71. "deny_ip_list": req.DenyIpList,
  72. "access_rule": req.AccessRule,
  73. }
  74. }
  75. func (s *tcpforwardingService) buildTcpForwardingModel(req *v1.TcpForwardingData, ruleId int, require v1.GlobalRequire) *model.Tcpforwarding {
  76. return &model.Tcpforwarding{
  77. HostId: require.HostId,
  78. RuleId: ruleId,
  79. Port: strconv.Itoa(req.Port),
  80. Tag: require.Tag,
  81. Comment: req.Comment,
  82. WafGatewayGroupId: require.WafGatewayGroupId,
  83. CcCount: req.CcCount,
  84. CcDuration: req.CcDuration,
  85. CcBlockCount: req.CcBlockCount,
  86. CcBlockDuration: req.CcBlockDuration,
  87. BackendProtocol: req.BackendProtocol,
  88. BackendTimeout: req.BackendTimeout,
  89. }
  90. }
  91. func (s *tcpforwardingService) AddTcpForwarding(ctx context.Context, req *v1.TcpForwardingRequest) error {
  92. require, err := s.require(ctx, v1.GlobalRequire{
  93. HostId: req.HostId,
  94. Uid: req.Uid,
  95. Comment: req.TcpForwardingData.Comment,
  96. })
  97. if err != nil {
  98. return err
  99. }
  100. formData := s.buildWafFormData(&req.TcpForwardingData, require)
  101. wafTcpId, err := s.wafformatter.sendFormData(ctx, "admin/info/waf_tcp/new", "admin/new/waf_tcp", formData)
  102. if err != nil {
  103. return err
  104. }
  105. tcpModel := s.buildTcpForwardingModel(&req.TcpForwardingData, wafTcpId, require)
  106. if err = s.tcpforwardingRepository.AddTcpforwarding(ctx, tcpModel); err != nil {
  107. return err
  108. }
  109. return nil
  110. }
  111. func (s *tcpforwardingService) EditTcpForwarding(ctx context.Context, req *v1.TcpForwardingRequest) (string, error) {
  112. require, err := s.require(ctx, v1.GlobalRequire{
  113. HostId: req.HostId,
  114. Uid: req.Uid,
  115. Comment: req.TcpForwardingData.Comment,
  116. })
  117. if err != nil {
  118. return "", err
  119. }
  120. formData := s.buildWafFormData(&req.TcpForwardingData, require)
  121. _, err = s.wafformatter.sendFormData(ctx, "admin/info/waf_tcp/edit?&__goadmin_edit_pk="+strconv.Itoa(req.TcpForwardingData.WafTcpId), "admin/edit/waf_tcp", formData)
  122. if err != nil {
  123. return "", err
  124. }
  125. tcpModel := s.buildTcpForwardingModel(&req.TcpForwardingData, req.TcpForwardingData.WafTcpId, require)
  126. tcpModel.Id = req.Id
  127. if err = s.tcpforwardingRepository.EditTcpforwarding(ctx, tcpModel); err != nil {
  128. return "", err
  129. }
  130. return "", nil
  131. }
  132. func (s *tcpforwardingService) DeleteTcpForwarding(ctx context.Context, wafTcpId int) (string, error) {
  133. res, err := s.crawler.DeleteRule(ctx, wafTcpId, "admin/delete/waf_tcp?page=1&__pageSize=10&__sort=waf_tcp_id&__sort_type=desc")
  134. if err != nil {
  135. return "", err
  136. }
  137. return res, nil
  138. }