103 lines
1.9 KiB
Go
103 lines
1.9 KiB
Go
package models
|
||
|
||
import (
|
||
"fmt"
|
||
"io"
|
||
"log"
|
||
"os"
|
||
"os/exec"
|
||
"strings"
|
||
|
||
"github.com/beego/beego/v2/client/httplib"
|
||
"github.com/beego/beego/v2/core/logs"
|
||
)
|
||
|
||
type Task struct {
|
||
ID int
|
||
Cron string
|
||
Path string
|
||
Enable bool
|
||
Mode string //obo alo
|
||
Word string
|
||
Run func()
|
||
Name string
|
||
Timeout int
|
||
Envs []Env
|
||
}
|
||
|
||
type Env struct {
|
||
Name string
|
||
Value string
|
||
}
|
||
|
||
func initTask() {
|
||
for i := range Config.Tasks {
|
||
if Config.Tasks[i].Name == "" {
|
||
slice := strings.Split(Config.Tasks[i].Path, "/")
|
||
len := len(slice)
|
||
if len == 0 {
|
||
return
|
||
}
|
||
Config.Tasks[i].Name = slice[len-1]
|
||
}
|
||
// runTask(&Config.Tasks[i])
|
||
createTask(&Config.Tasks[i])
|
||
}
|
||
}
|
||
|
||
func createTask(task *Task) {
|
||
id, err := c.AddFunc(task.Cron, func() {
|
||
runTask(task)
|
||
})
|
||
if err != nil {
|
||
logs.Warn(task.Word, "任务创建失败")
|
||
} else {
|
||
task.ID = int(id)
|
||
logs.Info(task.Word, "任务创建成功")
|
||
}
|
||
|
||
}
|
||
|
||
func runTask(task *Task) {
|
||
var path = ExecPath + "/scripts/" + task.Name
|
||
if strings.Contains(task.Path, "http") {
|
||
f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
|
||
if err != nil {
|
||
logs.Warn("打开%s失败,", path, err)
|
||
}
|
||
url := task.Path
|
||
if strings.Contains(url, "raw.githubusercontent.com") {
|
||
url = GhProxy + url
|
||
}
|
||
r, err := httplib.Get(url).Response()
|
||
if err != nil {
|
||
logs.Warn("下载%s失败,", task.Path, err)
|
||
}
|
||
io.Copy(f, r.Body)
|
||
f.Close()
|
||
}
|
||
lan := Config.Node
|
||
if strings.Contains(task.Name, ".py") {
|
||
lan = Config.Python
|
||
}
|
||
envs := ""
|
||
for _, env := range task.Envs {
|
||
envs += fmt.Sprintf("export %s=%s", env.Name, env.Value)
|
||
}
|
||
sh := fmt.Sprintf(`
|
||
%s
|
||
cd %s
|
||
%s %s
|
||
`, envs,
|
||
ExecPath+"/scripts/",
|
||
lan, task.Name)
|
||
cmd := exec.Command("sh", "-c", sh)
|
||
cmd.Stdout = os.Stdout
|
||
cmd.Stderr = os.Stderr
|
||
log.Printf("path: %s", cmd.Path)
|
||
err := cmd.Run()
|
||
if err != nil {
|
||
logs.Warn("%v", err)
|
||
}
|
||
}
|