Files
stat_center/service/domainser/domainser.go
T
2026-05-20 16:13:58 +08:00

77 lines
1.7 KiB
Go

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()
}