process.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package web
  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/service/api/waf/common"
  8. "net"
  9. )
  10. type Process interface {
  11. ProcessAsyncTasks(ctx context.Context, req *v1.WebForwardingRequest, require common.RequireResponse)
  12. ProcessIpWhitelistChanges(ctx context.Context, req *v1.WebForwardingRequest, ipData *model.WebForwardingRule) error
  13. ProcessDeleteIpWhitelist(ctx context.Context, id int) error
  14. ProcessDomainWhitelistChanges(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, require common.RequireResponse) error
  15. ProcessDeleteDomainWhitelist(ctx context.Context, oldData *model.WebForwarding, uid int) error
  16. }
  17. // ProcessAsyncTasks 处理异步任务
  18. func (s *aidedWebService) ProcessAsyncTasks(ctx context.Context, req *v1.WebForwardingRequest, require common.RequireResponse) {
  19. // 域名白名单处理
  20. if req.WebForwardingData.Domain != "" {
  21. go func() {
  22. doMain, err := s.wafformatter.ConvertToWildcardDomain(ctx, req.WebForwardingData.Domain)
  23. if err != nil {
  24. return
  25. }
  26. if len(require.GatewayIps) == 0 {
  27. return
  28. }
  29. firstIp, err := s.gatewayIp.GetGatewayipByHostIdFirst(ctx, int64(require.HostId), int64(require.Uid))
  30. if err != nil {
  31. return
  32. }
  33. s.wafformatter.PublishDomainWhitelistTask(doMain, firstIp, "add")
  34. }()
  35. }
  36. // 源站IP白名单处理
  37. if req.WebForwardingData.BackendList != nil {
  38. go func() {
  39. var ips []string
  40. for _, v := range req.WebForwardingData.BackendList {
  41. ip, _, err := net.SplitHostPort(v.Addr)
  42. if err != nil {
  43. continue
  44. }
  45. ips = append(ips, ip)
  46. }
  47. if len(ips) > 0 {
  48. s.wafformatter.PublishIpWhitelistTask(ips, "add", "", "white")
  49. }
  50. }()
  51. }
  52. }
  53. // ProcessIpWhitelistChanges 处理IP白名单变更
  54. func (s *aidedWebService) ProcessIpWhitelistChanges(ctx context.Context, req *v1.WebForwardingRequest, ipData *model.WebForwardingRule) error {
  55. var oldIps, newIps []string
  56. // 提取旧IP列表
  57. for _, v := range ipData.BackendList {
  58. ip, _, err := net.SplitHostPort(v.Addr)
  59. if err != nil {
  60. return fmt.Errorf("解析旧IP地址失败: %w", err)
  61. }
  62. oldIps = append(oldIps, ip)
  63. }
  64. // 提取新IP列表
  65. for _, v := range req.WebForwardingData.BackendList {
  66. ip, _, err := net.SplitHostPort(v.Addr)
  67. if err != nil {
  68. return fmt.Errorf("解析新IP地址失败: %w", err)
  69. }
  70. newIps = append(newIps, ip)
  71. }
  72. // 查找IP差异
  73. addedIps, removedIps := s.wafformatter.FindIpDifferences(oldIps, newIps)
  74. // 异步处理添加的IP
  75. if len(addedIps) > 0 {
  76. go s.wafformatter.PublishIpWhitelistTask(addedIps, "add", "", "white")
  77. }
  78. // 异步处理删除的IP
  79. if len(removedIps) > 0 {
  80. go func() {
  81. ipsToDelist, err := s.wafformatter.WashDelIps(ctx, removedIps)
  82. if err != nil {
  83. return
  84. }
  85. if len(ipsToDelist) > 0 {
  86. s.wafformatter.PublishIpWhitelistTask(ipsToDelist, "del", "0", "white")
  87. }
  88. }()
  89. }
  90. return nil
  91. }
  92. // ProcessDeleteIpWhitelist 处理删除IP白名单
  93. func (s *aidedWebService) ProcessDeleteIpWhitelist(ctx context.Context, id int) error {
  94. ipData, err := s.webForwardingRepository.GetWebForwardingIpsByID(ctx, id)
  95. if err != nil {
  96. return fmt.Errorf("获取IP数据失败: %w", err)
  97. }
  98. if ipData != nil && len(ipData.BackendList) > 0 {
  99. var ips []string
  100. for _, v := range ipData.BackendList {
  101. ip, _, err := net.SplitHostPort(v.Addr)
  102. if err != nil {
  103. continue
  104. }
  105. ips = append(ips, ip)
  106. }
  107. if len(ips) > 0 {
  108. go func() {
  109. ipsToDelist, err := s.wafformatter.WashDelIps(ctx, ips)
  110. if err != nil {
  111. return
  112. }
  113. if len(ipsToDelist) > 0 {
  114. s.wafformatter.PublishIpWhitelistTask(ipsToDelist, "del", "0", "white")
  115. }
  116. }()
  117. }
  118. }
  119. return nil
  120. }
  121. // ProcessDomainWhitelistChanges 处理域名白名单变更
  122. func (s *aidedWebService) ProcessDomainWhitelistChanges(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, require common.RequireResponse) error {
  123. if oldData.Domain != req.WebForwardingData.Domain {
  124. firstIp, err := s.gatewayIp.GetGatewayipByHostIdFirst(ctx, int64(req.HostId), int64(req.Uid))
  125. if err != nil {
  126. return fmt.Errorf("获取网关IP失败: %w", err)
  127. }
  128. newDomain, err := s.wafformatter.ConvertToWildcardDomain(ctx, req.WebForwardingData.Domain)
  129. if err != nil {
  130. return fmt.Errorf("转换新域名失败: %w", err)
  131. }
  132. oldDomain, err := s.wafformatter.ConvertToWildcardDomain(ctx, oldData.Domain)
  133. if err != nil {
  134. return fmt.Errorf("转换旧域名失败: %w", err)
  135. }
  136. if len(require.GatewayIps) == 0 {
  137. return fmt.Errorf("网关组不存在")
  138. }
  139. // 检查旧域名使用数量
  140. count, err := s.webForwardingRepository.GetDomainCount(ctx, req.HostId, oldData.Domain)
  141. if err != nil {
  142. return fmt.Errorf("获取域名使用数量失败: %w", err)
  143. }
  144. // 异步处理域名白名单变更
  145. go func() {
  146. if count < 2 {
  147. s.wafformatter.PublishDomainWhitelistTask(oldDomain, firstIp, "del")
  148. }
  149. s.wafformatter.PublishDomainWhitelistTask(newDomain, firstIp, "add")
  150. }()
  151. }
  152. return nil
  153. }
  154. // ProcessDeleteDomainWhitelist 处理删除域名白名单
  155. func (s *aidedWebService) ProcessDeleteDomainWhitelist(ctx context.Context, oldData *model.WebForwarding, uid int) error {
  156. if oldData.Domain != "" {
  157. firstIp, err := s.gatewayIp.GetGatewayipByHostIdFirst(ctx, int64(oldData.HostId), int64(uid))
  158. if err != nil {
  159. return fmt.Errorf("获取网关IP失败: %w", err)
  160. }
  161. doMain, err := s.wafformatter.ConvertToWildcardDomain(ctx, oldData.Domain)
  162. if err != nil {
  163. return fmt.Errorf("转换域名失败: %w", err)
  164. }
  165. go s.wafformatter.PublishDomainWhitelistTask(doMain, firstIp, "del")
  166. }
  167. return nil
  168. }