xdd-plus/models/task.go

159 lines
3.0 KiB
Go
Raw Normal View History

2021-08-15 09:48:05 +08:00
package models
2021-08-16 17:35:27 +08:00
2021-08-16 19:23:59 +08:00
import (
2021-08-16 23:08:04 +08:00
"bufio"
2021-08-16 22:14:06 +08:00
"fmt"
2021-08-16 19:23:59 +08:00
"io"
"os"
2021-08-16 22:14:06 +08:00
"os/exec"
2021-08-16 19:23:59 +08:00
"strings"
"github.com/beego/beego/v2/client/httplib"
"github.com/beego/beego/v2/core/logs"
)
2021-08-16 17:35:27 +08:00
type Task struct {
2021-08-16 22:14:06 +08:00
ID int
Cron string
Path string
Enable bool
Mode string //obo alo
Word string
Run func()
Name string
Timeout int
Envs []Env
2021-08-17 13:36:11 +08:00
Args string
Ykq bool
2021-08-17 21:08:06 +08:00
Hack bool
2021-08-16 17:35:27 +08:00
}
type Env struct {
Name string
Value string
}
2021-08-16 19:23:59 +08:00
func initTask() {
for i := range Config.Tasks {
2021-08-17 13:52:21 +08:00
if Config.Tasks[i].Cron != "" {
createTask(&Config.Tasks[i])
}
2021-08-16 19:23:59 +08:00
}
}
func createTask(task *Task) {
id, err := c.AddFunc(task.Cron, func() {
runTask(task)
})
if err != nil {
2021-08-16 22:14:06 +08:00
logs.Warn(task.Word, "任务创建失败")
2021-08-16 19:23:59 +08:00
} else {
task.ID = int(id)
2021-08-16 22:14:06 +08:00
logs.Info(task.Word, "任务创建成功")
2021-08-16 19:23:59 +08:00
}
}
2021-08-17 13:52:21 +08:00
func runTask(task *Task, msgs ...interface{}) string {
2021-08-17 13:36:11 +08:00
msg := ""
2021-08-16 23:08:04 +08:00
if task.Name == "" {
slice := strings.Split(task.Path, "/")
len := len(slice)
if len == 0 {
logs.Warn("取法识别的文件名")
2021-08-17 13:52:21 +08:00
return ""
2021-08-16 23:08:04 +08:00
}
task.Name = slice[len-1]
}
2021-08-16 19:23:59 +08:00
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)
2021-08-17 15:12:18 +08:00
return ""
2021-08-16 19:23:59 +08:00
}
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()
2021-08-17 15:12:18 +08:00
} else {
2021-08-17 17:53:42 +08:00
if path != task.Path && task.Name != task.Path {
f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
if err != nil {
logs.Warn("打开%s失败", path, err)
return ""
}
f2, err := os.Open(task.Path)
if err != nil {
f.Close()
logs.Warn("打开%s失败", path, err)
return ""
}
io.Copy(f, f2)
f2.Close()
f.Close()
}
2021-08-16 19:23:59 +08:00
}
2021-08-16 22:14:06 +08:00
lan := Config.Node
if strings.Contains(task.Name, ".py") {
lan = Config.Python
}
envs := ""
for _, env := range task.Envs {
2021-08-17 15:35:21 +08:00
envs += fmt.Sprintf("export %s=\"%s\"", env.Name, env.Value)
2021-08-16 22:14:06 +08:00
}
sh := fmt.Sprintf(`
%s
%s %s
`, envs,
lan, task.Name)
cmd := exec.Command("sh", "-c", sh)
2021-08-16 23:08:04 +08:00
stdout, err := cmd.StdoutPipe()
2021-08-19 10:05:17 +08:00
stderr, err := cmd.StderrPipe()
2021-08-16 23:08:04 +08:00
if err != nil {
logs.Warn("cmd.StdoutPipe: ", err)
2021-08-17 13:52:21 +08:00
return ""
2021-08-16 23:08:04 +08:00
}
cmd.Dir = ExecPath + "/scripts/"
err = cmd.Start()
2021-08-16 22:14:06 +08:00
if err != nil {
logs.Warn("%v", err)
2021-08-17 13:52:21 +08:00
return ""
2021-08-16 23:08:04 +08:00
}
2021-08-19 10:05:17 +08:00
go func() {
msg := ""
reader := bufio.NewReader(stderr)
for {
line, err2 := reader.ReadString('\n')
if err2 != nil || io.EOF == err2 {
break
}
msg += line
}
2021-08-19 10:07:37 +08:00
if msg != "" {
sendMessagee(msg, msgs...)
}
2021-08-19 10:05:17 +08:00
}()
2021-08-16 23:08:04 +08:00
reader := bufio.NewReader(stdout)
for {
line, err2 := reader.ReadString('\n')
if err2 != nil || io.EOF == err2 {
break
}
2021-08-17 14:15:35 +08:00
msg += line
2021-08-18 09:35:27 +08:00
if !task.Ykq && len(msgs) > 0 {
2021-08-19 10:02:22 +08:00
sendMessagee(strings.Replace(line, "\n", "", -1), msgs...)
2021-08-17 13:36:11 +08:00
}
}
2021-08-18 09:35:27 +08:00
if task.Ykq && len(msgs) > 0 {
2021-08-17 14:15:35 +08:00
sendMessagee(msg, msgs...)
2021-08-16 22:14:06 +08:00
}
2021-08-16 23:08:04 +08:00
err = cmd.Wait()
2021-08-17 13:52:21 +08:00
return msg
2021-08-16 19:23:59 +08:00
}