process.go 5.1 KB

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