package domainser import ( "context" "stat/common/enum/consts" "stat/common/log" "stat/common/statutils" "stat/models/domainmod" "stat/statg" "time" "go.mongodb.org/mongo-driver/bson" "github.com/robfig/cron/v3" ) var ( checkCron *cron.Cron ) func init() { checkCron = cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(&log.Logger{}))) // 秒级定时任务 } // Start 定时器任务启动 func Start() { log.Info("domain checker start...") ctx := context.Background() if statg.Conf.RunMod != consts.RunModRelease { return } _, _ = checkCron.AddFunc("0 0/5 * * * ?", func() { statutils.ServerMon.RunWithName(func() error { return DomainCheck(ctx) }, statutils.GetFuncName(DomainCheck)) }) checkCron.Start() } func DomainCheck(ctx context.Context) error { list, err := domainmod.FindManyDomain(ctx, bson.M{ "enable": true, "checkTime": bson.M{"$lt": time.Now().Add(-10 * time.Minute)}, }) if err != nil { return err } redirectedChecks := []domainmod.CheckType{domainmod.CheckTypePollute} unRedirectedChecks := []domainmod.CheckType{domainmod.CheckTypePollute, domainmod.CheckTypeGFW} domains := make(domainmod.DomainList, 0) for _, item := range list { if item.Redirected { item.Checks = redirectedChecks } else { item.Checks = unRedirectedChecks } if item.Status == domainmod.CheckStatusNone { if item.CheckTime.Before(time.Now().Add(-10 * time.Minute)) { domains = append(domains, item) } } else { if item.CheckTime.Before(time.Now().Add(time.Duration(-item.CycleHour) * time.Hour)) { domains = append(domains, item) } } } if len(domains) == 0 { return nil } domainChecker := &DomainChecker{ Items: domains, } return domainChecker.StartCheck() }