tcpforwarding.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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 TcpforwardingService interface {
  12. GetTcpforwarding(ctx context.Context, id int64) (*model.Tcpforwarding, error)
  13. AddTcpForwarding(ctx context.Context, req *v1.TcpForwardingRequest) error
  14. EditTcpForwarding(ctx context.Context, req *v1.TcpForwardingRequest) (string, error)
  15. DeleteTcpForwarding(ctx context.Context, wafTcpId int) (string, error)
  16. }
  17. func NewTcpforwardingService(
  18. service *Service,
  19. tcpforwardingRepository repository.TcpforwardingRepository,
  20. parser ParserService,
  21. required RequiredService,
  22. crawler CrawlerService,
  23. globalRep repository.GlobalLimitRepository,
  24. hostRep repository.HostRepository,
  25. wafformatter WafFormatterService,
  26. ) TcpforwardingService {
  27. return &tcpforwardingService{
  28. Service: service,
  29. tcpforwardingRepository: tcpforwardingRepository,
  30. parser: parser,
  31. required: required,
  32. crawler: crawler,
  33. globalRep: globalRep,
  34. hostRep: hostRep,
  35. wafformatter: wafformatter,
  36. }
  37. }
  38. type tcpforwardingService struct {
  39. *Service
  40. tcpforwardingRepository repository.TcpforwardingRepository
  41. parser ParserService
  42. required RequiredService
  43. crawler CrawlerService
  44. globalRep repository.GlobalLimitRepository
  45. hostRep repository.HostRepository
  46. wafformatter WafFormatterService
  47. }
  48. func (s *tcpforwardingService) GetTcpforwarding(ctx context.Context, id int64) (*model.Tcpforwarding, error) {
  49. return s.tcpforwardingRepository.GetTcpforwarding(ctx, id)
  50. }
  51. func (s *tcpforwardingService) require(ctx context.Context,req v1.GlobalRequire) (v1.GlobalRequire, error) {
  52. res, err := s.wafformatter.require(ctx, req, "tcp")
  53. if err != nil {
  54. return v1.GlobalRequire{}, err
  55. }
  56. return res, nil
  57. }
  58. func (s *tcpforwardingService) AddTcpForwarding(ctx context.Context, req *v1.TcpForwardingRequest) error {
  59. require, err := s.require(ctx, v1.GlobalRequire{
  60. HostId: req.HostId,
  61. Uid: req.Uid,
  62. Comment: req.TcpForwardingData.Comment,
  63. })
  64. if err != nil {
  65. return err
  66. }
  67. formData := map[string]interface{}{
  68. "tag": require.Tag,
  69. "port": req.TcpForwardingData.Port,
  70. "waf_gateway_group_id": require.WafGatewayGroupId,
  71. "waf_tcp_limit_id": require.LimitRuleId,
  72. "cc_count": req.TcpForwardingData.CcCount,
  73. "cc_duration": req.TcpForwardingData.CcDuration,
  74. "cc_block_count": req.TcpForwardingData.CcBlockCount,
  75. "cc_block_duration": req.TcpForwardingData.CcBlockDuration,
  76. "backend_protocol": req.TcpForwardingData.BackendProtocol,
  77. "backend_timeout": req.TcpForwardingData.BackendTimeout,
  78. "comment": req.TcpForwardingData.Comment,
  79. "backend_list": req.TcpForwardingData.BackendList,
  80. "allow_ip_list": req.TcpForwardingData.AllowIpList,
  81. "deny_ip_list": req.TcpForwardingData.DenyIpList,
  82. "access_rule": req.TcpForwardingData.AccessRule,
  83. }
  84. respBody, err := s.required.SendForm(ctx, "admin/info/waf_tcp/new", "admin/new/waf_tcp", 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. wafTcpIdStr, err := s.parser.GetRuleId(ctx, respBody)
  97. if err != nil {
  98. return err
  99. }
  100. wafTcpId, err := cast.ToIntE(wafTcpIdStr)
  101. if err != nil {
  102. return err
  103. }
  104. if err = s.tcpforwardingRepository.AddTcpforwarding(ctx, &model.Tcpforwarding{
  105. HostId: req.HostId,
  106. RuleId: wafTcpId,
  107. Port: strconv.Itoa(req.TcpForwardingData.Port),
  108. Tag: require.Tag,
  109. Comment: req.TcpForwardingData.Comment,
  110. WafGatewayGroupId: require.WafGatewayGroupId,
  111. CcCount: req.TcpForwardingData.CcCount,
  112. CcDuration: req.TcpForwardingData.CcDuration,
  113. CcBlockCount: req.TcpForwardingData.CcBlockCount,
  114. CcBlockDuration: req.TcpForwardingData.CcBlockDuration,
  115. BackendProtocol: req.TcpForwardingData.BackendProtocol,
  116. BackendTimeout: req.TcpForwardingData.BackendTimeout,
  117. }) ; err != nil {
  118. return err
  119. }
  120. return nil
  121. }
  122. func (s *tcpforwardingService) EditTcpForwarding(ctx context.Context, req *v1.TcpForwardingRequest) (string, error) {
  123. require, err := s.require(ctx, v1.GlobalRequire{
  124. HostId: req.HostId,
  125. Uid: req.Uid,
  126. Comment: req.TcpForwardingData.Comment,
  127. })
  128. if err != nil {
  129. return "", err
  130. }
  131. formData := map[string]interface{}{
  132. "tag": require.Tag,
  133. "port": req.TcpForwardingData.Port,
  134. "waf_gateway_group_id": require.WafGatewayGroupId,
  135. "waf_tcp_limit_id": require.LimitRuleId,
  136. "cc_count": req.TcpForwardingData.CcCount,
  137. "cc_duration": req.TcpForwardingData.CcDuration,
  138. "cc_block_count": req.TcpForwardingData.CcBlockCount,
  139. "cc_block_duration": req.TcpForwardingData.CcBlockDuration,
  140. "backend_protocol": req.TcpForwardingData.BackendProtocol,
  141. "backend_timeout": req.TcpForwardingData.BackendTimeout,
  142. "comment": req.TcpForwardingData.Comment,
  143. "backend_list": req.TcpForwardingData.BackendList,
  144. "allow_ip_list": req.TcpForwardingData.AllowIpList,
  145. "deny_ip_list": req.TcpForwardingData.DenyIpList,
  146. "access_rule": req.TcpForwardingData.AccessRule,
  147. }
  148. respBody, err := s.required.SendForm(ctx, "admin/info/waf_tcp/edit?&__goadmin_edit_pk="+strconv.Itoa(req.TcpForwardingData.WafTcpId), "admin/edit/waf_tcp", formData)
  149. if err != nil {
  150. return "", err
  151. }
  152. // 解析响应内容中的 alert 消息
  153. res, err := s.parser.ParseAlert(string(respBody))
  154. if err != nil {
  155. return "", err
  156. }
  157. if res != "" {
  158. return "", fmt.Errorf(res)
  159. }
  160. return "", nil
  161. }
  162. func (s *tcpforwardingService) DeleteTcpForwarding(ctx context.Context, wafTcpId int) (string, error) {
  163. res, err := s.crawler.DeleteRule(ctx, wafTcpId, "admin/delete/waf_tcp?page=1&__pageSize=10&__sort=waf_tcp_id&__sort_type=desc")
  164. if err != nil {
  165. return "", err
  166. }
  167. return res, nil
  168. }