Browse Source

优化upgrade.service服务代码

niujiuru 21 hours ago
parent
commit
6272376ac8
3 changed files with 87 additions and 61 deletions
  1. 19 61
      upgrade.service/upgrade.go
  2. 65 0
      upgrade.service/upgrade_ftp.go
  3. 3 0
      upgrade.service/upgrade_http.go

+ 19 - 61
upgrade.service/upgrade.go

@@ -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

+ 65 - 0
upgrade.service/upgrade_ftp.go

@@ -0,0 +1,65 @@
+package main
+
+import (
+	"context"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"os"
+	"rtu_linux_services/servicelib"
+	"strings"
+	"time"
+
+	"hnyfkj.com.cn/rtu/linux/utils/ftpclient"
+)
+
+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
+}
+
+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)
+}

+ 3 - 0
upgrade.service/upgrade_http.go

@@ -0,0 +1,3 @@
+// Todo: HTTP/HTTPS升级功能暂未实现,后续支持需要时添加
+
+package main