支持多平台linux-amd64 linux-arm64 win

This commit is contained in:
BBIT-Kai
2026-01-04 11:44:10 +08:00
parent 7b669ffbd0
commit 209d087fa5
24 changed files with 227 additions and 49 deletions
@@ -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
}
+7
View File
@@ -0,0 +1,7 @@
package main
import "sentinel/pkg/platform"
func newMainProgramStarter() platform.MainProgramStarter {
return &mainProgramStarter{}
}
+27
View File
@@ -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()
}
+29
View File
@@ -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()
}