131 lines
2.7 KiB
Go
131 lines
2.7 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/beego/beego/v2/core/logs"
|
|
"github.com/robfig/cron/v3"
|
|
)
|
|
|
|
type Repo struct {
|
|
Git string
|
|
filename string
|
|
Task []Task
|
|
path string
|
|
}
|
|
|
|
var reposPath = ""
|
|
|
|
func (rp *Repo) init() {
|
|
rp.filename = strings.Replace(strings.Replace(strings.Replace(rp.Git, "https://", "", -1), "/", "_", -1), ".git", "", -1)
|
|
if !rp.exist() {
|
|
rp.gitClone()
|
|
} else {
|
|
rp.gitPull()
|
|
}
|
|
rp.path = reposPath + "/" + rp.filename
|
|
CopyConfigAll()
|
|
rp.addTask()
|
|
}
|
|
|
|
func (rp *Repo) exist() bool {
|
|
if _, err := os.Stat(rp.path); err != nil {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func initRepos() {
|
|
reposPath = ExecPath + "/repos"
|
|
if _, err := os.Stat(reposPath); err != nil {
|
|
os.MkdirAll(reposPath, os.ModePerm)
|
|
}
|
|
for i := range Config.Repos {
|
|
Config.Repos[i].init()
|
|
}
|
|
}
|
|
|
|
func GitPullAll() {
|
|
for i := range Config.Repos {
|
|
if Config.Repos[i].exist() {
|
|
if strings.Contains(Config.Repos[i].gitPull(), "changed") {
|
|
Config.Repos[i].addTask()
|
|
}
|
|
Config.Repos[i].cpConfig()
|
|
}
|
|
}
|
|
}
|
|
|
|
func CopyConfigAll() {
|
|
for i := range Config.Repos {
|
|
if Config.Repos[i].exist() {
|
|
Config.Repos[i].cpConfig()
|
|
}
|
|
}
|
|
}
|
|
|
|
func (rp *Repo) gitClone() {
|
|
cmd(fmt.Sprintf("cd %s && git clone %s %s", reposPath, rp.Git, rp.filename), &Sender{})
|
|
}
|
|
|
|
func (rp *Repo) gitPull() string {
|
|
return cmd(fmt.Sprintf("cd %s && git stash && git pull", rp.path), &Sender{})
|
|
}
|
|
|
|
func (rp *Repo) cpConfig() {
|
|
for _, js := range []string{"jdCookie", "jdFruitShareCodes", "jdPetShareCodes", "jdPlantBeanShareCodes", "jdFactoryShareCodes", "jdDreamFactoryShareCodes", "jdJxncShareCodes"} {
|
|
cmd(fmt.Sprintf(`cp `+js+`.js %s`, rp.path+"/"+js+".js"), &Sender{})
|
|
}
|
|
}
|
|
|
|
func (rp *Repo) addTask() {
|
|
dir_list, e := ioutil.ReadDir(rp.path)
|
|
if e != nil {
|
|
return
|
|
}
|
|
nts := []Task{}
|
|
for _, v := range dir_list {
|
|
if strings.Contains(v.Name(), ".js") {
|
|
f, err := os.Open(rp.path + "/" + v.Name())
|
|
if err != nil {
|
|
continue
|
|
}
|
|
data, _ := ioutil.ReadAll(f)
|
|
f.Close()
|
|
res := regexp.MustCompile(`([\d\-,\*]+ [\d\-,\*]+ [\d\-,\*]+ [*]+ [*]+)[\s\S]+Env[(]['"]([^'"]+)['"][)]`).FindStringSubmatch(string(data))
|
|
if len(res) > 0 {
|
|
nts = append(nts, Task{
|
|
Cron: res[1],
|
|
Name: v.Name(),
|
|
Title: res[2],
|
|
Git: rp.path,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
for i := range rp.Task {
|
|
if rp.Task[i].ID != 0 {
|
|
c.Remove(cron.EntryID(rp.Task[i].ID))
|
|
}
|
|
}
|
|
rp.Task = nts
|
|
for i := range rp.Task {
|
|
task := &rp.Task[i]
|
|
eid, err := c.AddFunc(task.Cron, func() {
|
|
// if Cdle {
|
|
// return
|
|
// }
|
|
logs.Info("执行任务 %s %s ", task.Title, task.Cron)
|
|
runTask(task, &Sender{})
|
|
})
|
|
if err == nil {
|
|
logs.Info("添加任务 %s %s ", rp.Task[i].Title, rp.Task[i].Cron)
|
|
rp.Task[i].ID = int(eid)
|
|
}
|
|
}
|
|
}
|