diff --git a/cmd/edge-node/main.go b/cmd/edge-node/main.go index a12bd45..908957d 100644 --- a/cmd/edge-node/main.go +++ b/cmd/edge-node/main.go @@ -7,22 +7,17 @@ import ( "github.com/TeaOSLab/EdgeNode/internal/nodes" "github.com/iwind/TeaGo/Tea" _ "github.com/iwind/TeaGo/bootstrap" - "github.com/iwind/TeaGo/lists" "github.com/iwind/TeaGo/types" "io/ioutil" - "log" - "net" "os" - "os/exec" "syscall" - "time" ) func main() { app := apps.NewAppCmd(). Version(teaconst.Version). Product(teaconst.ProductName). - Usage(teaconst.ProcessName + " [-v|start|stop|restart|quit|test|daemon]") + Usage(teaconst.ProcessName + " [-v|start|stop|restart|quit|test|service|daemon]") app.On("test", func() { err := nodes.NewNode().Test() @@ -31,47 +26,14 @@ func main() { } }) 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) - } + nodes.NewNode().Daemon() + }) + app.On("service", func() { + err := nodes.NewNode().InstallSystemService() + if err != nil { + fmt.Println("[ERROR]install failed: " + err.Error()) } + fmt.Println("done") }) app.On("quit", func() { pidFile := Tea.Root + "/bin/pid" diff --git a/internal/nodes/node.go b/internal/nodes/node.go index 1346b2a..3a3dcd8 100644 --- a/internal/nodes/node.go +++ b/internal/nodes/node.go @@ -10,16 +10,20 @@ import ( "github.com/TeaOSLab/EdgeNode/internal/apps" "github.com/TeaOSLab/EdgeNode/internal/caches" "github.com/TeaOSLab/EdgeNode/internal/configs" + teaconst "github.com/TeaOSLab/EdgeNode/internal/const" "github.com/TeaOSLab/EdgeNode/internal/events" "github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/rpc" "github.com/TeaOSLab/EdgeNode/internal/utils" "github.com/go-yaml/yaml" "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/lists" "github.com/iwind/TeaGo/logs" "io/ioutil" + "log" "net" "os" + "os/exec" "os/signal" "runtime" "syscall" @@ -135,6 +139,68 @@ func (this *Node) Start() { select {} } +// 实现守护进程 +func (this *Node) Daemon() { + 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) + } + } +} + +// 安装系统服务 +func (this *Node) InstallSystemService() error { + shortName := teaconst.SystemdServiceName + + exe, err := os.Executable() + if err != nil { + return err + } + + manager := utils.NewServiceManager(shortName, teaconst.ProductName) + err = manager.Install(exe, []string{}) + if err != nil { + return err + } + return nil +} + // 处理信号 func (this *Node) listenSignals() { signals := make(chan os.Signal) diff --git a/internal/utils/service.go b/internal/utils/service.go index c5f7436..8da9146 100644 --- a/internal/utils/service.go +++ b/internal/utils/service.go @@ -53,7 +53,7 @@ func (this *ServiceManager) setup() { }) } -//记录普通日志 +// 记录普通日志 func (this *ServiceManager) Log(msg string) { this.setup() if this.logger == nil {