125 lines
2.8 KiB
Go
125 lines
2.8 KiB
Go
package scripts
|
||
|
||
import (
|
||
"bytes"
|
||
"context"
|
||
"fmt"
|
||
"github.com/huoxue1/qinglong-go/service/client"
|
||
"github.com/huoxue1/qinglong-go/service/env"
|
||
"github.com/huoxue1/qinglong-go/utils"
|
||
"io"
|
||
"os"
|
||
"path"
|
||
"path/filepath"
|
||
"sort"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
type File struct {
|
||
Key string `json:"key"`
|
||
Parent string `json:"parent"`
|
||
Title string `json:"title"`
|
||
Type string `json:"type"`
|
||
IsLeaf bool `json:"is_leaf"`
|
||
Children []*File `json:"children"`
|
||
}
|
||
|
||
var (
|
||
excludedFiles = []string{
|
||
"node_modules",
|
||
"__pycache__",
|
||
}
|
||
)
|
||
|
||
func Run(filePath, content string) error {
|
||
err := os.WriteFile(path.Join("data", "scripts", filePath), []byte(content), 0666)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
cmd := getCmd(filePath)
|
||
cancelChan := make(chan int, 1)
|
||
ctx := context.WithValue(context.Background(), "cancel", cancelChan)
|
||
now := time.Now()
|
||
utils.RunTask(ctx, cmd, env.GetALlEnv(), func(ctx context.Context) {
|
||
writer := ctx.Value("log").(io.Writer)
|
||
_, _ = writer.Write([]byte(fmt.Sprintf("##开始执行.. %s\n\n", now.Format("2006-01-02 15:04:05"))))
|
||
}, func(ctx context.Context) {
|
||
writer := ctx.Value("log").(io.Writer)
|
||
_, _ = writer.Write([]byte(fmt.Sprintf("\n##执行结束.. %s,耗时%.1f秒\n\n", time.Now().Format("2006-01-02 15:04:05"), time.Now().Sub(now).Seconds())))
|
||
_ = os.Remove(filePath)
|
||
}, client.MyClient)
|
||
return nil
|
||
}
|
||
|
||
func getCmd(filePath string) string {
|
||
ext := filepath.Ext(filePath)
|
||
switch ext {
|
||
case ".js":
|
||
return fmt.Sprintf("%s %s", "node", filePath)
|
||
case ".py":
|
||
return fmt.Sprintf("%s %s", "python", filePath)
|
||
|
||
}
|
||
return ""
|
||
}
|
||
|
||
func GetFiles(base, p string) []*File {
|
||
var files Files
|
||
dir, err := os.ReadDir(path.Join(base, p))
|
||
if err != nil {
|
||
return []*File{}
|
||
}
|
||
for _, entry := range dir {
|
||
if utils.In(entry.Name(), excludedFiles) {
|
||
continue
|
||
}
|
||
if entry.IsDir() {
|
||
f := &File{
|
||
Key: path.Join(p, entry.Name()),
|
||
Parent: p,
|
||
Title: entry.Name(),
|
||
Type: "directory",
|
||
IsLeaf: true,
|
||
Children: GetFiles(base, path.Join(p, entry.Name())),
|
||
}
|
||
files = append(files, f)
|
||
|
||
} else {
|
||
if strings.HasPrefix(entry.Name(), "_") {
|
||
continue
|
||
}
|
||
files = append(files, &File{
|
||
Key: path.Join(p, entry.Name()),
|
||
Parent: p,
|
||
Title: entry.Name(),
|
||
Type: "file",
|
||
IsLeaf: true,
|
||
Children: []*File{},
|
||
})
|
||
}
|
||
}
|
||
sort.Sort(files)
|
||
return files
|
||
}
|
||
|
||
type Files []*File
|
||
|
||
func (a Files) Len() int { // 重写 Len() 方法
|
||
return len(a)
|
||
}
|
||
func (a Files) Swap(i, j int) { // 重写 Swap() 方法
|
||
a[i], a[j] = a[j], a[i]
|
||
}
|
||
func (a Files) Less(i, j int) bool { // 重写 Less() 方法, 从大到小排序
|
||
if a[i].Type != a[j].Type {
|
||
if a[i].Type == "file" {
|
||
return false
|
||
} else {
|
||
return true
|
||
}
|
||
} else {
|
||
return bytes.Compare([]byte(a[i].Title), []byte(a[j].Title)) > 0
|
||
}
|
||
}
|