/
run.go
100 lines (87 loc) · 2.53 KB
/
run.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package job
import (
"bufio"
"fmt"
"log"
"net/http"
"strconv"
"time"
"github.com/NERVEbing/ikuai-aio/config"
"github.com/go-co-op/gocron"
)
func Run(c *config.Config) error {
cron := gocron.NewScheduler(c.Timezone)
cron.SetMaxConcurrentJobs(1, gocron.WaitMode)
for n, i := range c.IKuaiCronCustomISPList {
tag := "updateCustomISP" + "-" + strconv.Itoa(n+1)
cron = setCron(cron, i.Cron, c.IKuaiCronSkipStart).Name(tag).Tag(tag)
if _, err := cron.Do(updateCustomISP, i, tag); err != nil {
logger("cron", "tag: %s, error: %v", tag, err)
}
logger(tag, "cron/interval: %s, skip start: %t, timezone: %s", i.Cron, c.IKuaiCronSkipStart, c.Timezone)
}
for n, i := range c.IKuaiCronStreamDomainList {
tag := "updateStreamDomain" + "-" + strconv.Itoa(n+1)
cron = setCron(cron, i.Cron, c.IKuaiCronSkipStart).Name(tag).Tag(tag)
if _, err := cron.Do(updateStreamDomain, i, tag); err != nil {
logger("cron", "tag: %s, error: %v", tag, err)
}
logger(tag, "cron/interval: %s, skip start: %t, timezone: %s", i.Cron, c.IKuaiCronSkipStart, c.Timezone)
}
cron.RegisterEventListeners(
gocron.BeforeJobRuns(func(tag string) {
logger(tag, "running...")
}),
gocron.AfterJobRuns(func(tag string) {
jobs, err := cron.FindJobsByTag(tag)
if err != nil {
logger("cron", "error: %s", err.Error())
}
for _, i := range jobs {
logger(tag, "finished, next run time: %s", i.NextRun().String())
}
}),
gocron.WhenJobReturnsNoError(func(tag string) {
logger(tag, "success")
}),
gocron.WhenJobReturnsError(func(tag string, err error) {
logger(tag, "failed, error: %s", err.Error())
}),
)
logger("Run", "job length: %d", cron.Len())
cron.StartBlocking()
return nil
}
func logger(tag string, format string, v ...any) {
s := fmt.Sprintf("[job] tag: [%s], %s", tag, fmt.Sprintf(format, v...))
log.Printf(s)
}
func fetch(url string) ([]string, error) {
var rows []string
resp, err := http.Get(url)
if err != nil {
return nil, err
}
scanner := bufio.NewScanner(resp.Body)
defer func() {
if err = resp.Body.Close(); err != nil {
logger("defer fetch", "close body error: %s", err)
}
}()
for scanner.Scan() {
rows = append(rows, scanner.Text())
}
return rows, nil
}
func setCron(scheduler *gocron.Scheduler, cronStr string, isSkip bool) *gocron.Scheduler {
interval, err := time.ParseDuration(cronStr)
if err != nil {
scheduler = scheduler.Cron(cronStr)
} else {
scheduler = scheduler.Every(interval)
if isSkip {
scheduler = scheduler.StartAt(time.Now().Add(interval))
}
}
return scheduler
}