white_list_service.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package service
  2. import (
  3. "context"
  4. "sync"
  5. "time"
  6. "github.com/rs/zerolog/log"
  7. "sikey.com.cn/benew/ext/internal/model"
  8. )
  9. type WhiteIplistService struct {
  10. iplist []string
  11. iplistMutex sync.RWMutex
  12. whiteIplistModel *model.WhiteIplistModel
  13. }
  14. func NewWhiteIplistService(whiteIplistModel *model.WhiteIplistModel) *WhiteIplistService {
  15. srv := &WhiteIplistService{
  16. iplist: make([]string, 0),
  17. whiteIplistModel: whiteIplistModel,
  18. }
  19. srv.updateIplistTask()
  20. ticker := time.NewTicker(60 * time.Second)
  21. go func() {
  22. for {
  23. select {
  24. case <-ticker.C:
  25. srv.updateIplistTask()
  26. }
  27. }
  28. }()
  29. return srv
  30. }
  31. func (s *WhiteIplistService) updateIplistTask() {
  32. whiteIplist, err := s.whiteIplistModel.Select(context.TODO())
  33. if err != nil {
  34. log.Error().Stack().Err(err).Msg("updateIplistTask")
  35. return
  36. }
  37. s.iplistMutex.Lock()
  38. defer s.iplistMutex.Unlock()
  39. s.iplist = s.iplist[:0]
  40. for _, ip := range whiteIplist {
  41. s.iplist = append(s.iplist, ip.IP)
  42. }
  43. }
  44. // IsWhiteIplisted Check if the IP is in the whitelist
  45. func (s *WhiteIplistService) IsWhiteIplisted(ip string) bool {
  46. s.iplistMutex.RLock()
  47. defer s.iplistMutex.RUnlock()
  48. for _, wip := range s.iplist {
  49. if wip == ip {
  50. return true
  51. }
  52. }
  53. return false
  54. }