支持多平台linux-amd64 linux-arm64 win
This commit is contained in:
@@ -7,14 +7,11 @@ import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"sentinel/pkg/device"
|
||||
"sentinel/pkg/log"
|
||||
"sentinel/pkg/net"
|
||||
"strconv"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -60,20 +57,14 @@ func RunUpdate(deviceID string, version int) error {
|
||||
return err
|
||||
}
|
||||
selfDir := filepath.Dir(selfPath)
|
||||
targetExe := filepath.Join(selfDir, "main.exe") // Windows 固定名,可根据实际改
|
||||
|
||||
starter := newMainProgramStarter()
|
||||
targetExe := filepath.Join(selfDir, starter.GetMainName())
|
||||
|
||||
// 2. 对比版本号,没有新版本则直接启动原程序
|
||||
if info.Version <= version {
|
||||
fmt.Println("[updater] 暂未发现新版本,启动原程序")
|
||||
cmd := exec.Command(targetExe)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
if runtime.GOOS == "windows" {
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||
CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
|
||||
}
|
||||
}
|
||||
if err := cmd.Start(); err != nil {
|
||||
if err := starter.Start(targetExe); err != nil {
|
||||
return err
|
||||
}
|
||||
os.Exit(0)
|
||||
@@ -131,19 +122,11 @@ func RunUpdate(deviceID string, version int) error {
|
||||
}
|
||||
|
||||
// 6. 启动主程序,同时完全退出自己
|
||||
cmd := exec.Command(targetExe)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
if runtime.GOOS == "windows" {
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||
CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
|
||||
}
|
||||
}
|
||||
if err := cmd.Start(); err != nil {
|
||||
if err := starter.Start(targetExe); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Printf("[updater] 更新完成,新程序已启动 (pid=%d),退出更新程序\n", cmd.Process.Pid)
|
||||
fmt.Printf("[updater] 更新完成,新程序已启动,退出更新程序")
|
||||
os.Exit(0)
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package main
|
||||
|
||||
import "sentinel/pkg/platform"
|
||||
|
||||
func newMainProgramStarter() platform.MainProgramStarter {
|
||||
return &mainProgramStarter{}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
//go:build linux
|
||||
// +build linux
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
type mainProgramStarter struct{}
|
||||
|
||||
func (s *mainProgramStarter) GetMainName() string {
|
||||
return "main"
|
||||
}
|
||||
|
||||
func (s *mainProgramStarter) Start(targetExe string) error {
|
||||
if err := os.Chmod(targetExe, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
cmd := exec.Command(targetExe)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
|
||||
// Linux 下:先保持最简单,保证能跑
|
||||
return cmd.Start()
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
//go:build windows
|
||||
// +build windows
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
type mainProgramStarter struct{}
|
||||
|
||||
func (s *mainProgramStarter) GetMainName() string {
|
||||
return "main.exe"
|
||||
}
|
||||
|
||||
func (s *mainProgramStarter) Start(targetExe string) error {
|
||||
cmd := exec.Command(targetExe)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
|
||||
// Windows:新进程组,脱离 Ctrl+C / 父进程
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||
CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
|
||||
}
|
||||
|
||||
return cmd.Start()
|
||||
}
|
||||
Reference in New Issue
Block a user