You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
4.6 KiB
198 lines
4.6 KiB
2 years ago
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/tint/env"
|
||
|
"hupeh.vip/pm/cmd"
|
||
|
"hupeh.vip/pm/db"
|
||
|
"os"
|
||
|
"os/exec"
|
||
|
"strconv"
|
||
|
)
|
||
|
|
||
|
//import (
|
||
|
// "flag"
|
||
|
// "fmt"
|
||
|
// "log"
|
||
|
// "os"
|
||
|
// "os/exec"
|
||
|
// "time"
|
||
|
//)
|
||
|
//
|
||
|
//// 移除不需要的参数
|
||
|
//func strip(slice []string, remove string) []string {
|
||
|
// for i := 0; i < len(slice); {
|
||
|
// if slice[i] == remove {
|
||
|
// if i != len(slice)-1 {
|
||
|
// slice = append(slice[:i], slice[i+1:]...)
|
||
|
// } else {
|
||
|
// slice = slice[:i]
|
||
|
// }
|
||
|
// } else {
|
||
|
// i++
|
||
|
// }
|
||
|
// }
|
||
|
// return slice
|
||
|
//}
|
||
|
//
|
||
|
//func subProcess(args []string) *exec.Cmd {
|
||
|
// cmd := exec.Command(args[0], args[1:]...)
|
||
|
// cmd.Stdin = os.Stdin
|
||
|
// cmd.Stdout = os.Stdout
|
||
|
// cmd.Stderr = os.Stderr
|
||
|
// err := cmd.Start()
|
||
|
// if err != nil {
|
||
|
// fmt.Fprintf(os.Stderr, "[-] Error: %s\n", err)
|
||
|
// }
|
||
|
// return cmd
|
||
|
//}
|
||
|
//
|
||
|
//func main() {
|
||
|
// daemon := flag.Bool("daemon", false, "run in daemon")
|
||
|
// forever := flag.Bool("forever", false, "run forever")
|
||
|
// flag.Parse()
|
||
|
//
|
||
|
// // 启用守护模式
|
||
|
// if *daemon {
|
||
|
// subProcess(strip(os.Arguments, "-daemon"))
|
||
|
// fmt.Printf("[*] Daemon running in pid: %d PPID: %d\n", os.Getpid(), os.Getppid())
|
||
|
// os.Exit(0)
|
||
|
// }
|
||
|
//
|
||
|
// if *forever {
|
||
|
// for {
|
||
|
// cmd := subProcess(strip(os.Arguments, "-forever"))
|
||
|
// fmt.Printf("[*] Forever running in pid: %d PPID: %d\n", os.Getpid(), os.Getppid())
|
||
|
// if err := cmd.Wait(); err != nil {
|
||
|
// fmt.Println(err)
|
||
|
// os.Exit(1)
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
//
|
||
|
// fp, _ := os.OpenFile("./dosomething.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
|
||
|
// log.SetOutput(fp)
|
||
|
// log.Printf("[*] Service running in pid: %d PPID: %d\n", os.Getpid(), os.Getppid())
|
||
|
// defer log.Println("exit ...")
|
||
|
// for {
|
||
|
// log.Printf("DoSomething running in pid: %d PPID: %d\n", os.Getpid(), os.Getppid())
|
||
|
// time.Sleep(time.Second * 5)
|
||
|
// }
|
||
|
//}
|
||
|
|
||
|
func main() {
|
||
|
env.Setup()
|
||
|
|
||
|
switch env.String("PMT_CURRENT_FUNCTION") {
|
||
|
case "start":
|
||
|
case "stop":
|
||
|
case "shell":
|
||
|
case "list":
|
||
|
default:
|
||
|
runCli()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func runCli() {
|
||
|
cmd.New("pm").
|
||
|
Name("pm").
|
||
|
Description("description").
|
||
|
|
||
|
// start 命令
|
||
|
Command("start", "Start a program in daemon").
|
||
|
Argument("[names:...string]", "file/name/id").
|
||
|
Option("-w, --watch <watch:boolean>", "Watches folder changes").
|
||
|
Option("-c, --cwd <cwd:string>", "Sets working directory "+cmd.Yellow("Sets working directory")+" Sets working directory "+cmd.Yellow("Sets working directory")+" Sets working directory "+cmd.Yellow(" Sets working directory")+" Sets working directory "+cmd.Yellow("Sets working directory")+" Sets working directory "+cmd.Yellow("Sets working directory")+" End ...").
|
||
|
Option("-n, --name", "Sets program name").
|
||
|
Option("-e, --env", "Sets current environment name").
|
||
|
Option("-i, --interpreter", "Sets interpreter name").
|
||
|
Action(func(c *cmd.Command, m map[string]any, a ...any) error {
|
||
|
if len(a) != 1 {
|
||
|
return c.ShowHelp()
|
||
|
}
|
||
|
|
||
|
var apps []*db.App
|
||
|
scripts := a[0].([]string)
|
||
|
for _, script := range scripts {
|
||
|
loads, err := db.ParseInput(script)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
apps = append(apps, loads...)
|
||
|
}
|
||
|
|
||
|
if len(apps) == 0 {
|
||
|
fmt.Println("No app found")
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
for _, app := range apps {
|
||
|
if app.Status == db.StatusRunning {
|
||
|
fmt.Println(cmd.Yellow(app.Name), cmd.Green("running"))
|
||
|
continue
|
||
|
}
|
||
|
if app.ID == 0 {
|
||
|
if err := db.SaveApp(app); err != nil {
|
||
|
fmt.Println(cmd.Yellow(app.Name), cmd.Red("failed for save"))
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
if err := runStart(app.ID); err != nil {
|
||
|
fmt.Println(cmd.Yellow(app.Name), cmd.Red("failed"))
|
||
|
fmt.Println(" ", err.Error())
|
||
|
}
|
||
|
}
|
||
|
fmt.Println("over")
|
||
|
return nil
|
||
|
}).
|
||
|
|
||
|
// stop 命令
|
||
|
Command("stop", "Stops a program").
|
||
|
Argument("<names:...string>", "file/name/id").
|
||
|
Action(func(c *cmd.Command, m map[string]any, a ...any) error {
|
||
|
fmt.Println("停止程序")
|
||
|
fmt.Println(a...)
|
||
|
return nil
|
||
|
}).
|
||
|
|
||
|
// 执行程序
|
||
|
Run()
|
||
|
}
|
||
|
|
||
|
func runStart(id uint) error {
|
||
|
proc := subProcess(
|
||
|
[]string{os.Args[0], "-id", strconv.Itoa(int(id))},
|
||
|
[]string{"PMT_CURRENT_FUNCTION=start"},
|
||
|
)
|
||
|
return proc.Wait()
|
||
|
}
|
||
|
|
||
|
func subProcess(args []string, env []string) *exec.Cmd {
|
||
|
cmd := exec.Command(args[0], args[1:]...)
|
||
|
cmd.Env = append(os.Environ(), env...)
|
||
|
cmd.Stdin = os.Stdin
|
||
|
cmd.Stdout = os.Stdout
|
||
|
cmd.Stderr = os.Stderr
|
||
|
err := cmd.Start()
|
||
|
if err != nil {
|
||
|
fmt.Fprintf(os.Stderr, "[-] Error: %s\n", err)
|
||
|
}
|
||
|
return cmd
|
||
|
}
|
||
|
|
||
|
// 移除不需要的参数
|
||
|
func strip(slice []string, remove string) []string {
|
||
|
for i := 0; i < len(slice); {
|
||
|
if slice[i] == remove {
|
||
|
if i != len(slice)-1 {
|
||
|
slice = append(slice[:i], slice[i+1:]...)
|
||
|
} else {
|
||
|
slice = slice[:i]
|
||
|
}
|
||
|
} else {
|
||
|
i++
|
||
|
}
|
||
|
}
|
||
|
return slice
|
||
|
}
|