|
|
@@ -2,8 +2,7 @@ package main
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
- "encoding/hex"
|
|
|
- "encoding/json"
|
|
|
+ "errors"
|
|
|
"fmt"
|
|
|
"os"
|
|
|
"os/exec"
|
|
|
@@ -15,7 +14,6 @@ import (
|
|
|
|
|
|
"hnyfkj.com.cn/rtu/linux/baseapp"
|
|
|
"hnyfkj.com.cn/rtu/linux/netmgrd"
|
|
|
- "hnyfkj.com.cn/rtu/linux/utils/ftpclient"
|
|
|
)
|
|
|
|
|
|
type serviceUpgradeConfig struct {
|
|
|
@@ -201,8 +199,8 @@ func (p *program) upgradeService(service serviceUpgradeConfig) (string, string,
|
|
|
}
|
|
|
|
|
|
type upgradeInfo struct {
|
|
|
- Version string `json:"version"`
|
|
|
- SHA256 string `json:"sha256"`
|
|
|
+ Version string `json:"version"` //升级包版本号
|
|
|
+ SHA256 string `json:"sha256"` //升级包校检值
|
|
|
}
|
|
|
|
|
|
// 获取远程升级信息,返回版本号和升级包SHA256校检值
|
|
|
@@ -220,46 +218,6 @@ func getUpgradeInfo(ctx context.Context, rawURL string, timeout time.Duration) (
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func getFtpUpgradeInfo(ctx context.Context, u *servicelib.UpgradeURL, timeout time.Duration) (upgradeInfo, error) {
|
|
|
- localFile, err := ftpclient.DownloadFileFromFtp(ctx, u.Host, u.User, u.Pass, u.Path, timeout)
|
|
|
- if err != nil {
|
|
|
- return upgradeInfo{}, err
|
|
|
- }
|
|
|
-
|
|
|
- defer os.Remove(localFile)
|
|
|
-
|
|
|
- data, err := os.ReadFile(localFile)
|
|
|
- if err != nil {
|
|
|
- return upgradeInfo{}, err
|
|
|
- }
|
|
|
-
|
|
|
- var info upgradeInfo
|
|
|
- if err := json.Unmarshal(data, &info); err != nil {
|
|
|
- return upgradeInfo{}, err
|
|
|
- }
|
|
|
-
|
|
|
- info.Version = strings.TrimSpace(info.Version)
|
|
|
- info.SHA256 = strings.TrimSpace(info.SHA256)
|
|
|
-
|
|
|
- if info.Version == "" {
|
|
|
- return upgradeInfo{}, fmt.Errorf("版本号为空")
|
|
|
- }
|
|
|
-
|
|
|
- if info.SHA256 == "" {
|
|
|
- return upgradeInfo{}, fmt.Errorf("校验值为空")
|
|
|
- }
|
|
|
-
|
|
|
- if len(info.SHA256) != 64 {
|
|
|
- return upgradeInfo{}, fmt.Errorf("校验值长度错误")
|
|
|
- }
|
|
|
-
|
|
|
- if _, err := hex.DecodeString(info.SHA256); err != nil {
|
|
|
- return upgradeInfo{}, fmt.Errorf("校验值格式错误")
|
|
|
- }
|
|
|
-
|
|
|
- return info, nil
|
|
|
-}
|
|
|
-
|
|
|
// 下载升级包.tar.gz文件,下载完成后存入 localFile
|
|
|
func downloadUpgradePackage(ctx context.Context, rawURL string, localFile string, timeout time.Duration) error {
|
|
|
u, err := servicelib.ParseUpgradeURL(rawURL)
|
|
|
@@ -275,17 +233,6 @@ func downloadUpgradePackage(ctx context.Context, rawURL string, localFile string
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func downloadFtpUpgradePackage(ctx context.Context, u *servicelib.UpgradeURL, localFile string, timeout time.Duration) error {
|
|
|
- file, err := ftpclient.DownloadFileFromFtp(ctx, u.Host, u.User, u.Pass, u.Path, timeout)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- defer os.Remove(file)
|
|
|
-
|
|
|
- return os.Rename(file, localFile)
|
|
|
-}
|
|
|
-
|
|
|
// 获取当前软链接指向的版本目录,返回: a、b、c 之一
|
|
|
func getCurrentVersionDir(installPath string, serviceName string) (string, error) {
|
|
|
currentLink := filepath.Join(installPath, serviceName)
|
|
|
@@ -343,6 +290,10 @@ func installPackage(pkg string, targetDir string, service serviceUpgradeConfig)
|
|
|
return fmt.Errorf("检查%s服务程序失败: %w", service.Name, err)
|
|
|
}
|
|
|
|
|
|
+ if err := os.RemoveAll(targetDir); err != nil {
|
|
|
+ return fmt.Errorf("清理%s版本目录失败: %w", service.Name, err)
|
|
|
+ }
|
|
|
+
|
|
|
if err := os.MkdirAll(targetDir, 0755); err != nil {
|
|
|
return fmt.Errorf("创建%s版本目录失败: %w", service.Name, err)
|
|
|
}
|
|
|
@@ -431,12 +382,19 @@ func switchServiceVersion(serviceName string, installPath string, targetName str
|
|
|
}
|
|
|
|
|
|
if err := exec.Command("systemctl", "start", service).Run(); err != nil {
|
|
|
- startErr := err
|
|
|
+ startErr := fmt.Errorf("新版本启动未成功: %w", err)
|
|
|
|
|
|
- if err := os.Symlink(currentTarget, tempLink); err == nil {
|
|
|
- if err := os.Rename(tempLink, currentLink); err == nil {
|
|
|
- _ = exec.Command("systemctl", "start", service).Run()
|
|
|
- }
|
|
|
+ if err := os.Symlink(currentTarget, tempLink); err != nil {
|
|
|
+ return errors.Join(startErr, fmt.Errorf("创建回滚链接失败: %w", err))
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := os.Rename(tempLink, currentLink); err != nil {
|
|
|
+ _ = os.Remove(tempLink)
|
|
|
+ return errors.Join(startErr, fmt.Errorf("切换回滚链接失败: %w", err))
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := exec.Command("systemctl", "start", service).Run(); err != nil {
|
|
|
+ return errors.Join(startErr, fmt.Errorf("启动回滚版本失败: %w", err))
|
|
|
}
|
|
|
|
|
|
return startErr
|