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"
|
2020-10-27 12:33:34 +08:00
|
|
|
"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
|
|
|
|
2020-10-27 12:33:34 +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
|
|
|
}
|