Files
EdgeNode/cmd/edge-node/main.go

102 lines
2.0 KiB
Go
Raw Normal View History

2020-07-21 11:18:47 +08:00
package main
import (
2020-09-09 18:53:53 +08:00
"fmt"
"github.com/TeaOSLab/EdgeNode/internal/apps"
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
2020-07-21 11:18:47 +08:00
"github.com/TeaOSLab/EdgeNode/internal/nodes"
2020-10-28 11:19:06 +08:00
"github.com/iwind/TeaGo/Tea"
2020-07-21 11:18:47 +08:00
_ "github.com/iwind/TeaGo/bootstrap"
2021-01-12 10:56:30 +08:00
"github.com/iwind/TeaGo/lists"
2020-10-28 11:19:06 +08:00
"github.com/iwind/TeaGo/types"
"io/ioutil"
2021-01-12 10:56:30 +08:00
"log"
"net"
"os"
2021-01-12 10:56:30 +08:00
"os/exec"
2020-10-28 11:19:06 +08:00
"syscall"
2021-01-12 10:56:30 +08:00
"time"
2020-07-21 11:18:47 +08:00
)
func main() {
2020-09-09 18:53:53 +08:00
app := apps.NewAppCmd().
Version(teaconst.Version).
Product(teaconst.ProductName).
2021-01-12 10:56:30 +08:00
Usage(teaconst.ProcessName + " [-v|start|stop|restart|quit|test|daemon]")
2020-09-09 18:53:53 +08:00
app.On("test", func() {
err := nodes.NewNode().Test()
if err != nil {
_, _ = os.Stderr.WriteString(err.Error())
}
})
2021-01-12 10:56:30 +08:00
app.On("daemon", func() {
path := os.TempDir() + "/edge-node.sock"
isDebug := lists.ContainsString(os.Args, "debug")
isDebug = true
for {
conn, err := net.DialTimeout("unix", path, 1*time.Second)
if err != nil {
if isDebug {
log.Println("[DAEMON]starting ...")
}
// 尝试启动
err = func() error {
exe, err := os.Executable()
if err != nil {
return err
}
cmd := exec.Command(exe)
err = cmd.Start()
if err != nil {
return err
}
err = cmd.Wait()
if err != nil {
return err
}
return nil
}()
if err != nil {
if isDebug {
log.Println("[DAEMON]", err)
}
time.Sleep(1 * time.Second)
} else {
time.Sleep(5 * time.Second)
}
} else {
_ = conn.Close()
time.Sleep(5 * time.Second)
}
}
})
2020-10-28 11:19:06 +08:00
app.On("quit", func() {
pidFile := Tea.Root + "/bin/pid"
data, err := ioutil.ReadFile(pidFile)
if err != nil {
fmt.Println("[ERROR]quit failed: " + err.Error())
return
}
pid := types.Int(string(data))
if pid == 0 {
fmt.Println("[ERROR]quit failed: pid=0")
return
}
process, err := os.FindProcess(pid)
if err != nil {
return
}
if process != nil {
_ = process.Signal(syscall.SIGQUIT)
}
})
2020-09-09 18:53:53 +08:00
app.Run(func() {
node := nodes.NewNode()
node.Start()
})
2020-07-21 11:18:47 +08:00
}